関数のobjectEquality
パラメーター(3番目のパラメーター)を設定する$watch
ことは、配列のすべてのプロパティを監視するための正しい方法です。
$scope.$watch('columns', function(newVal) {
alert('columns changed');
},true); // <- Right here
ピランはこれに十分に答え、言及$watchCollection
もしています。
もっと詳しく
既に回答済みの質問に回答するのは、wizardwerdnaの回答は良いものではなく、使用すべきではないことを指摘したいからです。
問題は、ダイジェストがすぐに発生しないことです。実行する前に、現在のコードブロックが完了するまで待機する必要があります。したがって、length
配列のは、実際$watchCollection
にキャッチするいくつかの重要な変更を見逃す可能性があることに注意してください。
この構成を想定します。
$scope.testArray = [
{val:1},
{val:2}
];
$scope.$watch('testArray.length', function(newLength, oldLength) {
console.log('length changed: ', oldLength, ' -> ', newLength);
});
$scope.$watchCollection('testArray', function(newArray) {
console.log('testArray changed');
});
一見すると、この場合のように、これらが同時に発火するように見えるかもしれません:
function pushToArray() {
$scope.testArray.push({val:3});
}
pushToArray();
// Console output
// length changed: 2 -> 3
// testArray changed
これで十分に機能しますが、次の点を考慮してください。
function spliceArray() {
// Starting at index 1, remove 1 item, then push {val: 3}.
$testArray.splice(1, 1, {val: 3});
}
spliceArray();
// Console output
// testArray changed
得られた長さが配列の新しい要素を有していても同じだったように、時計として、要素を失ったことを通知$watch
懸念されるが、length
変更されていません。 $watchCollection
しかし、それを手に入れました。
function pushPopArray() {
$testArray.push({val: 3});
$testArray.pop();
}
pushPopArray();
// Console output
// testArray change
同じブロックでのプッシュとポップで同じ結果が発生します。
結論
配列内のすべてのプロパティを監視するには、 $watch
には、3番目のパラメーター(objectEquality)を含めてtrueに設定して、配列自体でをします。はい、これは高価ですが、時には必要です。
オブジェクトが配列に出入りするときを監視するには、 $watchCollection
ます。
配列$watch
のlength
プロパティでは使用しないでください。私がそうするために考えられる正当な理由はほとんどありません。
angular.equals
3番目の引数がブール値を取るときに使用しているのはなぜですか?