AngularJS 允许监听对象的变化,并调用提供给 $watch 函数的回调函数。对于像 ngGrid 这样使用 AngularJS 的大型库,对象经常被“监视”。
一旦调用了监视回调,如何追溯到导致对象发生更改的调用站点?
如果不知道是什么导致了变化,并因此导致了监视处理程序被调用,那么调试像 ngGrid 这样的库是非常困难的。我在可以预见变量可能更改的任何地方设置断点,然后尝试为执行管道构建一个图表,以跟踪导致对象更改的事件链。
你根本不能那样做。$watch
只会添加一个回调来检查对象是否发生变化,并在摘要期间运行。
我想这是与像这样的框架的主要区别之一Backbone
你在哪里扩展Model
object.
话虽这么说,你might祝你好运$scope.$digest();
故意的(更新模型,并解雇观察者),但这是一个延伸......
Update
问题是您认为手表和型号变化之间存在相关性,但事实并非如此。添加监视只是在摘要循环运行时添加要检查的内容。
此循环不是由对某个内容的更改触发的$scope
,而是调用$scope.$apply
,或者直接调用$scope.$digest
.
请注意,大多数(all?)Angular 的指令和相关组件调用$scope.$apply
代表你。例如,原因是$timeout
and ngClick
按预期工作,是因为它们运行$scope.$apply
执行回调后在内部。
更新二
如果您只是对查找调用站点感兴趣,这样的东西可以帮助您吗?
$scope.foo = {
get bar () { return getting(); },
set bar (value) { setting(value); }
};
var bar;
function setting (value) {
var stack = getStack();
console.log(value, stack);
bar = value;
}
function getting () {
console.log(getStack());
}
function getStack () {
try {
throw new Error('foo');
} catch (e) {
return e.stack || e;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)