angularjs监视服务器变量控制器和指令

时间:2014-09-29 09:07:38

标签: angularjs

我一直在和$ 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);

});

1 个答案:

答案 0 :(得分:0)

setTimeout()是什么? 这个浏览器的本机函数不会导致脏检查,因此ng不会注意到更改(直到下一次脏检查从其他地方触发)。

如果你将其删除,或者用$ timeout替换它(当然,在注入之后),手表会被触发。