Я долгое время боролся с $ watch. Я хочу, чтобы $ watch запускался с контроллера и директивы при изменении общей переменной в сервисе. Но по какой-то причине они не срабатывают. Я новичок в Angularjs и, вероятно, неправильно понимаю, как работает часы $. Вот мой экспериментальный код. http://jsfiddle.net/b3A8B/84/angularjs watch service переменные изменения в контроллере и директиве
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);
});
Да, использование $ timeout может вызывать часы в контроллере, но не может вызвать его в директиве. Как это сделать? – whitecat999
Спасибо, Stephen за быстрый ответ. Я переношу $ timeout в сервисы, тогда часы в контроллере запускаются, но директива по-прежнему не срабатывает. Вот обновленный код http://jsfiddle.net/b3A8B/96/. В основном я хочу видеть, что контроллер и директива способны обнаруживать изменения и реагировать каждый раз, когда изменяется служебная переменная. – whitecat999
1) Директива не используется вообще в скрипке - я добавил
в HTML. 2) В вашем коде есть опечатка: $ scope. $ Watch() внутри директивы должен быть областью. $ Watch (без ведущих $) –