我想在我的字符串drawChart()
或我的对象chartTitle
中的任何属性发生变化时调用函数chartOptions
。
单独观看它们很容易:
$scope.$watch('chartTitle', drawChart);
$scope.$watchCollection('chartOptions', drawChart);
但是,我需要一种方法将它们合并为一个$watch
语句(不添加chartTitle
作为chartOptions
的属性。
如何防止这两位观察者在同一摘要周期中开火。也就是说,如果我同时更改chartTitle
和chartOptions
上的属性,我怎样才能阻止drawChart
被调用两次?
对chartOptions
和chartTitle
进行深入观察。不幸的是chartOptions
是一个非常大而复杂的对象,因此深入观察这些属性是不可行的。 是否可以限制深度?
在chartOptions
观察者中检测在此摘要周期内chartTitle
是否已更改,反之亦然。 这甚至可能吗?
找出一个监视表达式,捕获chartOptions
和chartTitle
上的所有属性。
答案 0 :(得分:1)
你可以深入观察:
$scope.$watch(
function() {
return {
chartTitle: $scope.chartTitle,
chartOptions: $scope.chartOptions
};
},
function(newval) {
...
},
true // deep watch
);
密切关注性能问题,它将在每个摘要周期创建一个对象。通常它没关系,但对于重量级的应用程序它可能。
答案 1 :(得分:0)
将chartTitle
和chartOptions
合并为一个对象,然后对该对象执行$watchCollection
。
$scope.$watchCollection(function() {
// Make a shallow clone of all the properties in chartOptions
var amalgam = {};
for (var key in $scope.chartOptions) {
var val = $scope.chartOptions[key];
amalgam[key] = val;
}
// Add the chart title to our shallow clone
amalgam.chartTitle = $scope.chartTitle;
return amalgam;
}, drawChart);
请注意,这可能不是很快,因为您在每个摘要周期创建一个新对象。