Musisz wiedzieć, jak działa AngularJS, aby to zrozumieć.
Cykl trawienia i zakres $
Przede wszystkim AngularJS definiuje koncepcję tak zwanego cyklu trawienia . Cykl ten można uznać za pętlę, podczas której AngularJS sprawdza, czy są jakieś zmiany we wszystkich zmiennych obserwowanych przez wszystkie $scope
s. Jeśli więc $scope.myVar
zdefiniowałeś w kontrolerze i ta zmienna została oznaczona do oglądania , to domyślnie mówisz AngularJS, aby monitorował zmiany myVar
w każdej iteracji pętli.
Naturalnym następczym pytaniem byłoby: czy wszystko jest związane z $scope
oglądaniem? Na szczęście nie. Jeśli będziesz obserwować zmiany w każdym obiekcie w swoim $scope
wnętrzu, to szybko zajmie to całe wieki, aby ocenić i szybko wpadniesz na problemy z wydajnością. Dlatego zespół AngularJS dał nam dwa sposoby zadeklarowania $scope
zmiennej jako obserwowanej (czytaj poniżej).
$ watch pomaga nasłuchiwać zmian zakresu $
Istnieją dwa sposoby zadeklarowania $scope
zmiennej jako obserwowanej.
- Używając go w szablonie za pomocą wyrażenia
<span>{{myVar}}</span>
- Dodając go ręcznie za pośrednictwem
$watch
usługi
Ad 1) Jest to najczęstszy scenariusz i jestem pewien, że widziałeś go wcześniej, ale nie wiedziałeś, że stworzył zegarek w tle. Tak było! Korzystanie z dyrektyw AngularJS (np. ng-repeat
) Może również tworzyć niejawne zegarki.
Ad 2) W ten sposób tworzysz własne zegarki . $watch
Usługa pomaga uruchomić kod, gdy $scope
zmieni się pewna wartość dołączona do pliku. Jest rzadko używany, ale czasem jest pomocny. Na przykład, jeśli chcesz uruchomić jakiś kod za każdym razem, gdy zmienia się „myVar”, możesz wykonać następujące czynności:
function MyController($scope) {
$scope.myVar = 1;
$scope.$watch('myVar', function() {
alert('hey, myVar has changed!');
});
$scope.buttonClicked = function() {
$scope.myVar = 2; // This will trigger $watch expression to kick in
};
}
$ Apply umożliwia zintegrowanie zmian z cyklem podsumowania
Możesz myśleć o tej $apply
funkcji jak o mechanizmie integracji . Widzisz, za każdym razem, gdy zmieniasz obserwowaną zmienną dołączoną$scope
bezpośrednio do obiektu, AngularJS będzie wiedział, że zmiana nastąpiła. Jest tak, ponieważ AngularJS już wiedział, że monitoruje te zmiany. Jeśli więc zdarzy się to w kodzie zarządzanym przez platformę, cykl podsumowania będzie kontynuowany.
Czasami jednak chcesz zmienić jakąś wartość poza światem AngularJS i zobaczyć, jak zmiany propagują się normalnie. Zastanów się - masz $scope.myVar
wartość, która zostanie zmodyfikowana w module $.ajax()
obsługi jQuery . Stanie się to w pewnym momencie w przyszłości. AngularJS nie może się doczekać, aby tak się stało, ponieważ nie polecono mu czekać na jQuery.
Aby rozwiązać ten problem, $apply
został wprowadzony. Umożliwia jawne rozpoczęcie cyklu trawienia. Powinieneś jednak użyć tego tylko do migracji niektórych danych do AngularJS (integracja z innymi frameworkami), ale nigdy nie używaj tej metody w połączeniu ze zwykłym kodem AngularJS, ponieważ AngularJS zgłosi błąd.
Jak to wszystko ma się do DOM?
Cóż, powinieneś naprawdę postępować zgodnie z samouczkiem, skoro wiesz już wszystko. Cykl podsumowania upewni się, że interfejs użytkownika i kod JavaScript pozostaną zsynchronizowane, oceniając każdego obserwatora podłączonego do wszystkich, $scope
o ile nic się nie zmieni. Jeśli w pętli podsumowania nie nastąpią już żadne zmiany, uznaje się to za zakończone.
Możesz dołączyć obiekty do $scope
obiektu albo jawnie w kontrolerze, albo zadeklarując je w {{expression}}
formie bezpośrednio w widoku.
Mam nadzieję, że pomoże to wyjaśnić podstawową wiedzę na ten temat.
Dalsze odczyty: