Angular指令监视变量不触发

时间:2014-11-17 05:38:46

标签: javascript angularjs angularjs-directive angularjs-scope

首先,这是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个指向全局函数的双向绑定,另一个指向全局函数正在改变的全局变量。但是,以某种方式调用全局函数时,我的监视功能不会被触发。非常感谢任何帮助。

谢谢,

2 个答案:

答案 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)
      });
    }
  }
});

http://plnkr.co/edit/ReqExBvlPuRL5vp7WJ0y?p=preview

答案 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.