1. ホーム
  2. ジャバスクリプト

[解決済み】$watch an object

2022-03-27 01:02:11

質問

辞書の変更を監視したいのですが、なぜかwatchコールバックが呼ばれません。

私が使っているコントローラはこちらです。

function MyController($scope) {
    $scope.form = {
        name: 'my name',
        surname: 'surname'
    }

    $scope.$watch('form', function(newVal, oldVal){
        console.log('changed');
    });
}

以下は フィドル .

名前や苗字が変わるたびに$watchコールバックが発生することを期待しますが、発生しません。

正しい方法は何ですか?

どのように解決するのですか?

電話 $watchtrue を3番目の引数として指定します。

$scope.$watch('form', function(newVal, oldVal){
    console.log('changed');
}, true);

JavaScript で 2 つの複雑なオブジェクトを比較する場合、デフォルトでは、2 つのオブジェクトが同じものを参照しているかどうかを尋ねる "reference" の同等性がチェックされ、それらのオブジェクトのすべてのプロパティの値が等しいかどうかをチェックする "value" は行われません。

にあたります。 Angular ドキュメント の場合、3番目のパラメータは objectEquality :

いつ objectEquality == true に従って、watchExpression の不等号が決定される。 angular.equals 関数を使用します。後で比較するためにオブジェクトの値を保存するために angular.copy 関数が使用されます。したがって、複雑なオブジェクトを見ることは、メモリとパフォーマンスに悪影響を及ぼすことを意味します。