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ć na Model
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ć granice controller/model/view
(szablonu) .
Zacznijmy od parametrów, które są przekazywane do link
funkcji:
function link(scope, element, attrs) {
- zakres jest obiektem zakresu kątowego.
- element to element zawinięty w jqLite, który jest zgodny z tą dyrektywą.
- attrs to obiekt ze znormalizowanymi nazwami atrybutów i odpowiadającymi im wartościami.
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 :
Aby widok był dynamiczny, Angular uruchamia następnie funkcję link dla każdej dyrektywy. Funkcje łączenia zwykle tworzą detektory w DOM lub modelu. Słuchacze ci utrzymują synchronizację widoku i modelu.
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
.directive('myCurrentTime', function($timeout, dateFilter) {
function link(scope, element, attrs) {
...
// the not MVC job must be done
function updateTime() {
element.text(dateFilter(new Date(), format)); // here we are manipulating the DOM
}
function scheduleUpdate() {
// save the timeoutId for canceling
timeoutId = $timeout(function() {
updateTime(); // update DOM
scheduleUpdate(); // schedule the next update
}, 1000);
}
element.on('$destroy', function() {
$timeout.cancel(timeoutId);
});
...
$watch
,$digest
i$apply
. ”?