2013-06-19 10 views
32

W knockoutJS możliwe jest, aby zapisać się do zmiany prawa własności observable ViewModel, np jak:Subskrybuj Property Zmian w angularjs

myViewModel.personName.subscribe(function(newValue) { 
    alert("The person's new name is " + newValue); 
}); 

Obecnie uczę angularjs, a ja zastanawiałem się, czy istnieje odpowiednik tego w AngularJS? Próbowałem tego szukać, ale bez powodzenia.

+0

Oto jak działają obserwowalne w Angular2 https://ngforms.firebaseapp.com/#/43 – Failpunk

Odpowiedz

49

scope obiekt w angularjs posiada specjalną metodę o nazwie $watch do 'oglądania' właściwości zakresu.

Akceptuje wywołania zwrotnego, który otrzymuje nowe i stare wartości modelu

$scope.$watch('modelName', function(newValue, oldValue){ 
    // Do anything you like here 
}); 

Wywołanie zwrotne jest na inicjalizacji i za każdym razem modelowe zmian. Dlatego być może warto dodać dodatkowe sprawdzenie równości tak:

$scope.$watch('modelName', function(newValue, oldValue){ 

    // Check if value has changes 
    if(newValue === oldValue){ 
     return; 
    } 

    // Do anything you like here 
}); 

To pozwala „oglądać” model i wykonać pewne działania w razie potrzeby.

Jedna dodatkowa uwaga: jeśli oglądasz model zawierający obiekt, powinieneś użyć dodatkowego trzeciego parametru, który mówi AngularJS, aby porównał obie wartości przez równość obiektu, a nie przez odniesienie (ponieważ referencja nie ulegnie zmianie, a tym samym nie wywoła obserwatora) tak:

$scope.$watch('modelName', function(newValue, oldValue){ 
    // Do anything you like here 
}, true); // Add extra 'true' parameter to check for object equality 

można przeczytać więcej w dokumentacji na stronie AngularJS scope.

Nadzieję, że pomaga!

7

Dla wywołań API i danych asynchronicznych wyzwalanych przez działania użytkownika lub zdarzeń aplikacji, jesteś lepiej wyłączyć za pomocą

$rootScope.$broadcast('updateSearch', value); 

bezpośrednio w zwrotnego funkcji usługowej oraz wykorzystanie go w kontrolerach jak:

$scope.$on('updateSearch', function(event,value) { 
    $scope.search = value; 
});