AngularJS:带链接的手表指令

时间:2013-12-31 15:51:15

标签: javascript angularjs angularjs-directive watch

我正在编写一个angular指令,它有一个名为init()的函数,需要在页面加载时运行,并且任何时候两个变量都会发生变化。我从这开始:

link: function(scope, elem, attrs){
    init();
    //Refresh the view when the the type or typeId changes
    scope.$watch("[type,typeId]", function(){init(scope)}, true);
},

但是我注意到init()实际上被调用了两次。在我拿出第一个init()后,它显然只会运行一次,但我只是好奇,这是预期的行为吗?

我认为监视功能仅在某些内容发生变化时执行。是因为它们在技术上“改变”(在链接后被初始化?)还是只是$ watch的自然行为才能立即执行该函数?

2 个答案:

答案 0 :(得分:4)

注册时会调用

$watch个侦听器。如果您不想在初始化观察程序时执行侦听器函数内部的代码,那么您可以执行以下操作:

scope.$watch("[type,typeId]", function(oldValue, newValue) {
    if (oldValue === newValue) return;

    // This code will only be hit when oldValue is different from newValue
    init(scope)
}, true);

答案 1 :(得分:1)

附加到接受的答案..这甚至似乎是“官方”解决方案。

  

在观察者注册观察者之后,异步调用侦听器fn(通过$ evalAsync)来初始化观察者。在极少数情况下,这是不合需要的,因为当watchExpression的结果没有改变时会调用监听器。要在侦听器fn中检测此场景,您可以比较newVal和oldVal。如果这两个值相同(===)则由于初始化而调用了监听器。

http://docs.angularjs.org/api/ng.$rootScope.Scope#methods_$watch