Đặt objectEquality
tham số (tham số thứ ba) của $watch
hà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 length
một mảng thực sự có thể bỏ lỡ một số thay đổi quan trọng $watchCollection
sẽ 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 $watch
có liên quan, length
đã không thay đổi. $watchCollection
nhặ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 $watch
trê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 $watch
trên thuộc length
tí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.equals
khi đối số thứ ba có giá trị boolean ?