Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJs指令不拦截服务的更新_Angularjs_Angularjs Directive_Angularjs Service - Fatal编程技术网

AngularJs指令不拦截服务的更新

AngularJs指令不拦截服务的更新,angularjs,angularjs-directive,angularjs-service,Angularjs,Angularjs Directive,Angularjs Service,我试图实现使用服务中的数据并做出相应反应的指令。然而,有些地方出了问题,我需要一些帮助。 下面是代码示例,也可以在 然而,对我来说这似乎是对的。我发现的所有样本都没有使用这个技巧。那么,我是不是遗漏了什么?rootScope解决方案合适吗?也许有更好的方法来实现这个目标? 谢谢 使用Angular的$interval而不是window.setInterval 它实际上是在调用apply-under-the-hoods,因此您的解决方案是正确的,只是稍微复杂一点。还可以模拟$interval进行测

我试图实现使用服务中的数据并做出相应反应的指令。然而,有些地方出了问题,我需要一些帮助。 下面是代码示例,也可以在

然而,对我来说这似乎是对的。我发现的所有样本都没有使用这个技巧。那么,我是不是遗漏了什么?rootScope解决方案合适吗?也许有更好的方法来实现这个目标? 谢谢

使用Angular的$interval而不是window.setInterval


它实际上是在调用apply-under-the-hoods,因此您的解决方案是正确的,只是稍微复杂一点。还可以模拟$interval进行测试。

感谢您的回复,但在实际代码中,服务根本不使用setInterval。它使用媒体查询侦听器来修改内部状态,但出现了完全相同的问题。同样的原则适用。Angular无法知道某些内容已更改,只能将当前值与监视表达式的保存值进行比较。必须有东西触发这个过程,这就是$apply方法。Anguler自己提供的一切,例如$http、ng click等。。。呼叫$apply在引擎盖下。所以你必须有自己的事件处理代码,如果它在Angular之外的话。好的,我明白了……你知道有什么好文章/文档主题/博客文章详细描述了这一点吗?
 var app = angular.module('myApp', []);
 app.service('MyService', [
    '$rootScope', function($rootScope) {
        this.value = 4;
        var self = this;
        function inc(){
           self.value += 3;
        }
        setInterval(inc, 1000);
    }
  ]);
app.directive('myDir', ['MyService', function(MyService){
    return {
        link : function(scope, element){
            function expr(){
                return MyService.value;
            }
            function react(){
                element.html(MyService.value);
            }
            scope.$watch(expr, react);
            react();
        }
    }
}]);

<div ng-app='myApp'my-dir>
</div>
function inc(){
    $rootScope.$apply(function(){
        self.value += 3;
    });
}
setInterval(inc, 1000);