我有一个手表和一个执行相同功能的观察。但是,有些情况下它们都会触发,每个摘要运行两次函数。
是否有办法只执行一个或另一个,观察优先于手表。
var myFunction = function{
//my code
}
scope.$parent.$watch('Parent.Var', myFunction);
attrs.$observe('myAttr', myFunction);
我目前正在使用100毫秒超时,但有些情况下它仍会触发两者。我认为这种机制有点棘手,因为它取决于浏览器的响应程度。
更多地澄清我的问题:我的范围更新了Parent.var,然后触发监视。在同一个摘要周期中,它将在稍后更新myAttr,然后触发观察。
我所追求的是一种等待消化周期结束的机制,如果手表和观察都被触发,则仅运行观察。
提前致谢!
答案 0 :(得分:0)
您可以简单地使用锁定变量。
var myFunctionLock = false;
var myFunction = function(){
if (myFunctionLock) return;
myFunctionLock = true
//my code
myFunctionLock = false
}
scope.$parent.$watch('Parent.Var', myFunction);
attrs.$observe('myAttr', myFunction);
如果函数在到达结尾之前有可能返回,您可能还想在顶部添加某种时间限制,例如
...
if (myFunctionLock) return;
myFunctionLock = true
var t = setTimeout(function(){ myFunctionLock = false; }, 500);
...
myFunctionLock = false
clearTimeout(t);
以便该功能再次可用。
要为$ observe实现某种“优先级执行”,你可以让其他的调用稍等一下,给$观察一次触发更改并跳到行首。
var myFunctionWait = function(){
// wait a bit, to give $observe a chance to fire.
setTimeout(function(){ myFunction(); }, 100);
}
scope.$parent.$watch('Parent.Var', myFunctionWait);
attrs.$observe('myAttr', myFunction);
答案 1 :(得分:0)
您可以随时在代码中取消绑定$ watch或$ observe,以便不会再次执行。
var unbindWatch = scope.$parent.$watch('Parent.Var', myFunction);
function myFunction() {
// @TODO add your code here which need to be executed
unbindWatch();
}
var unbindObserve = attrs.$observe('myAttr', myFunction);
function myFunction() {
// @TODO add your code here which need to be executed
unbindObserve();
}
所以上面的代码将确保只执行一次。
答案 2 :(得分:0)
感谢这两个答案!
我把两者混合在一起并达成了解决方案。
var myFunctionWait = function(){
// wait a bit, to give $observe a chance to fire.
setTimeout(function(){ myFunction(); }, 100);
}
var myAttrFunction = function(){
unbindWatch();
myFunction();
}
var unbindWatch = scope.$parent.$watch('Parent.Var', myFunctionWait );
attrs.$observe('myAttr', myAttrFunction);
不幸的是,我还没有声誉赞成:(