我正在编写一个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的自然行为才能立即执行该函数?
答案 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