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?

EricC
źródło
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/

Mark Pieszak - Trilon.io
źródło
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