Istnieje kilka popularnych rekurencyjnych wytycznych dotyczących kątowych pytań i odpowiedzi, które sprowadzają się do jednego z następujących rozwiązań:
- ręcznie przyrostowo „kompiluj” HTML na podstawie stanu zakresu środowiska wykonawczego
- w ogóle nie używaj dyrektywy, ale szablon <script>, który odnosi się do siebie
Pierwszy ma problem polegający na tym, że nie możesz usunąć wcześniej skompilowanego kodu, chyba że w sposób zrozumiały zarządzasz procesem ręcznej kompilacji. Drugie podejście polega na tym, że ... nie jest dyrektywą i nie wykorzystuje swoich potężnych możliwości, ale co pilniejsze, nie można jej sparametryzować w taki sam sposób, jak dyrektywę; jest po prostu związany z nową instancją kontrolera.
Grałem z ręcznym wykonaniem funkcji angular.bootstrap
lub @compile()
w funkcji linku, ale to pozostawia mi problem z ręcznym śledzeniem elementów do usunięcia i dodania.
Czy istnieje dobry sposób na sparametryzowany wzorzec rekurencyjny, który zarządza dodawaniem / usuwaniem elementów w celu odzwierciedlenia stanu środowiska uruchomieniowego? To znaczy drzewo z przyciskiem dodawania / usuwania węzła i pewnym polem wejściowym, którego wartość jest przekazywana w dół do węzłów potomnych węzła. Być może połączenie drugiego podejścia z powiązanymi zakresami (ale nie mam pojęcia, jak to zrobić)?
źródło
compile: function(element) { return RecursionHelper.compile(element); }
zcompile: RecursionHelper.compile
.Ręczne dodawanie elementów i ich kompilacja to zdecydowanie idealne podejście. Jeśli użyjesz ng-repeat, nie będziesz musiał ręcznie usuwać elementów.
Demo: http://jsfiddle.net/KNM4q/113/
źródło
Nie wiem na pewno, czy to rozwiązanie znajduje się w jednym z przykładów, które podłączyłeś, czy w tej samej podstawowej koncepcji, ale potrzebowałem rekurencyjnej dyrektywy i znalazłem świetne, łatwe rozwiązanie .
Powinieneś utworzyć
recursive
dyrektywę, a następnie owinąć ją wokół elementu, który wykonuje wywołanie rekurencyjne.źródło
[$compile:multidir] Multiple directives [tree, tree] asking for new/isolated scope on: <recursive tree="tree">
compiledContents(scope,function(clone) { iElement.append(clone); });
:. W przeciwnym razie kontroler „wymaga” nie jest poprawnie obsługiwany, a błąd:Error: [$compile:ctreq] Controller 'tree', required by directive 'subTreeDirective', can't be found!
przyczyna.Od wersji Angular 1.5.x nie są już wymagane żadne lewy, możliwe stało się: Koniec z brudną pracą!
To odkrycie było produktem mojego poszukiwania lepszego / czystszego rozwiązania rekurencyjnej dyrektywy. Można go znaleźć tutaj https://jsfiddle.net/cattails27/5j5au76c/ . Obsługuje do tej pory 1.3.x.
źródło
Po dłuższym użyciu kilku obejść wielokrotnie wracałem do tego problemu.
Rozwiązanie nie usatysfakcjonuje mnie, ponieważ działa w przypadku dyrektyw, które mogą wstrzykiwać usługę, ale nie działa w przypadku anonimowych fragmentów szablonów.
Podobnie rozwiązania, które zależą od konkretnej struktury szablonu poprzez manipulację DOM w dyrektywie, są zbyt specyficzne i kruche.
Mam, jak sądzę, ogólne rozwiązanie, które zawiera rekursję jako własną dyrektywę, która w minimalnym stopniu koliduje z innymi dyrektywami i może być używana anonimowo.
Poniżej znajduje się demonstracja, z którą możesz się również pobawić na stronie plnkr: http://plnkr.co/edit/MSiwnDFD81HAOXWvQWIM
źródło
Teraz, gdy Angular 2.0 jest już dostępny w wersji zapoznawczej, myślę, że można dodać do miksu alternatywę Angular 2.0. Przynajmniej przyniesie to ludziom później:
Kluczową koncepcją jest zbudowanie szablonu rekurencyjnego z własnym odniesieniem:
Następnie powiąż obiekt drzewa z szablonem i obserwuj, jak rekurencja zajmie się resztą. Oto pełny przykład: http://www.syntaxsuccess.com/viewarticle/recursive-treeview-in-angular-2.0
źródło
Istnieje naprawdę bardzo proste obejście tego problemu, które w ogóle nie wymaga dyrektyw.
Cóż, w tym sensie może nie jest to nawet rozwiązanie pierwotnego problemu, jeśli założymy, że potrzebujesz dyrektyw, ale JEST to rozwiązanie, jeśli chcesz rekurencyjną strukturę GUI ze sparametryzowanymi podstrukturami GUI. Co jest prawdopodobnie tym, czego chcesz.
Rozwiązanie opiera się na użyciu ng-kontrolera, ng-init i ng-include. Po prostu zrób to w następujący sposób, zakładając, że twój kontroler nazywa się „MyController”, twój szablon znajduje się w myTemplate.html i że masz na sterowniku funkcję inicjującą o nazwie init, która przyjmuje argumenty A, B i C, umożliwiając sparametryzuj kontroler. Następnie rozwiązanie jest następujące:
myTemplate.htlm:
Przekonałem się, że tego rodzaju struktura może być rekurencyjna, tak jak lubisz, w zwykłym waniliowym kanciastym kształcie. Wystarczy postępować zgodnie z tym wzorcem projektowym, aby korzystać z rekurencyjnych struktur interfejsu użytkownika bez zaawansowanego majsterkowania przy kompilacji itp.
Wewnątrz kontrolera:
Jedynym minusem, jaki widzę, jest niezgrabna składnia, z którą musisz się pogodzić.
źródło
W tym celu można użyć wtryskiwacza kątowego-rekurencyjnego: https://github.com/knyga/angular-recursion-injector
Umożliwia wykonywanie nieograniczonego zagnieżdżania z uwarunkowaniem. Wykonuje rekompilację tylko w razie potrzeby i kompiluje tylko odpowiednie elementy. Brak magii w kodzie.
Jedną z rzeczy, która pozwala mu działać szybciej i prościej niż inne rozwiązania, jest przyrostek „--recursion”.
źródło
Ostatecznie stworzyłem zestaw podstawowych dyrektyw dotyczących rekurencji.
IMO Jest to o wiele bardziej podstawowe niż rozwiązanie tutaj znalezione i tak samo elastyczne, jeśli nie bardziej, więc nie jesteśmy zobowiązani do korzystania ze struktur UL / LI itp. Ale oczywiście mają one sens, jednak dyrektywy nie są tego świadome fakt...
Bardzo prosty przykład to:
Implementację „dx-start-with” i „dx-connect” można znaleźć na stronie: stronie https://github.com/dotJEM/angular-tree
Oznacza to, że nie musisz tworzyć 8 dyrektyw, jeśli potrzebujesz 8 różnych układów.
Utworzenie widoku drzewa ponad tym, w którym można dodawać lub usuwać węzły, byłoby wtedy dość proste. Jak w: http://codepen.io/anon/pen/BjXGbY?editors=1010
Od tego momentu kontroler i szablon mogą być zawinięte we własną dyrektywę, jeśli ktoś sobie tego życzy.
źródło