8

Sono abbastanza nuovo per la programmazione Javascript e ho solo toccato AngularJS. Per valutarlo ho deciso di scrivere un'applicazione per appunti semplice. Il modello è davvero semplice, un elenco di note in cui ogni nota ha un'etichetta, un testo e un elenco di tag. Tuttavia mi sono imbattuto in problemi nel passaggio di dati tra ambiti isolati di direttive nidificate.Ordine di chiamata della funzione di collegamento in direttive angularjs nidificate e ripetute

Ho tre direttive, note, note e tagger (che definiscono nuovi elementi con gli stessi nomi). Ognuno di loro utilizza un ambito isolato.

La direttiva notes usa ng-repeat per "rendere" ciascuna delle sue note con l'elemento note.

La direttiva note utilizza l'elemento tagger per "rendere" l'elenco di tag.

La direttiva note definisce l'ambito: {getNote: "&", ...} per passare un'istanza di nota dall'elenco di note al controller di nota/direttiva. La funzione getNote (index) viene chiamata nella funzione di collegamento della direttiva note. Funziona bene!

La direttiva tagger definisce l'ambito: {getTags: "&", ...} per passare un elenco di tag per una determinata nota al controller/direttiva tagger. La funzione getTags viene chiamata nella funzione di collegamento della direttiva tagger. Questo non funziona!

Come ho capito, il problema è che le funzioni di collegamento delle direttive sono chiamate in un ordine incoerente. Debug dell'applicazione mostra che le funzioni di collegamento vengono chiamate nel seguente ordine:

funzione
  1. collegamento nelle note direttiva (aggiungendo la funzione getNote al campo di applicazione note) funzione di collegamento

  2. nella direttiva tagger della prima nota (chiamando getTags dell'area nota genitore) funzione

  3. funzione di collegamento nella prima direttiva nota (aggiungendo i getTags al campo di applicazione) (chiamando getNote nel campo di applicazione note madri) funzione di collegamento

  4. nella direttiva tagger della seconda nota (chiamando getTags dell'area nota genitore funzione)

  5. funzione di collegamento nella seconda direttiva nota (aggiungendo i getTags per il campo di applicazione) (chiamando getNote nel genitore note portata)

Questo non funziona in quanto a # 2 il campo di applicazione della prima nota non ha ancora una funzione getTags.

Un esempio semplicistico può essere trovato in Plunker.

Quindi, la mia domanda si riduce a: cosa determina l'ordine in cui le funzioni di collegamento vengono chiamate in direttive nidificate.

(Ho risolto il problema utilizzando $ watch su getTags nella direttiva tagger ...)

riguarda

+0

[Guida pratica per precollegamento, postlink e metodi di controllo delle direttive angolari] (http://www.undefinednull.com/2014/07/07/practical-guide-to-prelink-postlink-and-controller-methods -delle-angolari-direttive /) è un articolo abbastanza completo su come usare il pre-link/post-link sulle direttive annidate –

risposta

17

Citando Josh D. Miller che aveva gentilmente risposto ad una domanda simile che ho avuto:

"Solo un paio di note tecniche Supponiamo di avere questa marcatura:.

<div directive1> 
    <div directive2> 
    <!-- ... --> 
    </div> 
</div> 

ora AngularJS creerà le direttive eseguendo funzioni direttive in un certo ordine:

direttiva1: compilare

direttiva2: compilare

direttiva1: Controller

direttiva1: pre-link

direttiva2: Controller

direttiva2: pre-link

direttiva2: post-Link

direttiva1: post-Link

Di default una funzione di diritto "link" è un post-link, in modo da funzione di collegamento del vostro direttiva1 esterno non lo farà eseguire fino a quando è stata eseguita la funzione di collegamento della direttiva interna interna. Ecco perché diciamo che è sicuro manipolare DOM nel post-link. "

+3

Ciao @Tahir, grazie per aver risposto.Forse sono stupido, ma, come si è visto nella mia plunker, ho: ma funzione di collegamento chiamando ordine è , , ... mentre , , ci si aspetterebbe secondo la tua risposta ... Scusate se sono stupido :-) – positively4th

+0

Tenderei a pensare che sia un mix di cose perché non solo ng-repeat viene eseguito con priorità = 1000 (e avete nidato ng- ripetere le dichiarazioni). Ma non sembra che tu usi l'opzione di transizione, quindi non sono molto sicuro sull'ordine di compilazione delle tue direttive incorporate. – Taye

0

Su un singolo elemento dell'ordine delle funzioni di collegamento è determinato dall'ordine delle funzioni di compilazione che a sua volta è ordinata secondo il priority proprietà dell'oggetto definizione direttiva.

Fonte

: http://docs.angularjs.org/guide/directive

su diversi elementi con inclusione: le direttive interne sono valutate prima direttive esterne. Motivo: natura di transclusione.

Su più elementi con fratelli: eseguiti in ordine dall'alto al basso. Motivo: analisi della logica di $ compilazione.

+0

Ciao @ basarat, grazie per aver dedicato del tempo a rispondere! Tuttavia non riesco ad applicare la risposta alla mia domanda. Non ho direttive multiple sullo stesso elemento, non utilizzo la transclusione, i miei elementi di nota sono ovviamente fratelli, ma non sono sicuro di capire cosa intendi, forse è ovvio ma non riesco ancora a capire l'ordine di chiamata del link funzioni nel mio esempio Plunker. Reagrds – positively4th

Problemi correlati