2013-07-02 12 views
33

私はショッピングカートを実装していて、そのデータをlocalStorageに保存したいと考えています。 私はカートの変数は次のようになりますのlocalStorageAngularJSのデータ変更用オブジェクト配列

を更新できるように変更するための変数$scope.cartを見たい:

[{'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に渡すので、かっこで渡すと決して起動しません。正しい方法は次のとおりです:$ 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 docへのリンクがあります。 http://docs.angularjs.org/api/ng/type/$rootScope.Scope。構文は基本的に$ watchと同じですが、3番目のパラメータ(オブジェクト等価チェック)がないこと以外は

+5

$ watchColletionは配列からアイテムをプッシュ/削除するときに私を助けました。ありがとう! – Ziarno

+0

OPがどんな種類の変更を望んでいたかは不明ですが、[ここに見られるように](http://stackoverflow.com/a/29189252/1175496) '$ watch(..、..、true) 'さらに多くの変更、つまりこのタイプの変更を検出します:' $ scope.cart [0] .name = "Foo Bar"; ' –

関連する問題