Che bella domanda! Mi piacerebbe piace sentire ciò che gli altri hanno da dire, ma qui ci sono le linee guida che uso.
La premessa per l'alta quota: l'ambito è usato come "colla" che usiamo per comunicare tra il controllore principale, la direttiva e il modello di direttiva.
Ambito genitore: scope: false
quindi nessun nuovo scopo
Non lo uso molto spesso, ma come ha detto @MarkRajcok, se la direttiva non accede a nessuna variabile dell'ambito (e ovviamente non ne imposta alcuna!), Per quanto mi riguarda va bene. Questo è utile anche per le direttive sui minori che sono solo utilizzate nel contesto della direttiva padre (anche se ci sono sempre delle eccezioni) e che non hanno un modello. Fondamentalmente qualsiasi cosa con un modello non appartiene alla condivisione di un ambito, perché stai esponendo intrinsecamente tale ambito per l'accesso e la manipolazione (ma sono sicuro che ci sono eccezioni a questa regola).
Ad esempio, ho recentemente creato una direttiva che disegna un'immagine vettoriale (statica) usando una libreria SVG che sto scrivendo. Ha $observe
due attributi ( width
e height
) e li usa nei suoi calcoli, ma non imposta né legge alcuna variabile di ambito e non ha un modello. Questo è un buon caso d'uso per non creare un altro ambito; non ne abbiamo bisogno, quindi perché preoccuparsi?
Ma in un'altra direttiva SVG, tuttavia, avevo bisogno di un set di dati da utilizzare e dovevo anche memorizzare un po 'di stato. In questo caso, l'utilizzo dell'ambito padre sarebbe irresponsabile (di nuovo, in generale). Quindi invece...
Ambito del bambino: scope: true
Le direttive con ambito figlio sono sensibili al contesto e intendono interagire con l'ambito corrente.
Ovviamente, un vantaggio chiave di questo rispetto a un ambito isolato è che l'utente è libero di usare l'interpolazione su tutti gli attributi che desidera; ad es. l'uso di class="item-type-{{item.type}}"
una direttiva con un ambito isolato non funzionerà di default, ma funziona bene su uno con un ambito figlio perché tutto ciò che è interpolato può ancora trovarsi di default nell'ambito genitore. Inoltre, la direttiva stessa può valutare in modo sicuro attributi ed espressioni nel contesto del proprio ambito di applicazione senza preoccuparsi dell'inquinamento o del danno al genitore.
Ad esempio, una descrizione comandi è qualcosa che viene appena aggiunto; un ambito isolato non funzionerebbe (per impostazione predefinita, vedi sotto) perché si prevede che qui utilizzeremo altre direttive o attributi interpolati. La descrizione comandi è solo un miglioramento. Ma il tooltip deve anche impostare alcune cose sull'ambito da usare con una sub-direttiva e / o modello e ovviamente per gestire il proprio stato, quindi sarebbe davvero un male usare l'ambito genitore. O lo stiamo inquinando o danneggiandolo, e nemmeno lo è bueno.
Mi ritrovo a utilizzare gli ambiti figlio più spesso di quelli isolati o parent.
Isolare l'ambito: scope: {}
Questo è per componenti riutilizzabili. :-)
Ma seriamente, penso ai "componenti riutilizzabili" come ai "componenti autonomi". L'intento è che devono essere usati per uno scopo specifico, quindi combinarli con altre direttive o aggiungere altri attributi interpolati al nodo DOM intrinsecamente non ha senso.
Per essere più specifici, tutto ciò che è necessario per questa funzionalità autonoma viene fornito attraverso attributi specifici valutati nel contesto dell'ambito padre; sono stringhe unidirezionali ('@'), espressioni unidirezionali ('&') o associazioni di variabili bidirezionali ('=').
Sui componenti autonomi, non ha senso applicare altre direttive o attributi perché esiste da solo. Il suo stile è regolato dal proprio modello (se necessario) e può essere escluso il contenuto appropriato (se necessario). È autonomo, quindi lo inseriamo in un ambito isolato anche per dire: "Non scherzare con questo. Ti sto dando un'API definita attraverso questi pochi attributi".
Una buona pratica è quella di escludere il maggior numero possibile di elementi basati su template dal collegamento direttiva e dalle funzioni del controller. Ciò fornisce un altro punto di configurazione "simile ad API": l'utente della direttiva può semplicemente sostituire il modello! Le funzionalità sono rimaste tutte uguali e la sua API interna non è mai stata toccata, ma possiamo fare confusione con lo stile e l'implementazione del DOM di cui abbiamo bisogno. ui / bootstrap è un ottimo esempio di come farlo bene perché Peter e Pawel sono fantastici.
Gli ambiti di isolamento sono ottimi anche per la trasclusione. Prendi schede; non sono solo l'intera funzionalità, ma tutto ciò che è al suo interno può essere valutato liberamente dall'ambito padre lasciando le schede (e i riquadri) a fare ciò che vogliono. Le schede hanno chiaramente il loro stato , che appartiene all'ambito (per interagire con il modello), ma quello stato non ha nulla a che fare con il contesto in cui è stato usato - è interamente interno a ciò che rende una direttiva tab una direttiva tab. Inoltre, non ha molto senso usare altre direttive con le schede. Sono schede - e abbiamo già questa funzionalità!
Circondalo con più funzionalità o escludi più funzionalità, ma la direttiva è quella che è già.
Detto questo, dovrei notare che ci sono modi per aggirare alcune delle limitazioni (ovvero le caratteristiche) di un ambito isolato, come ha suggerito @ProLoser nella sua risposta. Ad esempio, nella sezione ambito figlio, ho menzionato l'interpolazione sugli attributi non direttivi che si rompono quando si utilizza un ambito isolato (per impostazione predefinita). Ma l'utente potrebbe, ad esempio, semplicemente utilizzare class="item-type-{{$parent.item.type}}"
e funzionerebbe ancora una volta. Quindi, se c'è una ragione convincente per usare un ambito isolato su un ambito figlio ma sei preoccupato per alcune di queste limitazioni, sappi che puoi aggirarle virtualmente tutte, se necessario.
Sommario
Le direttive senza un nuovo ambito sono di sola lettura; sono completamente fidati (cioè interni all'app) e non toccano jack. Le direttive con un ambito figlio aggiungono funzionalità, ma non sono le uniche funzionalità. Infine, gli scopi di isolamento sono per le direttive che rappresentano l'intero obiettivo; sono autonomi, quindi va bene (e la maggior parte "corretta") lasciarli andare canaglia.
Volevo far emergere i miei pensieri iniziali, ma mentre penso a più cose, aggiornerò questo. Ma santa merda - questo è lungo per una risposta SO ...
PS: Totalmente tangenziale, ma dal momento che stiamo parlando di scopi, preferisco dire "prototipico" mentre altri preferiscono "prototipo", che sembra essere più accurato ma non si adatta affatto alla lingua. :-)