2014-09-29 2 views
0

Я долгое время боролся с $ 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); 

}); 

ответ

0

Что такое SetTimeout() для? Эта встроенная функция браузера не приведет к грязной проверке, и поэтому ng не заметит изменения (до тех пор, пока следующая грязная проверка не будет вызвана из другого места).

Если вы удалите его или замените его на $ timeout (после инъекции, конечно,), часы срабатывают.

+0

Да, использование $ timeout может вызывать часы в контроллере, но не может вызвать его в директиве. Как это сделать? – whitecat999

+0

Спасибо, Stephen за быстрый ответ. Я переношу $ timeout в сервисы, тогда часы в контроллере запускаются, но директива по-прежнему не срабатывает. Вот обновленный код http://jsfiddle.net/b3A8B/96/. В основном я хочу видеть, что контроллер и директива способны обнаруживать изменения и реагировать каждый раз, когда изменяется служебная переменная. – whitecat999

+0

1) Директива не используется вообще в скрипке - я добавил

в HTML. 2) В вашем коде есть опечатка: $ scope. $ Watch() внутри директивы должен быть областью. $ Watch (без ведущих $) –

Смежные вопросы