มีวิธีในการสมัครสมาชิกกับเหตุการณ์ในการใช้วัตถุหลายอย่าง $watch
เช่น
$scope.$watch('item1, item2', function () { });
มีวิธีในการสมัครสมาชิกกับเหตุการณ์ในการใช้วัตถุหลายอย่าง $watch
เช่น
$scope.$watch('item1, item2', function () { });
คำตอบ:
เริ่มต้นจาก AngularJS 1.3 มีวิธีการใหม่ที่เรียกว่า$watchGroup
การสังเกตชุดของการแสดงออก
$scope.foo = 'foo';
$scope.bar = 'bar';
$scope.$watchGroup(['foo', 'bar'], function(newValues, oldValues, scope) {
// newValues array contains the current values of the watch expressions
// with the indexes matching those of the watchExpression array
// i.e.
// newValues[0] -> $scope.foo
// and
// newValues[1] -> $scope.bar
});
$scope.$watchGroup(['mycustomctrl.foo', 'mycustomctrl.bar'],...
newValues
และoldValues
ในundefined
ขณะที่การดูคุณสมบัติแต่ละรายการทำงานตามปกติ
เริ่มต้นด้วย AngularJS 1.1.4 คุณสามารถใช้$watchCollection
:
$scope.$watchCollection('[item1, item2]', function(newValues, oldValues){
// do stuff here
// newValues and oldValues contain the new and respectively old value
// of the observed collection array
});
ตัวอย่างเสียงพลั่วที่นี่
เอกสารที่นี่
$watchCollection
มีจุดมุ่งหมายเพื่อส่งมอบวัตถุและให้นาฬิกาสำหรับการเปลี่ยนแปลงคุณสมบัติของวัตถุใด ๆ ในขณะที่$watchGroup
มีวัตถุประสงค์เพื่อส่งอาร์เรย์ของคุณสมบัติส่วนบุคคลเพื่อรับการเปลี่ยนแปลง แตกต่างกันเล็กน้อยเพื่อแก้ไขปัญหาที่คล้ายกัน แต่แตกต่างกัน วุ้ย
$watch
พารามิเตอร์แรกสามารถเป็นฟังก์ชันได้
$scope.$watch(function watchBothItems() {
return itemsCombinedValue();
}, function whenItemsChange() {
//stuff
});
หากค่าที่รวมกันสองค่าของคุณเป็นแบบง่ายพารามิเตอร์แรกจะเป็นเพียงการแสดงออกเชิงมุมตามปกติ ตัวอย่างเช่นชื่อและนามสกุล:
$scope.$watch('firstName + lastName', function() {
//stuff
});
fullName = firstName + " " + lastName
ต้องผ่านฟังก์ชั่นเป็นอาร์กิวเมนต์แรก (แทนที่จะเป็นนิพจน์อย่างง่าย'firstName, lastName'
) เชิงมุมนั้นทรงพลังมาก แต่ก็มีบางพื้นที่ที่สามารถเป็นมิตรกับนักพัฒนาได้มากขึ้นในรูปแบบที่ไม่ส่งผลต่อประสิทธิภาพหรือหลักการออกแบบ
$scope.$watch('firstName + lastName', function() {...})
ดังนั้นคุณสามารถทำ คุณสามารถทำได้เพียงแค่นาฬิกาสองเรือน: function nameChanged() {}; $scope.$watch('firstName', nameChanged); $scope.$watch('lastName', nameChanged);
. ฉันเพิ่มกรณีง่าย ๆ ในคำตอบ
นี่คือวิธีการแก้ปัญหาที่คล้ายกับหลอกรหัสต้นฉบับของคุณที่ใช้งานได้จริง:
$scope.$watch('[item1, item2] | json', function () { });
แก้ไข:โอเคฉันคิดว่านี่จะดีกว่า:
$scope.$watch('[item1, item2]', function () { }, true);
โดยพื้นฐานแล้วเรากำลังข้ามขั้นตอน json ซึ่งดูเหมือนจะเป็นใบ้ แต่เริ่มต้นไม่ได้หากไม่มีมัน คีย์เหล่านี้เป็นพารามิเตอร์ตัวที่ 3 ที่มักถูกละเว้นซึ่งจะเปิดใช้งานความเท่าเทียมกันของวัตถุเมื่อเทียบกับความเท่าเทียมกันอ้างอิง จากนั้นการเปรียบเทียบระหว่างวัตถุอาร์เรย์ที่เราสร้างขึ้นนั้นทำงานได้จริง
TypeError: Object #<Object> has no method '$watchCollection'
นี้ แต่วิธีนี้ช่วยฉันแก้ปัญหาของฉันได้!
$scope.$watch('[chaptercontent.Id, anchorid]', function (newValues, oldValues) { ... }, true);
คุณสามารถใช้ฟังก์ชั่นใน $ watchGroup เพื่อเลือกฟิลด์ของวัตถุในขอบเขต
$scope.$watchGroup(
[function () { return _this.$scope.ViewModel.Monitor1Scale; },
function () { return _this.$scope.ViewModel.Monitor2Scale; }],
function (newVal, oldVal, scope)
{
if (newVal != oldVal) {
_this.updateMonitorScales();
}
});
_this
? ขอบเขตไม่ได้ถูกนำไปใช้กับฟังก์ชั่นโดยไม่กำหนดอย่างชัดเจนหรือไม่?
ทำไมไม่ห่อมันด้วยforEach
?
angular.forEach(['a', 'b', 'c'], function (key) {
scope.$watch(key, function (v) {
changed();
});
});
มันเป็นเรื่องของค่าใช้จ่ายเช่นเดียวกับการให้บริการฟังก์ชั่นสำหรับค่ารวมกัน, ไม่จริงต้องกังวลเกี่ยวกับองค์ประกอบค่า
changed()
ถูกเรียกใช้เมื่อใดก็ตามที่มีการเปลี่ยนแปลงบางอย่างในคุณสมบัติอย่างใดอย่างหนึ่ง นั่นเป็นพฤติกรรมที่แน่นอนเหมือนกับว่ามีการจัดหาฟังก์ชันสำหรับค่าที่รวมกัน
วิธีที่ปลอดภัยกว่าเล็กน้อยในการรวมค่าอาจจะใช้สิ่งต่อไปนี้เป็น$watch
ฟังก์ชั่นของคุณ:
function() { return angular.toJson([item1, item2]) }
หรือ
$scope.$watch(
function() {
return angular.toJson([item1, item2]);
},
function() {
// Stuff to do after either value changes
});
$ watch พารามิเตอร์ตัวแรกอาจเป็นนิพจน์หรือฟังก์ชันเชิงมุม ดูเอกสารเกี่ยวกับ$ ขอบเขต. $ นาฬิกา มันมีข้อมูลที่เป็นประโยชน์มากมายเกี่ยวกับวิธีการทำงานของ $ watch: เมื่อมีการเรียกใช้ watch expression การเปรียบเทียบผลเชิงมุมเป็นต้น
เกี่ยวกับ:
scope.$watch(function() {
return {
a: thing-one,
b: thing-two,
c: red-fish,
d: blue-fish
};
}, listener...);
true
พารามิเตอร์ตัวที่สามถึงscope.$watch
(เช่นในตัวอย่างของคุณ) listener()
จะเริ่มทำงานทุกครั้งเนื่องจากแฮชที่ไม่ระบุชื่อมีการอ้างอิงที่แตกต่างกันทุกครั้ง
return { a: functionA(), b: functionB(), ... }
สำหรับผมมันก็มากขึ้นเช่น: ฉันจะตรวจสอบวัตถุที่ถูกส่งคืนของค่าใหม่และเก่าซึ่งกันและกัน
$scope.$watch('age + name', function () {
//called when name or age changed
});
ฟังก์ชั่นที่นี่จะได้รับการเรียกเมื่อทั้งอายุและมูลค่าของชื่อได้รับการเปลี่ยนแปลง
Angular นำมาใช้$watchGroup
ในเวอร์ชั่น 1.3 ซึ่งเราสามารถรับชมตัวแปรหลาย ๆ ตัวพร้อมกับ$watchGroup
บล็อก
เดียว$watchGroup
จะใช้อาร์เรย์เป็นพารามิเตอร์แรกที่เราสามารถรวมตัวแปรทั้งหมดของเราเพื่อรับชม
$scope.$watchGroup(['var1','var2'],function(newVals,oldVals){
console.log("new value of var1 = " newVals[0]);
console.log("new value of var2 = " newVals[1]);
console.log("old value of var1 = " oldVals[0]);
console.log("old value of var2 = " oldVals[1]);
});