AngularJS: ngInclude vs direttiva


93

Non capisco bene quando utilizzare una direttiva e quando sarebbe più appropriato utilizzare nginclude. Prendiamo questo esempio: ho un parziale password-and-confirm-input-fields.html, cioè l'html per inserire e confermare una password. Lo uso sia nella pagina di registrazione che nella pagina di modifica della password. Queste due pagine hanno un controller ciascuna, l'html parziale non ha un controller dedicato.

Devo usare direttiva o ngIncludeper questo?


Vorrei seguire una direttiva ogni volta, ma sono curioso di cosa direbbero le persone Angular più esperte.
Austin Mullins,

1
Se è veramente un componente indipendente, probabilmente dovrebbe essere associato al proprio controller. IMO,
userei

4
Se è necessario del codice js per quel parziale, utilizzare una direttiva. Se è solo HTML, usa ngInclude.
Daniel Beck,

Risposte:


122

Tutto dipende da cosa vuoi dal tuo frammento di codice. Personalmente, se il codice non ha alcuna logica o non ha nemmeno bisogno di un controller, allora vado con ngInclude. In genere metto frammenti html più grandi e "statici" che non voglio che ingombrino la vista qui. (cioè: diciamo una grande tabella i cui dati provengono comunque dal controllore genitore. È più pulito da avere<div ng-include="bigtable.html" /> rispetto a tutte quelle linee che ingombrano la vista)

Se c'è logica, manipolazione DOM, o hai bisogno che sia personalizzabile (ovvero renderizza in modo diverso) in diversi casi in cui viene utilizzato, allora directivessono la scelta migliore (sono scoraggianti all'inizio, ma sono molto potenti, dagli tempo) .

ngInclude

A volte vedrai ngInclude'sche sono influenzati dal loro esterno $scope/ interface. Come un ripetitore grande / complicato diciamo. Queste 2 interfacce sono collegate insieme per questo motivo. Se qualcosa nelle principali $scopemodifiche, è necessario modificare / cambiare la logica all'interno del parziale incluso.

Direttive

D'altra parte, le direttive possono avere ambiti / controller / ecc. Espliciti Quindi se stai pensando a uno scenario in cui dovresti riutilizzare qualcosa più volte, puoi vedere come avere il proprio ambito connesso renderebbe la vita più facile e meno confuso.

Inoltre, ogni volta che interagirai con il DOM, dovresti usare una direttiva. Questo lo rende migliore per i test e separa queste azioni da un controller / servizio / ecc., Che è qualcosa che vuoi!

Suggerimento: assicurati di non usare limitare: 'E' se ti interessa IE8! Ci sono modi per aggirare questo problema, ma sono fastidiosi. Rendi la vita più facile e mantieni l'attributo / ecc.<div my-directive />

Componenti [aggiornamento 1/3/2016]

Aggiunto in Angular 1.5, è essenzialmente un wrapper .directve(). Il componente dovrebbe essere utilizzato la maggior parte del tempo. Rimuove un sacco di codice direttiva boilerplate, impostando per impostazione predefinita cose come restrict: 'E', scope : {}, bindToController: true. Consiglio vivamente di utilizzarli per quasi tutto nella tua app, in modo da poter passare più facilmente ad Angular2.

In conclusione:

Dovresti creare componenti e direttive per la maggior parte del tempo.

  • Più estensibile
  • Puoi modellare e avere il tuo file esternamente (come ngInclude)
  • È possibile scegliere di utilizzare l'ambito padre o il proprio ambito isolato all'interno della direttiva.
  • Riutilizzo migliore in tutta l'applicazione


Aggiornamento 1/3/2016

Ora che Angular 2 si sta lentamente concludendo e conosciamo il formato generale (ovviamente ci saranno ancora alcuni cambiamenti qua e là) volevo solo aggiungere quanto sia importante fare components(a volte le direttive se hai bisogno che siano restrittive: ' E 'per esempio).

I componenti sono molto simili a quelli di Angular 2 @Component. In questo modo stiamo incapsulando logica e html nella stessa area.


Assicurati di incapsulare quante più cose possibile nei componenti, renderà la transizione ad Angular 2 molto più semplice! (Se scegli di effettuare la transizione)

Ecco un bell'articolo che descrive questo processo di migrazione utilizzando directives(molto simile se si utilizzassero componenti ovviamente): http://angular-tips.com/blog/2015/09/migrating-directives-to-angular-2/


5
Sono d'accordo con questa risposta. La curva di apprendimento per le direttive è ripida, ma paga davvero una volta ottenuta.
Jazzy

@mcpDESIGNS, un caso che forse non si adatta perfettamente a questa risposta (almeno non i due primi paragrafi). Se ho un parziale di navigazione, con il proprio controller, e lo userò solo una volta (nel file index.html), allora probabilmente dovrebbe essere un parziale e non una direttiva poiché viene utilizzato solo una volta (è una specie di app separata nel senso che non è inclusa come parte di ngview), anche se ha una sua logica. O?
EricC

Questo crea ancora confusione .. puoi anche specificare un controller quando usi ngInclude, guarda questo: stackoverflow.com/questions/13811948/…
Marwen Trabelsi

1
Certo, ma in qualche modo è sempre completamente connesso al controller principale. Dove una direttiva può creare un controller al suo interno per quando il modello viene caricato. Può essere completamente separato (se vuoi)
Mark Pieszak - Trilon.io

1
La cosa migliore che puoi fare è astrarre questo concetto in una fabbrica o qualcosa del genere, in questo modo puoi semplicemente chiamarlo dall'interno di una linkfunzione e voilà! Sarebbe stato comunque bello inserito nelle direttive, senza dubbio :( @Arwin
Mark Pieszak - Trilon.io
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.