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 不提供这种语法是相当不幸的。
Angular 的 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 会强制所有这些我不想做的额外标记,而这在 Knockout 中要容易得多?但后来 jmagnusson 的回答中的 hitautodestruct 的评论开始让我想知道:在单独的标签上使用 ng-repeat-start 和 ng-repeat-end 会生成什么?
使用ng-repeat-start 和ng-repeat-end 的更简洁的方式
在对 hitautodestruct 的断言进行调查后,将 ng-repeat-end 添加到单独的标签上正是我在大多数情况下不想要做的,因为它会生成完全无用的元素:在这种情况下,@ 987654336@ 里面什么都没有的项目。 Bootstrap 3 的分页列表设置了列表项的样式,因此看起来您没有生成任何多余的项,但是当您检查生成的 html 时,它们就在那里。
幸运的是,您不需要做太多的事情来获得更简洁的解决方案和更短的 html:只需将 ng-repeat-end 声明放在具有 @ 的同一个 html 标记上987654338@.
<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 中关于 Angular 的这个问题的 cmets 后,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?根据angular documentation,到
...重复一系列元素,而不仅仅是一个父元素...
说够了,举几个例子吧!
很公平;这个 jsbin 将介绍五个示例,说明在同一标签上使用和不使用 ng-repeat-end 时会发生什么。