AngularJS: ngInclude vs dyrektywa


93

Nie bardzo rozumiem, kiedy należy użyć dyrektywy, a kiedy bardziej odpowiednie byłoby użycie nginclude. Weźmy ten przykład: mam częściowy, password-and-confirm-input-fields.htmlczyli html do wprowadzania i potwierdzania hasła. Używam tego zarówno pod stroną rejestracji, jak i stroną zmiany hasła. Każda z tych dwóch stron ma kontroler, część HTML nie ma dedykowanego kontrolera.

Powinienem używać dyrektywy czy ngIncludedo tego?


Za każdym razem stosowałbym dyrektywę, ale jestem ciekawy, co powiedzieliby bardziej doświadczeni ludzie z Angular.
Austin Mullins,

1
Jeśli jest to naprawdę niezależny komponent, prawdopodobnie powinien mieć powiązany z nim własny kontroler. IMO,
użyłbym

4
Jeśli jest potrzebny jakikolwiek kod js dla tej części, użyj dyrektywy. Jeśli to tylko HTML, użyj ngInclude.
Daniel Beck,

Odpowiedzi:


122

Wszystko zależy od tego, czego chcesz od fragmentu kodu. Osobiście, jeśli kod nie ma żadnej logiki lub nawet nie potrzebuje kontrolera, to idę z ngInclude. Zazwyczaj umieszczam duże, bardziej „statyczne” fragmenty HTML, których nie chcę zaśmiecać widoku. (tj. powiedzmy, że duża tabela, której dane i tak pochodzą z kontrolera nadrzędnego. Czystsze jest mieć <div ng-include="bigtable.html" />niż wszystkie te wiersze zaśmiecające Widok)

Jeśli istnieje logika, manipulacja DOM lub potrzebujesz możliwości dostosowania (inaczej renderowania) w różnych instancjach, to directivessą lepszym wyborem (na początku są zniechęcające, ale są bardzo potężne, daj temu czas) .

ngInclude

Czasami zauważysz, ngInclude'sże wpływa na to ich wygląd zewnętrzny $scope/ interface. Na przykład duży / skomplikowany repeater. Z tego powodu te 2 interfejsy są ze sobą powiązane. Jeśli coś w głównej części się $scopezmieni, musisz zmienić / zmienić swoją logikę w ramach dołączonej części.

Dyrektywy

Z drugiej strony dyrektywy mogą mieć wyraźne zakresy / kontrolery / itp. Więc jeśli myślisz o scenariuszu, w którym musiałbyś ponownie użyć czegoś wiele razy, możesz zobaczyć, jak podłączenie własnego zakresu ułatwiłoby życie i zmniejszyło mylące.

Poza tym za każdym razem, gdy będziesz w ogóle wchodzić w interakcję z DOM, powinieneś użyć dyrektywy. To sprawia, że ​​jest lepszy do testowania i oddziela te akcje od kontrolera / usługi / itp., Co jest czymś, czego chcesz!

Wskazówka: jeśli zależy Ci na IE8, pamiętaj, aby nie używać ograniczenia: „E”! Są sposoby na obejście tego, ale są denerwujące. Po prostu ułatw sobie życie i trzymaj się atrybutu / itp.<div my-directive />

Komponenty [aktualizacja 01.03.2016]

Dodany w Angular 1.5, jest zasadniczo opakowaniem .directve(). Komponent powinien być używany przez większość czasu. Usuwa wiele standardowych kodów dyrektywy, domyślnie ustawiając takie rzeczy jak restrict: 'E', scope : {}, bindToController: true. Gorąco polecam używanie ich do prawie wszystkiego w twojej aplikacji, aby móc łatwiej przejść na Angular2.

Podsumowując:

Powinieneś tworzyć komponenty i dyrektywy przez większość czasu.

  • Bardziej rozszerzalny
  • Możesz szablon i mieć swój plik na zewnątrz (np. NgInclude)
  • Możesz użyć zakresu nadrzędnego lub własnego zakresu izolowanego w ramach dyrektywy.
  • Lepsze ponowne wykorzystanie w całej aplikacji


Aktualizacja 3/1/2016

Teraz, gdy Angular 2 powoli się kończy i znamy ogólny format (oczywiście nadal będą pewne zmiany tu i tam), po prostu chcieliśmy dodać, jak ważne jest to zrobić components(czasami dyrektywy, jeśli chcesz, aby były ograniczone: '' E 'na przykład).

Komponenty są bardzo podobne do Angular 2 @Component. W ten sposób hermetyzujemy logikę i html w tym samym obszarze.


Upewnij się, że zawarłeś jak najwięcej rzeczy w komponentach, dzięki temu przejście na Angular 2 będzie o wiele łatwiejsze! (Jeśli zdecydujesz się na przejście)

Oto fajny artykuł opisujący ten proces migracji za pomocą directives(bardzo podobny, jeśli zamierzasz używać komponentów oczywiście): http://angular-tips.com/blog/2015/09/migrating-directives-to-angular-2/


5
Zgadzam się z tą odpowiedzią. Krzywa uczenia się dla dyrektyw jest stroma, ale naprawdę opłaca się, gdy ją zdobędziesz.
Jazzy

@mcpDESIGNS, jeden przypadek, który być może nie pasuje idealnie do tej odpowiedzi (przynajmniej nie do dwóch pierwszych akapitów). Jeśli mam element nav-częściowy z własnym kontrolerem i użyję go tylko raz (w pliku index.html), to prawdopodobnie powinno to być częściowe, a nie dyrektywa, ponieważ jest używane tylko raz (jest to jakby osobna aplikacja w tym sensie, że nie jest częścią ngview), nawet jeśli ma swoją własną logikę. Lub?
EricC

To wciąż jest mylące ... możesz także określić kontroler podczas korzystania z ngInclude, spójrz na to: stackoverflow.com/questions/13811948/ ...
Marwen Trabelsi

1
Oczywiście, ale zawsze jest w jakiś sposób całkowicie połączony z kontrolerem nadrzędnym. Gdzie dyrektywa może utworzyć w sobie kontroler na czas ładowania szablonu. Może być zupełnie osobno (jeśli chcesz)
Mark Pieszak - Trilon.io

1
Najlepsze, co możesz zrobić, to przenieść tę koncepcję na fabrykę lub coś w tym rodzaju, w ten sposób możesz po prostu nazwać to z poziomu linkfunkcji i voila! Ale bez wątpienia fajnie by było upiec w dyrektywach :( @Arwin
Mark Pieszak - Trilon.io
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.