2014-07-01 129 views
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

也感謝您的快速響應。 –

相關問題