การตั้งค่าobjectEquality
พารามิเตอร์ (พารามิเตอร์ที่สาม) ของ$watch
ฟังก์ชันเป็นวิธีที่ถูกต้องในการดูคุณสมบัติทั้งหมดของอาร์เรย์
$scope.$watch('columns', function(newVal) {
alert('columns changed');
},true); // <- Right here
Piranตอบคำถามนี้ได้ดีพอและกล่าวถึง$watchCollection
เช่นกัน
รายละเอียดเพิ่มเติม
เหตุผลที่ฉันตอบคำถามที่ตอบแล้วเพราะฉันต้องการชี้ให้เห็นว่าคำตอบของพ่อมดแม่มดไม่ดีและไม่ควรใช้
ปัญหาคือการย่อยไม่เกิดขึ้นทันที พวกเขาต้องรอจนกว่าบล็อกรหัสปัจจุบันจะเสร็จสมบูรณ์ก่อนดำเนินการ ดังนั้นการเฝ้าดู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
ผลลัพธ์เดียวกันนั้นเกิดขึ้นเมื่อกดและป๊อปอัพในบล็อกเดียวกัน
ข้อสรุป
ในการดูทุกคุณสมบัติในอาเรย์ใช้ a $watch
บนอาเรย์ด้วยตัวเองพร้อมกับพารามิเตอร์ที่สาม (objectEquality) รวมอยู่และตั้งค่าเป็นจริง ใช่มันแพง แต่บางครั้งก็จำเป็น
หากต้องการดูเมื่อวัตถุป้อน / $watchCollection
ออกจากอาร์เรย์การใช้งาน
อย่าใช้$watch
กับlength
คุณสมบัติของอาร์เรย์ เกือบจะไม่มีเหตุผลที่ดีที่ฉันสามารถคิดทำ
angular.equals
เมื่ออาร์กิวเมนต์ที่สามใช้ค่าบูลีน ?