Javascript 角度$watch对象并获取属性名称
我想Javascript 角度$watch对象并获取属性名称,javascript,angularjs,Javascript,Angularjs,我想$watch一个对象,查看其任何属性的变化,当其中任何属性发生变化时,获取其名称(除了newValue和oldValue) 这可能吗?不,这不可能-您得到的唯一信息是监视对象的新值和以前的值 通过查看Angular digest循环实现可以看出: // I ommited most of the code, leaving only the relevant part if ((watchers = current.$$watchers)) { while (/* iterate ov
$watch
一个对象,查看其任何属性的变化,当其中任何属性发生变化时,获取其名称(除了newValue
和oldValue
)
这可能吗?不,这不可能-您得到的唯一信息是监视对象的新值和以前的值 通过查看Angular digest循环实现可以看出:
// I ommited most of the code, leaving only the relevant part
if ((watchers = current.$$watchers)) {
while (/* iterate over watchers */) {
// Compare the current value with the last known value
if ((value = watch.get(current)) !== (last = watch.last)) {
// Notify the callback - only the whole values (new and last) are supplied.
watch.fn(value, ((last === initWatchVal) ? value : last), current);
}
}
您可以手动枚举对象属性并进行比较,也可以使用第三方库进行比较。快速NPM搜索返回:(也可以通过bower获得)。如果您选择使用它,它可能看起来像:
$scope.$watch('watchedObject', function(newValue, oldValue) {
var differences = diff(newValue, oldValue);
// now inspect the differences array to see if there are any
});
除非您知道
$scope
中的变量名,否则无法查看对象
假设您有一个对象要在$scope.myobject
上观看。您将迭代对象属性:
var objprops = []
angular.foreach(myobject, function(value, key) {
objprops.push("myobject." + key);
});
objexpr = "[" + objprops.join(",") + "]";
//objexpr will be something like "[myobject.a, myobject.b, myobject.c, ...]"
然后监视此阵列:
$scope.$watch(objexpr, function(newv, oldv){
//do iteration here
});
这里需要注意的一点是,要检测更改的值,必须针对oldv
数组迭代newv
数组,并记住objprops
,以了解实际更改的字段
它不干净。。。这个问题已经两年了,但我刚刚遇到了同样的问题,我想我应该分享一下我的解决方案。回到1.2版本,您过去可以通过在watch函数中引用
this.exp
来访问已更改的属性,但这可能是出于性能原因而被弃用的。获取已更改属性的最简单方法是循环新对象和旧对象,并按属性名称比较值
$scope.settings = {
'opt1' : 'something',
'opt2' : 'something else',
'opt3' : 'another something',
};
$scope.$watchCollection('settings', function(newObj, oldObj) {
// Loop through new object and compare
angular.forEach(newObj, function(val, key) {
if(newObj[key] !== oldObj[key]) {
// settings[key] changed
}
});
}, true);
你还没试过吗?对象超出范围?你的用例是什么?