2013-07-02 16 views
33

Wprowadzam koszyk i chcę przechowywać dane w localStorage. chcę oglądać zmiennej $scope.cart na zmianę tak, że mogę zaktualizować localStorageTablica obserwacyjna AngularJS obiektów do zmiany danych

Zmienna koszyk wygląda tak:

[{'name':'foo', 'id':'bar', 'amount': 1 },...] 

Jest to kod na zegarek.

$scope.updateCart = function(){ 
    localStorageService.add('cart',JSON.stringify($scope.cart)); 
    alert('cart updated'); 
}; 

$scope.$watch($scope.cart, $scope.updateCart(), true); 

To jest kod HTML, w którym użytkownik zmienia model.

<li ng-repeat="item in cart"> 
    {{item.name}} <input type="text" ng-model="item.amount"> 
</li> 

Przy pomocy następującego kodu metoda updateCart() nigdy nie zostanie wyzwolona. Nie jestem pewien, co robię źle. Sprawdzam, czy zmienna $scope.cart uległa zmianie, ale aktualizacja nie została uruchomiona.

Odpowiedz

37

$watch tylko ocenić ciąg lub parametr funkcji w swoim pierwszym argumencie. Zmienić $watch takiego:

$scope.$watch('cart.name + cart.id + cart.amount', $scope.updateCart()); 

LUB

$scope.$watch('cart', $scope.updateCart, true); 

Zobacz reference API

+0

Czy w pierwszym przykładzie nie jest "niepotrzebne"? –

+6

$ scope.updateCart nigdy się nie wyzwoli, jeśli przekażesz je z nawiasami, tak jakbyś przekazał wynik tej funkcji do $ watch, która w tym przypadku byłaby niezdefiniowana. Prawidłowy sposób to: $ scope. $ Watch ('cart', $ scope.updateCart, true); – SKuijers

+1

'koszyk' to tablica obiektów, nie ma właściwości takich jak' kwota' – Hovo

1

próbować zmienić

$scope.$watch($scope.cart, $scope.updateCart(), true); 

do

$scope.$watch('cart', $scope.updateCart(), true); 

$ oglądać tylko ocenić ciąg lub parametr funkcji w pierwszym argumencie

25

Jest to częsty błąd, że ludzie używają zmiennej w wyrażeniu zegarka. dla $ scope.cart należy zamiast tego użyć wyrażenia tekstowego "cart". Na przykład,

$scope.$watch('cart', function() {...}, true) 

angularjs ma nowy sposób oglądania, $ watchCollection. Zasadniczo jest to to samo co $ watch z opcją równości obiektu ustawioną na true, aby obserwować zmianę właściwości lub elementu tablicy.

$scope.$watchCollection('cart', function() {...}); 

Oto link do dokumentu AngularJs dla $ watchCollection. http://docs.angularjs.org/api/ng/type/$rootScope.Scope. Składnia jest w zasadzie taka sama jak $ watch, z wyjątkiem tego, że nie ma 3. parametru (kontrola równości obiektów).

+5

$ watchColletion zaoszczędziło mnie, podczas pchania/usuwania elementów z tablicy. Dzięki! – Ziarno

+0

Nie jest jasne, jakiego rodzaju zmiany chciał OP, ale [jak widać tutaj] (http://stackoverflow.com/a/29189252/1175496) '$ watch (.., .., true) "wykrywa jeszcze więcej zmian, a mianowicie ten rodzaj zmiany:' $ scope.cart [0] .name = "Foo Bar"; ' –

Powiązane problemy