我一直在和$ watch一直挣扎。当服务中的共享变量发生变化时,我希望从控制器和指令触发$ watch。但由于某种原因,它们不会被触发。我是Angularjs的新手,可能对$ watch的工作方式有错误的理解。这是我的实验代码。 http://jsfiddle.net/b3A8B/84/
myApp = angular.module('myApp', []);
myApp.directive('myDirective', ['myService', function(myService) {
return {
controller: function ($scope, myService) {
},
restrict: 'A',
link: function(scope) {
$scope.$watch(function () {
return myService.tag;
},
function(newVal, oldVal) {
console.log("Inside directive watch");
console.log(newVal);
console.log(oldVal);
}, true);
}
}}]);
myApp.service('myService', function() {
var tags = {
a: true,
b: true
};
var setFalseTag = function() {
console.log("Within myService->setFalseTag");
tags.a = false;
tags.b = false;
};
return {
tag: tags,
setFalseTagA: setFalseTag
};
});
myApp.controller('MyCtrl', function($scope, myService) {
$scope.setFTag = function() {
console.log("Within MyCtrl->setFTag");
setTimeout(function(){console.log("delay");myService.setFalseTagA();}, 2000)
};
$scope.$watch(function () {
return myService.tag;
},
function(newVal, oldVal) {
console.log("Inside controller watch");
console.log(newVal);
console.log(oldVal);
}, true);
});
答案 0 :(得分:0)
setTimeout()是什么? 这个浏览器的本机函数不会导致脏检查,因此ng不会注意到更改(直到下一次脏检查从其他地方触发)。
如果你将其删除,或者用$ timeout替换它(当然,在注入之后),手表会被触发。