Đặt objectEqualitytham số (tham số thứ ba) của $watchhàm chắc chắn là cách chính xác để xem TẤT CẢ các thuộc tính của mảng.
$scope.$watch('columns', function(newVal) {
alert('columns changed');
},true); // <- Right here
Piran trả lời điều này đủ tốt và cũng đề cập đến $watchCollection.
Thêm chi tiết
Lý do tôi trả lời một câu hỏi đã được trả lời là vì tôi muốn chỉ ra rằng câu trả lời của wizardwerdna không phải là câu hỏi hay và không nên sử dụng.
Vấn đề là các tiêu hóa không xảy ra ngay lập tức. Họ phải đợi cho đến khi khối mã hiện tại hoàn thành trước khi thực thi. Vì vậy, xem lengthmột mảng thực sự có thể bỏ lỡ một số thay đổi quan trọng $watchCollectionsẽ bắt.
Giả sử cấu hình này:
$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');
});
Thoạt nhìn, có vẻ như những thứ này sẽ bắn cùng một lúc, chẳng hạn như trong trường hợp này:
function pushToArray() {
$scope.testArray.push({val:3});
}
pushToArray();
// Console output
// length changed: 2 -> 3
// testArray changed
Điều đó hoạt động đủ tốt, nhưng xem xét điều này:
function spliceArray() {
// Starting at index 1, remove 1 item, then push {val: 3}.
$testArray.splice(1, 1, {val: 3});
}
spliceArray();
// Console output
// testArray changed
Lưu ý rằng độ dài kết quả là như nhau mặc dù mảng có một phần tử mới và bị mất một phần tử, do đó, khi xem $watchcó liên quan, lengthđã không thay đổi. $watchCollectionnhặt lên trên, mặc dù.
function pushPopArray() {
$testArray.push({val: 3});
$testArray.pop();
}
pushPopArray();
// Console output
// testArray change
Kết quả tương tự xảy ra với một lần đẩy và bật trong cùng một khối.
Phần kết luận
Để xem mọi thuộc tính trong mảng, hãy sử dụng a $watchtrên chính mảng đó với tham số thứ ba (objectEquality) được bao gồm và đặt thành true. Vâng, điều này là đắt tiền nhưng đôi khi cần thiết.
Để xem khi đối tượng nhập / thoát mảng, sử dụng a $watchCollection.
KHÔNG sử dụng a $watchtrên thuộc lengthtính của mảng. Hầu như không có lý do chính đáng nào tôi có thể nghĩ ra để làm như vậy.
angular.equalskhi đối số thứ ba có giá trị boolean ?