Ich verwende derzeit diesen Code, um eine Liste zu rendern:
<ul ng-cloak>
<div ng-repeat="n in list">
<li><a href="{{ n[1] }}">{{ n[0] }}</a></li>
<li class="divider"></i>
</div>
<li>Additional item</li>
</ul>
Das <div>
Element verursacht jedoch in einigen Browsern einige sehr geringfügige Renderfehler. Ich würde gerne wissen, ob es eine Möglichkeit gibt, die ng-Wiederholung ohne den div-Container oder eine alternative Methode durchzuführen, um den gleichen Effekt zu erzielen.
javascript
css
html
angularjs
nehz
quelle
quelle
htmlAppend
Direktive verwenden?Antworten:
Wie Andy Joslin sagte, arbeiteten sie an kommentarbasierten ng-Wiederholungen, aber anscheinend gab es zu viele Browserprobleme . Glücklicherweise bietet AngularJS 1.2 eine integrierte Unterstützung für das Wiederholen, ohne untergeordnete Elemente mit den neuen Anweisungen
ng-repeat-start
und hinzuzufügenng-repeat-end
.Hier ist ein kleines Beispiel für das Hinzufügen einer Bootstrap-Paginierung :
Ein vollständiges Arbeitsbeispiel finden Sie hier .
John Lindquist hat auch ein Video-Tutorial dazu auf seiner ausgezeichneten Egghead.io-Seite .
quelle
ng-repeat-start/end
aber dies ist ein verwirrendes Beispiel und der falsche Anwendungsfall dafür. Hierng-repeat
sollte ein Standard verwendet werden, da Ihr Codeli
für jedes Element ein zusätzliches Leerzeichen darstellt. Sie sollten das wahrscheinlich in Ihrem Beitrag erwähnen.ng-repeat-start
. Ich werde diedivider
HTML-Klasse zu meiner Antwort hinzufügen , um klarer zu sein.ng-repeat-start
undng-repeat-end
sind ein wenig verwirrend. Die Angular-Dokumentation hilft: https://docs.angularjs.org/api/ng/directive/ngRepeat#special-repeat-start-and-end-pointsKnockoutJS 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 derforeach
Bindungsdokumentation erläutert . http://knockoutjs.com/documentation/foreach-binding.htmlWie das Beispiel für die Knockout-Dokumentation zeigt, können Sie Ihre Bindung wie folgt in KnockoutJS schreiben:
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.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
.Dies bietet 3 Vorteile:
ng-repeat
nicht generiert, was Ihnen den gleichen Vorteil bietet, den Ihnen die containerlose Bindung von Knockout in dieser Hinsicht bietetAber 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
undng-repeat-end
erzielen. Stattdessen können wir, wenn wir noch einmal jmagnussons Beispiel gabeln, einfach gehen:Also wann
ng-repeat-start
und verwendenng-repeat-end
? Gemäß der eckigen Dokumentation zuGenug 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.http://jsbin.com/eXaPibI/1/
quelle
ng-repeat-start
und Anhängenng-repeat-end
an dasselbe Element völlig nutzlos, wenn Sie die Standardeinstellung von Angular verwendenng-repeat
und damit fertig sind.ng-repeat
finden oder eine Alternative zur Verwendung von OP zu findenng-repeat
, die dasdiv
Artefakt im HTML beseitigt . Ihre Antwort tut dies nicht, da es keine Möglichkeit gibt, sie für die beidenli
Elemente in der Frage zu verwenden. Wenn ich hier falsch liege, geben Sie bitte ein Beispiel-Markup an, das den OP-Code anpasst, um dasdiv
Element zu entfernen .li
ist das Extra, dasli
Sie in Ihrem jsbin sehen.ngRepeat reicht möglicherweise nicht aus, Sie können dies jedoch mit einer benutzerdefinierten Direktive kombinieren. Sie können die Aufgabe des Hinzufügens von Teilerelementen zum Code delegieren, wenn Ihnen ein wenig jQuery nichts ausmacht.
Solch eine einfache Direktive benötigt nicht wirklich einen Attributwert, bietet Ihnen jedoch viele Möglichkeiten, wie das bedingte Hinzufügen eines Teilers nach Index, Länge usw. oder etwas völlig anderem.
quelle
Ich hatte kürzlich das gleiche Problem, da ich eine beliebige Sammlung von Bereichen und Bildern wiederholen musste - ein Element um sie herum war keine Option - es gibt eine einfache Lösung, erstellen Sie jedoch eine "Null" -Richtlinie:
Sie können dann eine Wiederholung für dieses Element verwenden, wobei element.url auf die Vorlage für dieses Element verweist:
Dadurch werden beliebig viele verschiedene Vorlagen ohne Container wiederholt
Hinweis: hmm, ich hätte schwören können, dass dies das di-null-Element beim Rendern entfernt hat, aber wenn ich es erneut überprüfe, werden meine Layoutprobleme nicht gelöst ... Kurioser und Kurioser ...
quelle
replace
ist seit 2.0 veraltet.Es gibt eine Einschränkung der Kommentaranweisung, aber ngRepeat unterstützt sie nicht (da ein Element zum Wiederholen benötigt wird).
Ich glaube, ich habe gesehen, wie das eckige Team sagte, sie würden an Kommentaren und Wiederholungen arbeiten, aber ich bin mir nicht sicher. Sie sollten ein Problem dafür im Repo öffnen. http://github.com/angular/angular.js
quelle
Es gibt keine magische Methode für Angular, um dies zu tun. In Ihrem Fall können Sie dies tun, um gültiges HTML zu erhalten, wenn Sie Bootstrap verwenden. Dann erhalten Sie den gleichen Effekt wie beim Hinzufügen des li.dividers
Erstellen Sie eine Klasse:
Ändern Sie nun Ihren Code wie folgt:
quelle
für eine Lösung, die wirklich funktioniert
html
Fügen Sie eine angle.js-Direktive hinzu
für eine kurze Erklärung,
ng-repeat bindet sich an das
<remove>
Element und schleift, wie es sollte, und da wir ng-repeat-start / ng-repeat-end verwendet haben, schleift es einen HTML-Block, nicht nur ein Element.Anschließend platziert die benutzerdefinierte Direktive zum Entfernen die
<remove>
Start- und Endelemente mit<!--removed element-->
quelle
replaceWith(...)
Testergebnissen in einem Textknoten jedoch kein Kommentar. Ich habe nurelement.remove()
Werke gefunden.