我希望$watch
一个对象可以对其任何属性进行更改,并且当其中任何一个属性发生更改时,都会获取其名称(除newValue
和oldValue
之外)。
这可能吗?
答案 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
才能知道哪个领域实际发生了变化。
它根本不干净......