KnockoutJS 无容器绑定语法
请耐心等待:KnockoutJS 提供了一个非常方便的选项,即使用无容器绑定语法进行绑定,如绑定文档
foreach
的注释 4 中所述。http://knockoutjs.com/documentation/foreach-binding.htmlforeach
正如 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
在 AngularJS 解决ng-repeat
问题的方法中,我遇到的示例属于 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
到单独的标签正是我不想做的,因为它会生成完全无用的元素:在这种情况下,<li>
项目中什么都没有。Bootstrap 3 的分页列表设置了列表项的样式,因此看起来您没有生成任何多余的项,但是当您检查生成的 html 时,它们就在那里。
幸运的是,您不需要做太多事情来获得更简洁的解决方案和更短的 html:只需将ng-repeat-end
声明放在具有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 中关于 Angular 的这个问题的评论后,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
andng-repeat-end
呢?根据角度文档,到
...重复一系列元素,而不仅仅是一个父元素...
废话不多说,举几个例子吧!
很公平; 这个 jsbin 将通过五个示例来说明当你ng-repeat-end
在同一个标签上使用和不使用时会发生什么。