2013-07-02 8 views
33

Sto implementando un carrello acquisti e desidero memorizzare i dati in localStorage. Voglio guardare la variabile $scope.cart per il cambiamento in modo da poter aggiornare il localStorageAngularJS controlla la matrice di oggetti per la modifica dei dati

La variabile carrello si presenta così:

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

Questo è il codice per l'orologio.

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

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

Questo è l'HTML in cui l'utente cambia il modello.

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

Con questo codice, il metodo updateCart() non viene mai attivato. Non sono sicuro di cosa sto sbagliando. Controllo che la variabile $scope.cart sia stata modificata, ma l'aggiornamento non è stato attivato.

risposta

37

$watch valutare solo stringa o parametro di funzione nel suo primo argomento. Cambia la tua $watch in questo modo:

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

O

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

Vedi reference API

+0

Non è 'vero' inutile nel primo esempio? –

+6

$ scope.updateCart non si innescherà mai se lo si passa con parentesi come se si passasse il risultato della funzione a $ watch che non sarebbe definito in questo caso. Il modo corretto è: $ scope. $ Watch ('cart', $ scope.updateCart, true); – SKuijers

+1

'cart' è una matrice di oggetti, non ha proprietà come' amount' – Hovo

1

tenta di modificare

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

a

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

$ guardano solo valutare stringa o parametro di funzione nel suo primo argomento

25

E 'un errore comune che la gente usa variabile nell'espressione orologio. per $ scope.cart, dovresti usare invece un'espressione stringa 'cart'. Ad esempio,

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

AngularJs ha un nuovo metodo di orologio, $ watchCollection. È fondamentalmente uguale a $ watch con l'opzione di uguaglianza dell'oggetto impostata su true per osservare la modifica in una proprietà o in un elemento dell'array.

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

Questo è il collegamento al documento AngularJs per $ watchCollection. http://docs.angularjs.org/api/ng/type/$rootScope.Scope. La sintassi è fondamentalmente la stessa di $ watch eccetto che non ha il 3 ° parametro (controllo di uguaglianza degli oggetti)

+5

$ watchColletion mi ha salvato, quando spingo/rimuovi gli elementi da un array. Grazie! – Ziarno

+0

Non è chiaro quale tipo di modifica volesse l'OP, ma [come visto qui] (http://stackoverflow.com/a/29189252/1175496) '$ watch (.., .., true) 'rileva ancora più modifiche, ovvero questo tipo di modifica:' $ scope.cart [0] .name = "Foo Bar"; ' –

Problemi correlati