2013-04-17 18 views
15

Jaka jest kolejność wykonywania funkcji dyrektywy? The documentation nie wydaje się rozwiązać tego problemu.Kolejność wykonywania funkcji dyrektywy w AngularJS

Ex

  1. template/templateUrl (jest analizowany)
  2. controllerFn
  3. compileFn
  4. linkFn

Odpowiedź

Od answer poniżej: http://plnkr.co/edit/79iyKSbfxgkzk2Pivuak (plu nker pokazuje dyrektyw zagnieżdżone i rodzeństwo)

  1. Szablon jest analizowany
  2. compile() (zmiany wprowadzone w szablonie w kompilacji są rozmnażane w dół do funkcji łączących)
  3. controller()
  4. preLink()
  5. postLink()
+1

Skompiluj, kontroler, link. Nie wiem o szablonach. Zobacz także https://github.com/angular/angular.js/wiki/Ustandingstanding-Directives –

+0

@MarkRajcok, dzięki! Muszę jednak wiedzieć o wszystkich czterech. – jacob

+1

@jacob - Oto [demonstracja] (http://plnkr.co/edit/qrDMJBlnwdNlfBqEEXL2?p=preview) w kolejności wykonywania poleceń compileFn, controllerFn, preLinkFn i postLinkFn. Czy odwołujesz się do kompilacji szablonów, gdy mówisz o ocenie szablonów? – tamakisquare

Odpowiedz

4

Funkcja wstępnego łączenia: Wykonana przed połączeniem elementów podrzędnych. Nie można bezpiecznie wykonać transformacji DOM, ponieważ funkcja łączenia kompilatorów nie odnajdzie odpowiednich elementów do połączenia.

Funkcja postlinkowania: Wykonywana po powiązaniu elementów podrzędnych. To jest bezpieczny do wykonania transformacji DOM w funkcji post-linking.

Powyższy fragment pochodzi z oficjalnej dokumentacji na temat directives.

Tak więc, aby odpowiedzieć na twoje pytanie, Funkcja Postlinkowanie/Link to kiedy/gdzie możesz bezpiecznie operować na element.children().

+0

A więc: kontroler, kompilacja, wstępne łącze, szablon, post-link? – jacob

+1

@jacob - Tak w tym sensie, że "element.children()" są dostępne tylko w celu uzyskania dostępu do postLinkFn. Jednym zastrzeżeniem jest to, że twoje pytanie dotyczy kolejności wykonywania dyrektywy _functions_, a _template_, o której mówiłeś, to po prostu nie jest funkcja. – tamakisquare

+2

@jacob, nie, kompilacja przychodzi przed kontrolerem (ale zakładam, że o tym wiesz, i prawdopodobnie wpisałeś swój komentarz źle). Dodam, że w funkcji kompilacji możesz zmienić szablon. Jednak wszelkie wprowadzone tam zmiany będą dotyczyć wszystkich klonów DOM (np. Dla dyrektywy takiej jak ng-repeat, wprowadzenie zmian do 'tElement' w funkcji kompilacji wpłynie na każdą sklonowaną instancję). Podsumowując: szablon DOM ('tElement') może zostać zmieniony podczas kompilacji, a instancja DOM (' iElement') w post-link. –

8

na pokrewnym notatce, tutaj moje rozumienie rozkazu exec przez DOM.

Here is a demo (open browser JS console)

Biorąc pod uwagę ten DOM przy użyciu dyrektywy foo:

<div id="1" foo> 
    one 
    <div id="1_1" foo>one.one</div> 
    </div> 

    <div id="2" foo>two</div> 

... angularjs będzie przechodzić przez DOM - dwukrotnie - w głębokości pierwszego rzędu:

1. przebieg foo.compile()

1) kompilacja: 1

2) opracowanie: 1_1

3) sporządza: 2

2-ci wprost: foo.controller() przesuwający się w dół; bla.Link() podczas wycofywania

kontrolera: 1

kontrolera: 1_1

łącza: 1_1

łącza: 1

kontrolera 2

łącza 2

+0

Fajnie, rozwikłem twojego plunkera, aby również zalogować się do fazy preLink. http://plnkr.co/edit/79iyKSbfxgkzk2Pivuak Wygląda na to, że faza preLink dzieje się bezpośrednio po utworzeniu kontrolera – Clement

+0

perfect - krótki i słodki przykład – Lal

Powiązane problemy