我正在设置角度,我有以下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;或者其他什么
我试图通过演示简化我的问题,但如果不清楚我很抱歉
答案 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;
});