KnockoutJS无容器绑定语法
请耐心等待:KnockoutJS提供了一种非常方便的选择,即使用无容器绑定语法进行foreach
绑定,如foreach
绑定文档的注释4所述。
http://knockoutjs.com/documentation/foreach-binding.html
如Knockout文档示例所示,您可以像这样在KnockoutJS中编写绑定:
<ul>
<li class="header">Header item</li>
<!-- ko foreach: myItems -->
<li>Item <span data-bind="text: $data"></span></li>
<!-- /ko -->
</ul>
我觉得很不幸,AngularJS不提供这种语法。
角的ng-repeat-start
和ng-repeat-end
在解决ng-repeat
问题的AngularJS方式中,我遇到的示例属于jmagnusson类型(在其有用的答案中)。
<li ng-repeat-start="page in [1,2,3,4,5]"><a href="#">{{page}}</a></li>
<li ng-repeat-end></li>
看到这种语法时,我的最初想法是:真的吗?为什么Angular会强制执行所有我不想使用的额外标记,而在淘汰赛中却如此简单呢?但是后来在jmagnusson的答案中hitautodestruct的评论让我感到疑惑:分别标记上的ng-repeat-start和ng-repeat-end生成了什么?
更清洁的使用方式ng-repeat-start
和ng-repeat-end
在研究hitautodestruct的断言后,在大多数情况下,ng-repeat-end
我都不希望添加到单独的标签上,因为它会生成完全无用的元素:在这种情况下,<li>
其中没有任何物品。Bootstrap 3的分页列表为列表项设置样式,以便看起来您没有生成任何多余的项目,但是当您检查生成的html时,它们就在那里。
幸运的是,您不需要做更多的事情就可以获得更干净的解决方案和更短的html:只需将ng-repeat-end
声明放在具有的同一html标记上ng-repeat-start
。
<ul class="pagination">
<li>
<a href="#">«</a>
</li>
<li ng-repeat-start="page in [1,2,3,4,5]" ng-repeat-end><a href="#"></a></li>
<li>
<a href="#">»</a>
</li>
</ul>
这具有3个优点:
- 更少的HTML标签来写
- Angular不会生成无用的空标签
- 当要重复的数组为空时,
ng-repeat
不会生成带有的标签,为您提供相同的优势Knockout的无容器绑定在这方面为您提供了帮助
但是还有一种更清洁的方法
进一步审查关于这个问题的角度,在GitHub上的意见后https://github.com/angular/angular.js/issues/1891,
你不需要使用ng-repeat-start
,并ng-repeat-end
达到相同的优点。相反,再次派生jmagnusson的示例,我们可以去:
<ul class="pagination">
<li>
<a href="#">«</a>
</li>
<li ng-repeat="page in [1,2,3,4,5,6]"><a href="#">{{page}}</a></li>
<li>
<a href="#">»</a>
</li>
</ul>
那么什么时候使用ng-repeat-start
和ng-repeat-end
?根据角度文件,
...重复一系列元素,而不只是一个父元素...
聊够了,展示一些例子!
很公平; 该jsbin演示了五个示例,分别说明了您ng-repeat-end
在同一标签上使用和不使用时会发生什么。