Angular $ watch对象和获取属性名称

时间:2014-08-21 19:40:29

标签: javascript angularjs

我希望$watch一个对象可以对其任何属性进行更改,并且当其中任何一个属性发生更改时,都会获取其名称(除newValueoldValue之外)。

这可能吗?

3 个答案:

答案 0 :(得分:2)

不,这是不可能的 - 您获得的唯一信息是观察对象的新值和先前值。

您可以通过查看Angular摘要循环实现来判断:

// 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搜索返回了这个:deep-diff(它也可以通过凉亭获得)。如果你选择使用它,它可能看起来像:

$scope.$watch('watchedObject', function(newValue, oldValue) {
  var differences = diff(newValue, oldValue);
  // now inspect the differences array to see if there are any
});

答案 1 :(得分:2)

这个问题已经两年了,但我遇到了同样的问题,我想我会分享我的解决方案。回到1.2版本,您曾经可以通过引用watch函数中的TableLayoutPanel来访问已更改的属性,但由于性能原因,这个版本已被弃用。获取已更改属性的最简单方法是遍历新旧对象,并按属性名称比较值。

this.exp

答案 2 :(得分:0)

除非您知道$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
});

最重要的警告是,要检测更改后的值,您必须针对newv数组迭代oldv数组并记住objprops才能知道哪个领域实际发生了变化。

它根本不干净......