观看角度服务方法

时间:2014-03-18 01:22:26

标签: javascript angularjs

我正在设置角度,我有以下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监视语句

我错过了什么?

编辑:我认为一些答案集中在setInterval函数上,因为它是我想到的最简单的机制来改变myVal属性。在我的真实应用程序中,这个值由结构JS(画布库)事件更改。

我怎么能说角度来运行一个摘要cicle(因为这个属性可以被观察改变它的值)而不需要手动调用apply(这会导致我出现一些错误&#34;一个应用已经在进行中&# 34;或者其他什么

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

2 个答案:

答案 0 :(得分:0)

并非我完全理解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);
    }
});

DEMO: http://jsfiddle.net/LuNqX/

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

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


<强>参考文献:

答案 1 :(得分:-1)

$ watch正在考虑范围。你要求它观看$ scope [&#39; testService.val()&#39;]哪个不起作用。您可以使用函数作为第一个参数并返回该值。

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