简短版:请回复标题。谢谢你的帮助。
更长的版本:我开始了,因为我想很多n00bs都做了,用一些代码,一点一点地添加了一些,并发现自己在一个巨大的控制器中的所有东西。
所以,我拆分了我的功能并拥有一堆较小的控制器。
然后我希望他们彼此沟通。我发现了服务。
然后我读到控制器应该是精益的&意思是我开始将许多逻辑从控制器转移到服务。
现在我发现一些旧的代码,其中包括
$scope.internetConnectionRetryTimer = $interval($scope.attemptInternetConnection, RECONNECT_ATTEMPT_FREQUENCY);
当移入服务时
this.internetConnectionRetryTimer = $interval(this.attemptInternetConnection, RECONNECT_ATTEMPT_FREQUENCY);
似乎没有运行计时器;无论是或者在到期时没有调用该函数。
与短版本相同的问题:我可以在服务中实际使用$ interval吗?
[更新]这里是代码:
全局变量SERVER是一个URL并且var RECONNECT_ATTEMPT_FREQUENCY = 5 * 1000; // 5秒
this.attemptInternetConnection = function()
{
$interval.cancel(this.internetConnectionRetryTimer);
var params = '?action=test_connection&user=dummy';
$http.get(SERVER + params).
success(function()
{
$interval.cancel(this.internetConnectionRetryTimer);
$rootScope.$broadcast('internetIsAvailable');
})
.error(function(status)
{
this.internetConnectionRetryTimer = $interval(this.attemptInternetConnection, RECONNECT_ATTEMPT_FREQUENCY);
$rootScope.$broadcast('internetIsUnavailable');
});
};// attemptInternetConnection()
答案 0 :(得分:5)
没问题。 这是一个例子:
<div ng-app="myApp" ng-controller="myCtrl">{{Data.Test}}</div>
angular.module('myApp', []).
controller('myCtrl', function ($scope, myService) {
$scope.Data = {Test: 'Test'};
myService.ChangeTest($scope.Data);
}).
service('myService', function ($interval) {
this.ChangeTest = function (data) {
$interval(function () {
if (data.Test == 'Test') data.Test = 'Changed Test';
else data.Test = 'Test';
},500);
}
});
这里是Fiddle。
答案 1 :(得分:1)
这应该可以正常工作。虽然这取决于方法attemptInternetConnection
是如何编写的,因为代码未发布。如果您在attemptInternetConnection
中引用特定于服务的任何变量,则应通过引用服务对象来访问它,如下面给出的示例。
演示:http://plnkr.co/edit/1J0qzw044WRHSFGvZyOD?p=preview
app.service('intervalTest', function($interval) {
var me = this;
me.comments = [{
total: 3,
comment: 'some comment 1'
}, {
total: 10,
comment: 'some other comment'
}];
this.getComments = function() {
return me.comments;
};
$interval(function() {
console.log('interval executed');
me.comments[0].total++;
}, 1000);
});