Muszę wykonać pewne operacje na zakresie i szablonie. Wydaje się, że mogę to zrobić w link
funkcji lub controller
funkcji (ponieważ oba mają dostęp do zakresu).
Kiedy jest tak, że muszę korzystać z link
funkcji, a nie ze sterownika?
angular.module('myApp').directive('abc', function($timeout) {
return {
restrict: 'EA',
replace: true,
transclude: true,
scope: true,
link: function(scope, elem, attr) { /* link function */ },
controller: function($scope, $element) { /* controller function */ }
};
}
Rozumiem również, że link
jest to świat nie kątowy. Więc mogę używać $watch
, $digest
i $apply
.
Jakie znaczenie ma link
funkcja, kiedy mieliśmy już kontroler?
javascript
angularjs
angularjs-directive
Yugal Jindle
źródło
źródło
$watch
,$digest
i$apply
. ”?link
nie widzimy żadnej magii kątowej. tzn. brak powiązań dwukierunkowych itp. Wystarczy, że mamy dostępne api kątownika.Odpowiedzi:
Po moim początkowym walka z
link
icontroller
funkcji czytania i sporo o nich, myślę, że teraz mam odpowiedź.Najpierw zrozumiemy ,
Jak w skrócie działają dyrektywy kątowe:
Zaczynamy od szablonu (jako ciąg lub załadowany do ciągu)
var templateString = '<div my-directive>{{5 + 10}}</div>';
Teraz
templateString
jest to owinięte jako element kątowyvar el = angular.element(templateString);
Dzięki
el
, teraz skompilować je$compile
odzyskać łącza funkcję.var l = $compile(el)
Oto co się dzieje
$compile
przechodzi przez cały szablon i zbiera wszystkie rozpoznane dyrektywy.link
funkcje są gromadzone.link
funkcje są pakowane w nowąlink
funkcję i zwracane jakol
.Wreszcie, zapewniamy
scope
funkcję tej funkcjil
(link), która dodatkowo wykonuje zawinięte funkcje linku wraz z tąscope
i odpowiadającymi jej elementami.l(scope)
Dodaje to
template
jako nowy węzeł doDOM
i wywołuje,controller
który dodaje swoje zegarki do zakresu współdzielonego z szablonem w DOM.Porównanie kompilacji vs linku vs kontrolera :
Każda dyrektywa jest kompilowana tylko raz, a funkcja link zostaje zachowana do ponownego użycia. Dlatego jeśli coś dotyczy wszystkich instancji dyrektywy, należy ją wykonać w ramach
compile
funkcji dyrektywy .Teraz po kompilacji mamy
link
funkcję, która jest wykonywana podczas dołączania szablonu do DOM . Dlatego wykonujemy wszystko, co jest specyficzne dla każdej instancji dyrektywy. Na przykład: dołączanie zdarzeń , mutowanie szablonu na podstawie zakresu itp.Wreszcie, kontroler ma być dostępny do działania i reagowania, podczas gdy dyrektywa działa na
DOM
(po przywiązaniu). W związku z tym:(1) Po skonfigurowaniu widoku [ V ] (tj. Szablonu) z linkiem.
$scope
jest naszym [ M ] i$controller
naszym [ C ] w MVC(2) Skorzystaj z 2-kierunkowego wiązania z $ scope , ustawiając zegarki.
(3)
$scope
oczekuje się, że zegarki zostaną dodane do kontrolera, ponieważ właśnie to ogląda szablon w czasie wykonywania.(4) Wreszcie,
controller
służy również do komunikowania się między powiązanymi dyrektywami. (JakmyTabs
przykład w https://docs.angularjs.org/guide/directive )(5) To prawda, że moglibyśmy zrobić to wszystko również w
link
funkcji, ale chodzi o rozdzielenie obaw .Dlatego wreszcie mamy następujące, które idealnie pasują do wszystkich elementów:
źródło
Dlaczego kontrolery są potrzebne
Różnica pomiędzy
link
icontroller
pojawia się, gdy chcesz zagnieżdżać dyrektywy w DOM i wystawiać funkcje API z dyrektywy nadrzędnej na zagnieżdżone.Z dokumentów :
Powiedz, że chcesz mieć dwie dyrektywy
my-form
imy-text-input
chcesz, abymy-text-input
dyrektywa pojawiła się tylko w środkumy-form
i nigdzie indziej.W takim przypadku, można powiedzieć podczas definiowania dyrektywę
my-text-input
że wymaga kontrolera zparent
elementu DOM przy użyciu wymaga argumentu, tak:require: '^myForm'
. Teraz kontroler z elementu nadrzędnego przejdzieinjected
dolink
funkcji jako czwarty argument za nim$scope, element, attributes
. Możesz wywoływać funkcje na tym kontrolerze i komunikować się z dyrektywą nadrzędną.Ponadto, jeśli taki kontroler nie zostanie znaleziony, zostanie zgłoszony błąd.
Po co w ogóle korzystać z linku
Nie ma potrzeby używania tej
link
funkcji, jeśli się ją definiuje,controller
ponieważ$scope
jest ona dostępna wcontroller
. Ponadto, definiując jednolink
i drugiecontroller
, należy uważać na kolejność wywoływania dwóch (controller
jest wykonywana wcześniej).Jednak, zgodnie ze sposobem Angular , większość manipulacji DOM i 2-kierunkowe wiązanie
$watchers
odbywa się zwykle wlink
funkcji, podczas gdy API dla dzieci i$scope
manipulowanie odbywa się wcontroller
. Nie jest to trudna i szybka reguła, ale spowoduje to, że kod będzie bardziej modułowy i pomoże w rozdzieleniu problemów (kontroler utrzymadirective
stan, alink
funkcja zachowaDOM
+ powiązania zewnętrzne).źródło
link
?controller
? Dlaczego chcę wymyślić zupełnie nową funkcję, aby uniknąć definiowania kontrolera?controller
Funkcja / przedmiot stanowi abstrakcji modelu-view kontroler (MVC). Chociaż nie ma nic nowego do napisania o MVC, nadal jest to najważniejsza zaleta kąta: podziel obawy na mniejsze części. I to wszystko, nic więcej, więc jeśli trzeba reagować naModel
zmiany pochodzące z jest właściwa osoba zrobić to zadanie.View
Controller
Historia o
link
funkcji jest inna, pochodzi z innej perspektywy niż MVC. Jest to naprawdę niezbędne, gdy chcemy przekroczyć granicecontroller/model/view
(szablonu) .Zacznijmy od parametrów, które są przekazywane do
link
funkcji:Aby umieścić
link
w kontekście, powinniśmy wspomnieć, że wszystkie dyrektywy przechodzą przez następujące kroki procesu inicjalizacji: Kompiluj , Łącz . Fragment książki Brada Greena i Shyama Seshadri Angular JS :Faza kompilacji (siostra linku, wspomnijmy tutaj, aby uzyskać wyraźny obraz):
W tej fazie Angular prowadzi DOM w celu zidentyfikowania wszystkich zarejestrowanych dyrektyw w szablonie. Dla każdej dyrektywy następnie przekształca DOM w oparciu o reguły dyrektywy (szablon, zamień, przetaczaj itd.) I wywołuje funkcję kompilacji, jeśli istnieje. Wynikiem jest skompilowana funkcja szablonu,
Faza łącza :
Miły przykład korzystania z nich
link
można znaleźć tutaj: Tworzenie niestandardowych dyrektyw . Zobacz przykład: Tworzenie dyrektywy, która manipuluje DOM , która wstawia na stronie „datę i godzinę”, odświeżana co sekundę.Tylko bardzo krótki fragment z tego bogatego źródła powyżej, pokazujący prawdziwą manipulację za pomocą DOM. Istnieje funkcja przechwycona do usługi $ timeout, a także jest usuwana w wywołaniu destruktora, aby uniknąć wycieków pamięci
źródło
compiler
ilink
.link
controller
controller
vslink
powinny być jaśniejsze ...link
lubcontroller
.controller
ilink
jest względnie brzydki. Zespół Angular musi mieć ku temu dobry powód, a nie tylko opcję.