0

我有一个自定义指令,它向链接函数中的作用域添加属性,然后添加一个手表给它。如果我从控制器中更改了范围属性的值,手表就会被触发。如果我从指令内改变相同的值,它不会被解雇。

下面是一个例子:http://jsbin.com/bocixiha/3/edit

见指令里面的setTimeout,这种变化没有任何影响。

p.s:这只是模拟我有什么我没有使用setTimeout,但它的工作原理是一样的。

var app = angular.module('app', []); 

app.controller('myCtrl', function($scope) { 
    $scope.changeProp = function() { 
    $scope.options.someProperty = "Hello Stackoverflow"; 
    }; 
}); 

app.directive('mydir', function() { 
    return { 
    priority: 5001, 
    restrict: 'A', 
    compile: function(element, attrs) { 
     return function(scope, element, attrs) { 
     scope.options = { 
      someProperty: "Hello World" 
     }; 

     setTimeout(function() { 
      console.log("Timeout Fired!"); 
      scope.options.someProperty = "This never gets set"; 
     }, 5000); 

     scope.$watch('options.someProperty', function(n,o) { 
      //This will fire when value changed from controller only. 
      console.log("New: " + n + " Old: " + o); 
     }); 
     }; 
    } 
    }; 
}); 

回答

2

Angular.js需要收到变更通知。 setTimeout本身并不告诉Angular刷新模型;您需要使用$timeout服务而不是setTimeout或将您的setTimeout回调的内容包装在scope.$apply()中,以便使Angular知道范围上的某些内容可能已被更改。

+0

感谢您的快速回复,必填范围。$ apply()在更改后。 –

2

更换setTimeout$timeout .Wheneve模型改变,棱角分明的,应通知使用$timeout功能来更新view.By,该通知将被自动触发,否则,你需要调用$scope.$apply功能。

+0

也感谢您的快速响应。 –

相关问题