Es gibt einige beliebte Fragen und Antworten zu rekursiven Winkelanweisungen, die alle auf eine der folgenden Lösungen zurückzuführen sind:
- Manuelles inkrementelles 'Kompilieren' von HTML basierend auf dem Laufzeitbereichsstatus
- Verwenden Sie überhaupt keine Direktive, sondern eine <script> -Vorlage, die auf sich selbst verweist
Der erste hat das Problem, dass Sie zuvor kompilierten Code nur entfernen können, wenn Sie den manuellen Kompilierungsprozess verständlich verwalten. Der zweite Ansatz hat das Problem, ... keine Richtlinie zu sein und ihre mächtigen Fähigkeiten zu verpassen, aber dringender kann er nicht so parametrisiert werden, wie eine Richtlinie sein kann; Es ist einfach an eine neue Controller-Instanz gebunden.
Ich habe mit dem manuellen Ausführen einer angular.bootstrap
oder @compile()
in der Link-Funktion gespielt, aber das führt mich zu dem Problem, die zu entfernenden und hinzuzufügenden Elemente manuell zu verfolgen.
Gibt es eine gute Möglichkeit, ein parametrisiertes rekursives Muster zu erstellen, das das Hinzufügen / Entfernen von Elementen verwaltet, um den Laufzeitstatus widerzuspiegeln? Das heißt, ein Baum mit einer Schaltfläche zum Hinzufügen / Löschen von Knoten und einem Eingabefeld, dessen Wert an die untergeordneten Knoten eines Knotens weitergegeben wird. Vielleicht eine Kombination des zweiten Ansatzes mit verketteten Bereichen (aber ich habe keine Ahnung, wie das geht)?
quelle
compile: function(element) { return RecursionHelper.compile(element); }
mitcompile: RecursionHelper.compile
.Das manuelle Hinzufügen und Kompilieren von Elementen ist definitiv ein perfekter Ansatz. Wenn Sie ng-repeat verwenden, müssen Sie Elemente nicht manuell entfernen.
Demo: http://jsfiddle.net/KNM4q/113/
quelle
Ich weiß nicht genau, ob diese Lösung in einem der von Ihnen verlinkten Beispiele oder im selben Grundkonzept enthalten ist, aber ich brauchte eine rekursive Direktive und fand eine großartige, einfache Lösung .
Sie sollten die
recursive
Direktive erstellen und dann um das Element wickeln, das den rekursiven Aufruf ausführt.quelle
[$compile:multidir] Multiple directives [tree, tree] asking for new/isolated scope on: <recursive tree="tree">
compiledContents(scope,function(clone) { iElement.append(clone); });
internen Rückruf hinzuzufügen, z. B .: Andernfalls wird der "erforderliche" Controller nicht korrekt behandelt, und Fehler:Error: [$compile:ctreq] Controller 'tree', required by directive 'subTreeDirective', can't be found!
Ursache.Ab Angular 1.5.x sind keine Tricks mehr erforderlich. Folgendes wurde ermöglicht. Keine schmutzigen Arbeiten mehr nötig!
Diese Entdeckung war ein Nebenprodukt meiner Suche nach einer besseren / saubereren Lösung für eine rekursive Direktive. Sie finden es hier https://jsfiddle.net/cattails27/5j5au76c/ . Es unterstützt soweit 1.3.x.
quelle
Nachdem ich eine Zeit lang mehrere Problemumgehungen verwendet habe, bin ich wiederholt auf dieses Problem zurückgekommen.
Ich bin mit der Servicelösung nicht zufrieden, da sie für Anweisungen funktioniert, die den Service injizieren können, aber nicht für anonyme Vorlagenfragmente.
In ähnlicher Weise sind Lösungen, die von einer bestimmten Vorlagenstruktur durch DOM-Manipulation in der Richtlinie abhängen, zu spezifisch und spröde.
Ich glaube, es handelt sich um eine generische Lösung, die die Rekursion als eigene Direktive zusammenfasst, die alle anderen Direktiven nur minimal beeinträchtigt und anonym verwendet werden kann.
Unten finden Sie eine Demonstration, mit der Sie auch unter plnkr herumspielen können: http://plnkr.co/edit/MSiwnDFD81HAOXWvQWIM
quelle
Jetzt, da Angular 2.0 in der Vorschau erscheint, ist es meiner Meinung nach in Ordnung, dem Mix eine Angular 2.0-Alternative hinzuzufügen. Zumindest wird es den Menschen später zugute kommen:
Das Schlüsselkonzept besteht darin, eine rekursive Vorlage mit einer Selbstreferenz zu erstellen:
Anschließend binden Sie ein Baumobjekt an die Vorlage und beobachten, wie sich die Rekursion um den Rest kümmert. Hier ist ein vollständiges Beispiel: http://www.syntaxsuccess.com/viewarticle/recursive-treeview-in-angular-2.0
quelle
Hierfür gibt es eine wirklich sehr einfache Problemumgehung, für die überhaupt keine Anweisungen erforderlich sind.
In diesem Sinne ist es vielleicht nicht einmal eine Lösung des ursprünglichen Problems, wenn Sie davon ausgehen, dass Sie Anweisungen benötigen, aber es ist eine Lösung, wenn Sie eine rekursive GUI-Struktur mit parametrisierten Unterstrukturen der GUI wünschen. Welches ist wahrscheinlich, was Sie wollen.
Die Lösung basiert auf der Verwendung von ng-controller, ng-init und ng-include. Gehen Sie einfach wie folgt vor, nehmen Sie an, dass Ihr Controller "MyController" heißt, Ihre Vorlage sich in myTemplate.html befindet und dass Sie auf Ihrem Controller eine Initialisierungsfunktion namens init haben, die die Argumente A, B und C akzeptiert Parametrieren Sie Ihren Controller. Dann ist die Lösung wie folgt:
myTemplate.htlm:
Ich fand durch einfachen Zufall heraus, dass diese Art von Struktur rekursiv gemacht werden kann, wie Sie es in einfachen Vanille-Winkeln mögen. Folgen Sie einfach diesem Entwurfsmuster und Sie können rekursive UI-Strukturen ohne fortgeschrittenes Kompilieren usw. verwenden.
In Ihrem Controller:
Der einzige Nachteil, den ich sehen kann, ist die klobige Syntax, mit der Sie sich abfinden müssen.
quelle
Sie können dafür einen Winkelrekursionsinjektor verwenden: https://github.com/knyga/angular-recursion-injector
Ermöglicht das Verschachteln mit unbegrenzter Tiefe und Konditionierung. Führt nur bei Bedarf eine Neukompilierung durch und kompiliert nur die richtigen Elemente. Keine Magie im Code.
Eines der Dinge, die es ermöglichen, schneller und einfacher als die anderen Lösungen zu arbeiten, ist das Suffix "--recursion".
quelle
Am Ende habe ich eine Reihe grundlegender Anweisungen für die Rekursion erstellt.
IMO Es ist weitaus grundlegender als die hier gefundene Lösung und genauso flexibel, wenn nicht sogar flexibler, sodass wir nicht an die Verwendung von UL / LI-Strukturen usw. gebunden sind. Aber offensichtlich sind diese sinnvoll, obwohl die Richtlinien dies nicht wissen Tatsache...
Ein super einfaches Beispiel wäre:
Die Implementierung von 'dx-start-with' und 'dx-connect' finden Sie unter: https://github.com/dotJEM/angular-tree
Dies bedeutet, dass Sie keine 8 Anweisungen erstellen müssen, wenn Sie 8 verschiedene Layouts benötigen.
Es wäre dann ziemlich einfach, darüber hinaus eine Baumansicht zu erstellen, in der Sie Knoten hinzufügen oder löschen können. Wie in: http://codepen.io/anon/pen/BjXGbY?editors=1010
Von diesem Punkt an könnten der Controller und die Vorlage in eine eigene Direktive eingeschlossen werden, wenn man dies wünscht.
quelle