2013-07-02 52 views
33

我正在實施一個購物車並希望將數據存儲在localStorage中。 我想觀察的變量$scope.cart的變化,這樣我就可以更新localStorage的AngularJS監視數據變化的對象數組

的車變量是這樣的:

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

這是手錶的代碼。

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

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

這是用戶更改模型的HTML。

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

使用以下代碼,從不觸發updateCart()方法。我不確定我做錯了什麼。我檢查$scope.cart變量確實發生了變化,但沒有觸發更新。

回答

37

$watch只評估它的第一個字符串參數或功能參數。更改$watch這樣的:

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

OR

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

reference API

+0

在第一個例子中不是'true'是不必要的嗎? –

+6

$ scope.updateCart將永遠不會觸發,如果您將它傳遞給括號,因爲您會將該函數的結果傳遞給$ watch,在此情況下該函數將被定義爲$ watch。正確的方法是:$ scope。$ watch('cart',$ scope.updateCart,true); – SKuijers

+1

'cart'是一個對象數組,它沒有像'amount'這樣的屬性 – Hovo

1

試圖改變

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

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

$僅觀看評估字符串或函數參數中的第一個參數

25

這是一個常見的錯誤是人們在觀察表達式中使用變量。對於$ scope.cart,您應該使用字符串表達式「cart」。例如,

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

AngularJs有一個新的手錶方法,$ watchCollection。它與$ watch的基本相同,對象相等選項設置爲true以觀察屬性或數組項目中的更改。

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

這裏是$ watchCollection的AngularJs文檔的鏈接。 http://docs.angularjs.org/api/ng/type/$rootScope.Scope。語法基本上與$ watch基本相同,只是它沒有第三個參數(對象相等性檢查)

+5

$ watchColletion在從數組中刪除項目時爲我節省了時間。謝謝! – Ziarno

+0

目前還不清楚OP想要什麼樣的改變,但[見此處](http://stackoverflow.com/a/29189252/1175496)'$ watch(..,..,true)'檢測到更多的變化,即這種類型的變化:'$ scope.cart [0] .name =「Foo Bar」;' –