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 $scopes. Jeśli więc $scope.myVarzdefiniowałeś w kontrolerze i ta zmienna została oznaczona do oglądania , to domyślnie mówisz AngularJS, aby monitorował zmiany myVarw każdej iteracji pętli.
Naturalnym następczym pytaniem byłoby: czy wszystko jest związane z $scopeoglądaniem? Na szczęście nie. Jeśli będziesz obserwować zmiany w każdym obiekcie w swoim $scopewnę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 $scopezmiennej jako obserwowanej (czytaj poniżej).
$ watch pomaga nasłuchiwać zmian zakresu $
Istnieją dwa sposoby zadeklarowania $scopezmiennej jako obserwowanej.
- Używając go w szablonie za pomocą wyrażenia
<span>{{myVar}}</span>
- Dodając go ręcznie za pośrednictwem
$watchusł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 . $watchUsługa pomaga uruchomić kod, gdy $scopezmieni 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 $applyfunkcji 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.myVarwartość, 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, $applyzostał 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, $scopeo 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 $scopeobiektu 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: