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がこのタイプの構文を提供していないのはかなり残念だと思います。
Angularng-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を作成するために多くのことを行う必要はありません。宣言を、。を持つ同じ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のコンテナレスバインディングがこの点で提供するのと同じ利点があります。
しかし、まだよりクリーンな方法があります
Angularのこの問題に関するgithubのコメント(https://github.com/angular/angular.js/issues/1891)をさらに確認した後、同じ利点を使用して達成する
必要はありません。代わりに、jmagnussonの例をもう一度フォークすると、次のようになります。ng-repeat-start
ng-repeat-end
<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
か?角度のドキュメントによると、
... 1つの親要素だけでなく、一連の要素を繰り返します...
十分な話、いくつかの例を示してください!
けっこうだ; ng-repeat-end
このjsbinは、同じタグで使用する場合と使用しない場合の5つの例を示しています。