KnockoutJS containerlose Bindungssyntax
Bitte nehmen Sie sich eine Sekunde Zeit: KnockoutJS bietet eine äußerst bequeme Möglichkeit, eine containerlose Bindungssyntax für die foreach
Bindung zu verwenden, wie in Anmerkung 4 der foreach
Bindungsdokumentation erläutert .
http://knockoutjs.com/documentation/foreach-binding.html
Wie das Beispiel für die Knockout-Dokumentation zeigt, können Sie Ihre Bindung wie folgt in KnockoutJS schreiben:
<ul>
<li class="header">Header item</li>
<!-- ko foreach: myItems -->
<li>Item <span data-bind="text: $data"></span></li>
<!-- /ko -->
</ul>
Ich finde es eher bedauerlich, dass AngularJS diese Art von Syntax nicht anbietet.
Winkel ng-repeat-start
undng-repeat-end
Bei der AngularJS-Methode zur Lösung von ng-repeat
Problemen sind die Beispiele, auf die ich stoße, vom Typ jmagnusson, der in seiner (hilfreichen) Antwort veröffentlicht wurde.
<li ng-repeat-start="page in [1,2,3,4,5]"><a href="#">{{page}}</a></li>
<li ng-repeat-end></li>
Mein ursprünglicher Gedanke beim Sehen dieser Syntax ist: wirklich? Warum erzwingt Angular all dieses zusätzliche Markup, mit dem ich nichts zu tun haben möchte und das in Knockout so viel einfacher ist? Aber dann begann mich der Kommentar von hitautodestruct in jmagnussons Antwort zu fragen: Was wird mit ng-repeat-start und ng-repeat-end auf separaten Tags generiert?
Eine sauberere Art zu verwenden ng-repeat-start
undng-repeat-end
Bei der Untersuchung der Behauptung von hitautodestruct ist das Hinzufügen ng-repeat-end
zu einem separaten Tag genau das, was ich in den meisten Fällen nicht tun möchte, da es völlig nutzlose Elemente erzeugt: in diesem Fall <li>
Elemente, in denen sich nichts befindet. Die paginierte Liste von Bootstrap 3 formatiert die Listenelemente so, dass es so aussieht, als hätten Sie keine überflüssigen Elemente generiert. Wenn Sie jedoch das generierte HTML überprüfen, sind sie vorhanden.
Glücklicherweise müssen Sie nicht viel tun, um eine sauberere Lösung und eine kürzere Menge an HTML zu erhalten: Setzen Sie die ng-repeat-end
Deklaration einfach auf dasselbe HTML-Tag, das das enthältng-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>
Dies bietet 3 Vorteile:
- weniger HTML-Tags zu schreiben
- nutzlose, leere Tags werden von Angular nicht generiert
- Wenn das zu wiederholende Array leer ist, wird das Tag mit
ng-repeat
nicht generiert, was Ihnen den gleichen Vorteil bietet, den Ihnen die containerlose Bindung von Knockout in dieser Hinsicht bietet
Aber es gibt immer noch einen saubereren Weg
Nachdem Sie die Kommentare in github zu diesem Problem für Angular unter https://github.com/angular/angular.js/issues/1891 weiter gelesen haben , müssen
Sie nicht dieselben Vorteile verwenden ng-repeat-start
und ng-repeat-end
erzielen. Stattdessen können wir, wenn wir noch einmal jmagnussons Beispiel gabeln, einfach gehen:
<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>
Also wann ng-repeat-start
und verwenden ng-repeat-end
? Gemäß der eckigen Dokumentation zu
... eine Reihe von Elementen anstelle von nur einem übergeordneten Element wiederholen ...
Genug geredet, zeigen Sie einige Beispiele!
Meinetwegen; Dieser JSBIN führt fünf Beispiele durch, was passiert, wenn Sie es tun und wenn Sie es nicht ng-repeat-end
für dasselbe Tag verwenden.