Chcę wyświetlić dane w strukturze drzewa w aplikacji internetowej. Miałem nadzieję, że do tego zadania wykorzystam Angular.
Wygląda na to, że ng-repeat pozwoli mi na iterację przez listę węzłów, ale jak mogę wtedy zagnieżdżać, gdy głębokość danego węzła wzrośnie?
Wypróbowałem następujący kod , ale automatyczne uciekanie kodu HTML uniemożliwia to działanie. Ponadto końcowy znacznik ul jest w złym miejscu.
Jestem prawie pewien, że podchodzę do tego problemu całkowicie w niewłaściwy sposób.
Jakieś pomysły?
Odpowiedzi:
Spójrz na to skrzypce
Oryginał: http://jsfiddle.net/brendanowen/uXbn6/8/
Zaktualizowano: http://jsfiddle.net/animaxf/uXbn6/4779/
To powinno dać ci dobry pomysł, jak wyświetlić
tree like structure
using angular. To trochę rekurencja w html!źródło
Jeśli używasz Bootstrap CSS ...
Stworzyłem prostą kontrolę drzewa (dyrektywę) wielokrotnego użytku dla AngularJS na podstawie listy "nav" Bootstrap. Dodałem dodatkowe wcięcia, ikony i animację. Do konfiguracji używane są atrybuty HTML.
Nie używa rekursji.
Nazwałem to angular-bootstrap-nav-tree (chwytliwa nazwa, nie sądzisz?)
Jest przykładem tutaj , a źródło jest tutaj .
źródło
Przy tworzeniu czegoś takiego najlepszym rozwiązaniem jest dyrektywa rekurencyjna. Jednak kiedy tworzysz taką dyrektywę, okazuje się, że AngularJS wpada w nieskończoną pętlę.
Rozwiązaniem tego problemu jest zezwolenie dyrektywie na usunięcie elementu podczas zdarzenia kompilacji oraz ręczne skompilowanie i dodanie ich do zdarzeń łącza.
Dowiedziałem się o tym w tym wątku i wyekstrahowałem tę funkcję w usłudze .
Dzięki tej usłudze możesz łatwo utworzyć dyrektywę drzewa (lub inne dyrektywy rekurencyjne). Oto przykład dyrektywy drzewa:
Zobacz ten Plunker, aby zobaczyć demo. Najbardziej podoba mi się to rozwiązanie, ponieważ:
Aktualizacja: Dodano obsługę niestandardowych funkcji łączenia.
źródło
angular-ui-tree wydaje mi się dobrą robotą
źródło
Oto przykład z użyciem dyrektywy rekurencyjnej: http://jsfiddle.net/n8dPm/ Pobrano z https://groups.google.com/forum/#!topic/angular/vswXTes_FtM
źródło
Ten wydaje się nieco bardziej kompletny: https://github.com/dump247/angular.tree
źródło
Kolejny przykład oparty na oryginalnym źródle , z już wdrożoną strukturą przykładowego drzewa (łatwiejsze do zobaczenia, jak to działa IMO) i filtrem do przeszukiwania drzewa:
JSFiddle
źródło
Tyle świetnych rozwiązań, ale wydaje mi się, że wszystkie one w jakiś sposób zbytnio komplikują sprawę.
Chciałem stworzyć coś, co odtworzyłoby prostotę awnsera @Marka Lagendijka, ale bez definiowania szablonu w dyrektywie, ale raczej pozwoliłoby "użytkownikowi" stworzyć szablon w HTML ...
Z pomysłami zaczerpniętymi z https://github.com/stackfull/angular-tree-repeat etc ... Skończyło się na stworzeniu projektu: https://github.com/dotJEM/angular-tree
Co pozwala ci zbudować drzewo, takie jak:
Co dla mnie jest czystsze niż konieczność tworzenia wielu dyrektyw dla drzew o różnej strukturze .... W istocie wywołanie powyższego drzewa jest trochę fałszywe, wybiera znacznie więcej z narzędzia @ ganaraj w zakresie „szablonów rekurencyjnych”, ale pozwala nam zdefiniuj szablon, w którym potrzebujemy drzewa.
(możesz to zrobić za pomocą szablonu opartego na tagu skryptu, ale nadal musi on znajdować się tuż poza faktycznym węzłem drzewa i nadal wydaje się trochę fuj ...)
Zostawiłem tutaj kolejny wybór ...
źródło
Możesz spróbować z próbką Angular-Tree-DnD z Angular-Ui-Tree, ale edytowałem, zgodność z tabelą, siatką, listą.
źródło
Na podstawie @ganaraj „s odpowiedź , a @ dnc253” s odpowiedź , po prostu popełnił prosty «Dyrektywa» dla struktury drzewa mające doborem, dodawanie, usuwanie i edycję funkcję.
Jsfiddle: http://jsfiddle.net/yoshiokatsuneo/9dzsms7y/
HTML:
JavaScript:
źródło
Tak, to zdecydowanie możliwe. Pytanie tutaj prawdopodobnie zakłada Angular 1.x, ale dla przyszłych odniesień dołączam przykład Angular 2:
Koncepcyjnie wszystko, co musisz zrobić, to utworzyć szablon rekurencyjny:
Następnie wiążesz obiekt drzewa z szablonem i pozwalasz Angularowi działać jego magia. Ta koncepcja ma oczywiście zastosowanie również do Angular 1.x.
Oto pełny przykład: http://www.syntaxsuccess.com/viewarticle/recursive-treeview-in-angular-2.0
źródło
Możesz do tego użyć wtryskiwacza rekurencyjnego kątowego: https://github.com/knyga/angular-recursion-injector
Umożliwia zagnieżdżanie nieograniczonej głębokości z kondycjonowaniem. Dokonuje ponownej kompilacji tylko w razie potrzeby i kompiluje tylko właściwe elementy. Żadnej 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
Gdy struktura drzewa jest duża, Angular (do 1.4.x) bardzo wolno renderuje szablon rekurencyjny. Po wypróbowaniu kilku z tych sugestii utworzyłem prosty ciąg znaków HTML i użyłem
ng-bind-html
go do wyświetlenia. Oczywiście nie jest to sposób na używanie funkcji AngularaPoniżej pokazano funkcję rekurencyjną w wersji podstawowej (z minimalnym kodem HTML):
W szablonie potrzebuje tylko tej jednej linii:
Pomija to całe wiązanie danych Angulara i po prostu wyświetla kod HTML w ułamku czasu rekursywnych metod szablonu.
Z taką strukturą menu (częściowe drzewo plików systemu plików Linux):
Wynik staje się:
źródło
Nieskomplikowany.
kod kontrolera:
źródło