【问题标题】:Watch angular service methods观看角度服务方法
【发布时间】:2014-03-18 01:22:25
【问题描述】:

我进入 Angular 并且我有以下code

html

<div ng-controller="Ctrl">
    <p>{{val}}</p>
</div>

javascript

var app = angular.module('myApp', []);

app.service('testService', function(){
    var myVal = new Date();

    this.val = function(){
        return myVal;
    };

    setInterval(function () { myVal = new Date(); console.log(myVal);}, 3000);
});

function Ctrl($scope, testService)
{
    $scope.testService = testService;
    $scope.val = testService.val();
    $scope.$watch('testService.val()', function (newVal) {
        $scope.val = newVal;        
    });

}

但是即使 setInterval 正在执行它也不会触发 Ctrl 监视语句

我错过了什么?

编辑:当我想到更改 myVal 属性的最简单机制时,我认为一些答案集中在 setInterval 函数上。在我的真实应用程序中,这个值被织物 JS(画布库)事件更改。

我怎么能说 angular 运行一个摘要 cicle(因为这个应该被监视的属性改变了它的值)而不手动调用 apply (这导致我出现一些错误,因为“应用程序已经在处理中”或其他东西

我试图通过演示来简化我的问题,但如果不清楚,我很抱歉

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    并不是说我完全理解 AngularJS,但我相信 setInterval 不会导致 Angular 运行摘要循环,这会导致 $watch 看到变化。使用$timeout,你可以得到你想要的。以下是我如何设置您的服务的示例:

    app.service('testService', function ($timeout) {
        var myVal = new Date();
    
        this.val = function(){
            return myVal;
        };
    
        updateVal();
    
        function updateVal() {
            myVal = new Date();
            console.log(myVal);
            $timeout(updateVal, 1000);
        }
    });
    

    演示: http://jsfiddle.net/LuNqX/

    演示的超时时间更短,以便更好地查看更改。

    另外,我更新了控制器,因为服务的使用方式看起来很奇怪。


    参考资料:

    【讨论】:

      【解决方案2】:

      $watch 正在查看范围。您要求它观看不起作用的 $scope['testService.val()']。您可以使用函数作为第一个参数并返回该值。

      $scope.$watch(function() { return testService.val(); } , function (newVal) {
          $scope.val = newVal;        
      });
      

      【讨论】:

      • 虽然我同意这是我认为应该这样做的方式(就像我的回答一样),但这不是问题。 OP 的方式应该可以工作,但我认为这很奇怪/不必要。这是 OP 的 $watching 工作方式:jsfiddle.net/p76Hn。我认为这只有效,因为 OP 确实 $scope.testService = testService; 这对我来说似乎很疯狂
      • 新版本也有 $interval,如果你真的想按照 OP 发布的方式来做的话。
      • 我注意到引用的值有效,因为我将它设置在范围属性上(这是我使用的示例,因为这是我最后一次尝试)。但我认为答案的方向是错误的,因为他们专注于 setInterval 函数,这是我想到的最简单的方法来更改服务属性 myVal 的值。
      猜你喜欢
      • 2015-07-05
      • 2013-06-14
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多