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);

你还没试过吗?对象超出范围?你的用例是什么?