함수 의 objectEquality
매개 변수 (세번째 매개 변수)를 설정하는 $watch
것은 배열의 모든 속성을 보는 올바른 방법입니다.
$scope.$watch('columns', function(newVal) {
alert('columns changed');
},true); // <- Right here
Piran 은 이것에 충분히 대답하고 언급 $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
세 번째 매개 변수 (objectEquality)를 포함하고 true로 설정 한 배열 자체를 사용하십시오. 예, 이것은 비싸지 만 때로는 필요합니다.
객체가 배열에 들어오고 나가는 시점을 보려면 a를 사용하십시오 $watchCollection
.
배열 $watch
의 length
속성에 a 를 사용하지 마십시오 . 그렇게 생각할만한 이유는 거의 없습니다.
angular.equals
세 번째 인수가 부울 값 을 가질 때 왜 사용 합니까?