38

ショッピング カートを実装していて、データを localStorage に保存したいと考えています。$scope.cartlocalStorage を更新できるように、変数の変更を監視したい

カート変数は次のようになります。

[{'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変数が変更されたことを確認しましたが、更新はトリガーされませんでした。

4

3 に答える 3

41

$watch最初の引数で文字列または関数パラメーターのみを評価します。このように変更します$watch

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

また

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

リファレンス APIを参照

于 2013-07-02T07:18:55.873 に答える
28

ウォッチ式の最初のパラメーターとして変数を使用するのはよくある間違いです。

には$scope.cart、次の文字列を使用する必要がありますcart

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

AngularJs には新しい watch メソッド$watchCollection. $watchプロパティまたは配列項目の変更を監視するために、オブジェクト等価オプションを true に設定するのと基本的に同じです。

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

ドキュメント: $watchCollection .

于 2014-03-23T05:32:46.103 に答える
1

変えようとする

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

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

$watch は、最初の引数で文字列または関数パラメーターのみを評価します

于 2013-07-02T05:20:27.963 に答える