执行$ watch或$ observe一次

时间:2016-05-24 08:55:32

标签: angularjs

我有一个手表和一个执行相同功能的观察。但是,有些情况下它们都会触发,每个摘要运行两次函数。

是否有办法只执行一个或另一个,观察优先于手表。

var myFunction = function{
   //my code
}

scope.$parent.$watch('Parent.Var', myFunction);
attrs.$observe('myAttr', myFunction);

我目前正在使用100毫秒超时,但有些情况下它仍会触发两者。我认为这种机制有点棘手,因为它取决于浏览器的响应程度。

更多地澄清我的问题:我的范围更新了Parent.var,然后触发监视。在同一个摘要周期中,它将在稍后更新myAttr,然后触发观察。

我所追求的是一种等待消化周期结束的机制,如果手表和观察都被触发,则仅运行观察。

提前致谢!

3 个答案:

答案 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,以便不会再次执行。

取消绑定$ watch的方法:

var unbindWatch = scope.$parent.$watch('Parent.Var', myFunction);

function myFunction() {
  // @TODO add your code here which need to be executed
  unbindWatch();
}

取消绑定$ observe的方法:

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

不幸的是,我还没有声誉赞成:(