Pisząc dyrektywę Angular, można użyć dowolnej z następujących funkcji do manipulowania zachowaniem DOM, treścią i wyglądem elementu, na którym deklarowana jest dyrektywa:
- skompilować
- kontroler
- link wstępny
- link do strony
Wydaje się, że istnieje pewne zamieszanie, co do której funkcji należy użyć. To pytanie obejmuje:
Podstawy dyrektywy
- Jak zadeklarować różne funkcje?
- Jaka jest różnica między szablonem źródłowym a szablonem wystąpienia ?
- W jakiej kolejności są wykonywane funkcje dyrektywy?
- Co jeszcze dzieje się między tymi wywołaniami funkcji?
Funkcja natury, czynów i nie
Powiązane pytania:
- Dyrektywa: link vs kompilacja vs kontroler .
- Różnica między funkcjami „kontrolera”, „łącza” i „kompilacji” podczas definiowania dyrektywy angular.js .
- Jaka jest różnica między funkcją kompilacji a linkiem w angularjs .
- Różnica między elementem przed kompilacją a post-kompilacją w dyrektywach AngularJS? .
- Dyrektywa Angular JS - Szablon, kompilacja czy link? .
- post link vs pre link w dyrektywach Angular js .
angularjs
angularjs-directive
Izhaki
źródło
źródło
Odpowiedzi:
W jakiej kolejności są wykonywane funkcje dyrektywy?
Dla jednej dyrektywy
Na podstawie poniższego upadać , należy rozważyć następujące znaczniki HTML:
Z następującą deklaracją dyrektywy:
Dane wyjściowe konsoli będą:
Widzimy, że
compile
najpierw jest wykonywany, potemcontroller
, a potempre-link
ostatnipost-link
.Dla zagnieżdżonych dyrektyw
Oryginalny znacznik HTML często składa się z zagnieżdżonych elementów, z których każdy ma własną dyrektywę. Tak jak w poniższym znaczniku (patrz paczka ):
Dane wyjściowe konsoli będą wyglądać następująco:
Możemy tu wyróżnić dwie fazy - fazę kompilacji i fazę łącza .
Faza kompilacji
Gdy DOM jest załadowany, Angular rozpoczyna fazę kompilacji, w której przechodzi od znaczników od góry do dołu i wywołuje
compile
wszystkie dyrektywy. Graficznie możemy to wyrazić w następujący sposób:Być może warto wspomnieć, że na tym etapie szablony, które otrzymuje funkcja kompilacji, to szablony źródłowe (nie szablony instancji).
Faza łącza
Instancje DOM są często po prostu wynikiem renderowania szablonu źródłowego do DOM, ale mogą być tworzone
ng-repeat
lub wprowadzane w locie.Za każdym razem, gdy nowa instancja elementu z dyrektywą jest renderowana do DOM, rozpoczyna się faza połączenia.
W tej fazie, Angular wzywa
controller
,pre-link
iteruje dzieci i wołapost-link
wszystkie dyrektywy, w ten sposób:źródło
Co jeszcze dzieje się między tymi wywołaniami funkcji?
Poszczególne funkcje dyrektywie są wykonywane od wewnątrz dwóch innych funkcji zwanych kątowych
$compile
(gdzie dyrektywiecompile
jest zrealizowanych) oraz wewnętrznych funkcji o nazwienodeLinkFn
(gdzie dyrektywiecontroller
,preLink
ipostLink
są wykonywane). W funkcji kątowej dzieją się różne rzeczy przed i po wywołaniu funkcji dyrektywy. Być może najbardziej zauważalna jest rekursja dziecka. Poniższa uproszczona ilustracja pokazuje kluczowe kroki w fazie kompilacji i łączenia:Aby zademonstrować te kroki, użyjmy następującego znacznika HTML:
Z następującą dyrektywą:
Skompilować
Te
compile
spojrzenia API tak:Często parametry są poprzedzone przedrostkiem,
t
aby oznaczać, że podane elementy i atrybuty to parametry szablonu źródłowego, a nie instancji.Przed wywołaniem
compile
treści zawartej w transkrypcji (jeśli taka istnieje) jest usuwana, a szablon jest stosowany do znaczników. Zatem element dostarczony docompile
funkcji będzie wyglądał następująco:Zauważ, że treść zawarta w transkrypcji nie jest ponownie wstawiana w tym momencie.
Po wywołaniu dyrektywy
.compile
Angular przejdzie wszystkie elementy potomne, w tym te, które mogły zostać właśnie wprowadzone przez dyrektywę (na przykład elementy szablonu).Tworzenie instancji
W naszym przypadku zostaną utworzone (wystąpienia) trzy wystąpienia powyższego szablonu źródłowego
ng-repeat
. Zatem następująca sekwencja zostanie wykonana trzy razy, raz na instancję.Kontroler
controller
API polega na:Wchodząc w fazę łącza, funkcja łącza zwrócona przez
$compile
ma teraz zakres.Po pierwsze, funkcja link tworzy na żądanie zasięg potomny (
scope: true
) lub zakres izolowany (scope: {...}
).Następnie wykonywany jest kontroler z zakresem elementu instancji.
Link wstępny
Te
pre-link
spojrzenia API tak:Praktycznie nic się nie dzieje między wywołaniem dyrektywy
.controller
a.preLink
funkcją. Angular nadal zapewnia zalecenia dotyczące sposobu użycia każdego z nich.Po
.preLink
wywołaniu funkcja link przejdzie przez każdy element potomny - wywołując poprawną funkcję link i dołączając do niej bieżący zakres (który służy jako zakres nadrzędny dla elementów potomnych).Link do strony
post-link
API jest podobna do tejpre-link
funkcji:Być może warto zauważyć, że po
.postLink
wywołaniu funkcji dyrektywy proces łączenia wszystkich jej elementów potomnych został zakończony, w tym wszystkich funkcji dzieci.postLink
.Oznacza to, że do czasu
.postLink
wezwania dzieci „żyją” są gotowe. To zawiera:Szablon na tym etapie będzie więc wyglądał następująco:
źródło
Jak zadeklarować różne funkcje?
Kompilacja, kontroler, link wstępny i post-link
Jeśli chcemy korzystać ze wszystkich czterech funkcji, dyrektywa będzie miała następującą postać:
Zauważ, że kompilacja zwraca obiekt zawierający zarówno funkcje pre-link, jak i post-link; w Angular lingo mówimy, że funkcja kompilacji zwraca funkcję szablonu .
Kompiluj, kontroluj i przesyłaj pocztą
Jeśli
pre-link
nie jest to konieczne, funkcja kompilacji może po prostu zwrócić funkcję post-link zamiast obiektu definicji, na przykład:Czasami chce się dodać
compile
metodę polink
zdefiniowaniu metody (post) . W tym celu można użyć:Kontroler i łącze post-link
Jeśli żadna funkcja kompilacji nie jest potrzebna, można całkowicie pominąć jej deklarację i podać funkcję post-link w ramach
link
właściwości obiektu konfiguracyjnego dyrektywy:Brak kontrolera
W dowolnym z powyższych przykładów można po prostu usunąć
controller
funkcję, jeśli nie jest potrzebna. Na przykład, jeślipost-link
potrzebna jest tylko funkcja, można użyć:źródło
Jaka jest różnica między szablonem źródłowym a szablonem wystąpienia ?
Fakt, że Angular pozwala na manipulację DOM, oznacza, że znaczniki wejściowe w procesie kompilacji czasami różnią się od danych wyjściowych. W szczególności niektóre znaczniki wejściowe mogą być klonowane kilka razy (np. Za pomocą
ng-repeat
) przed ich renderowaniem do DOM.Terminologia kątowa jest nieco niespójna, ale nadal rozróżnia dwa typy znaczników:
Poniższy znacznik pokazuje to:
Źródłowy HTML określa
który służy jako szablon źródłowy.
Ale ponieważ jest zawinięty w
ng-repeat
dyrektywę, ten szablon źródłowy zostanie sklonowany (w naszym przypadku 3 razy). Te klony są szablonami instancji, każdy pojawi się w DOM i będzie związany z odpowiednim zakresem.źródło
Funkcja kompilacji
compile
Funkcja każdej dyrektywy jest wywoływana tylko raz, gdy Angular bootstraps.Oficjalnie jest to miejsce do wykonywania (źródłowych) manipulacji szablonem, które nie wymagają powiązania zakresu ani danych.
Zasadniczo odbywa się to w celach optymalizacyjnych; rozważ następujące znaczniki:
<my-raw>
Dyrektywa wykonaniu konkretnego zestawu DOM znaczników. Możemy więc:ng-repeat
na zduplikowanie szablonu źródłowego (<my-raw>
), a następnie zmodyfikuj znaczniki każdego szablonu instancji (pozacompile
funkcją).compile
funkcji), a następnie zezwólng-repeat
na jego zduplikowanie.Jeśli w
raws
kolekcji znajduje się 1000 przedmiotów , druga opcja może być szybsza niż poprzednia.Zrobić:
Nie rób
źródło
Funkcja kontrolera
controller
Funkcja każdej dyrektywy jest wywoływana za każdym razem, gdy tworzony jest nowy powiązany element.Oficjalnie
controller
funkcja polega na tym, że:Ponownie ważne jest, aby pamiętać, że jeśli dyrektywa obejmuje zakres izolowany, to wszelkie właściwości dziedziczące z zakresu nadrzędnego nie są jeszcze dostępne.
Zrobić:
Nie rób:
źródło
Funkcja post-link
Po
post-link
wywołaniu funkcji miały miejsce wszystkie poprzednie kroki - powiązanie, zamknięcie itp.Zazwyczaj jest to miejsce do dalszej manipulacji renderowanym DOM.
Zrobić:
źródło
Funkcja wstępnego połączenia
pre-link
Funkcja każdej dyrektywy jest wywoływana za każdym razem, gdy tworzony jest nowy powiązany element.Jak pokazano wcześniej w sekcji kolejności kompilacji,
pre-link
funkcje są nazywane rodzicem, a następnie dzieckiem, podczas gdypost-link
funkcje są wywoływanechild-then-parent
.pre-link
Funkcja jest rzadko używane, ale mogą być przydatne w szczególnych sytuacjach; na przykład, gdy kontroler podrzędny rejestruje się w kontrolerze nadrzędnym, ale rejestracja musi byćparent-then-child
modna (ngModelController
robi to w ten sposób).Nie rób:
źródło