首先,这是code:
app.controller('MainCtrl', function($scope) {
$scope.test="Hello!";
$scope.updateFlag = false;
function updateFunc(){
$scope.updateFlag = true;
}
$scope.updateFunc = updateFunc;
});
app.directive('dir1', function(){
return {
scope:{
updateFunc:'='
},
link: function(scope,element,attr,ctrl){
element.bind('click', scope.updateFunc);
}
}
});
app.directive('dir2', function(){
return {
template: '{{privateVal}}',
scope:{
updateFlag:'='
},
link: function(scope,element,attr,ctrl){
scope.privateVal= "Not working!";
scope.$watch(scope.updateFlag, function(newval, oldval){
alert("watch triggered");
if (newval===true){
scope.privateVal = "Worked!!";
}
})
}
}
});
我有2个指令,1个指向全局函数的双向绑定,另一个指向全局函数正在改变的全局变量。但是,以某种方式调用全局函数时,我的监视功能不会被触发。非常感谢任何帮助。
谢谢,
答案 0 :(得分:4)
因为您正在调用本机点击事件,所以digest
周期不会被调用。
使用$timeout
来解决它:
app.directive('dir1', function($timeout){
return {
scope:{
updateFunc:'='
},
link: function(scope,element,attr,ctrl){
element.bind('click', function()
{
$timeout(scope.updateFunc)
});
}
}
});
答案 1 :(得分:1)
如果您不想使用此超时选项执行此操作,还有其他几种方法可以解决此问题,我认为这有一些优势:
1。)不要使用隔离范围。刚从控制器调用该方法:
<button dir1 ng-click="updateFunc()">Click me!</button>
2.使用隔离范围,使用ng-click静止,但是像这样:http://plnkr.co/edit/TrahxB。
您将函数作为属性传递。使用&amp;的绑定模式并从范围对象中获取它。你看我把它叫做“更新”,然后用ng-click = update()在指令中运行它。这也允许您将指令中的数据传递给对象映射中的控制器,这在构建时很有用! Here is a great tutorial to explain this.
或者,如果您需要一个隔离范围指令,但不需要隔离该函数,您可以将所有单击逻辑放在DOM中,然后将其转换为指令 - 使用#1中的策略。被转换的dom元素位于父控制器范围内 - see this。
3.使用隔离范围,您可以使用ng-click指令将指令的链接功能上的函数调用到Emit an event to be watched on the controller.