我在angularjs(1.x)做一个项目。我的要求是我需要计算经过的秒数。
为此,我在我的控制器中使用$ interval服务编写了一个代码,该代码工作正常。
现在,由于这个代码被很多对象共享,所以我想把它变成单例。我们怎么能这样做?
以下是我在控制器中的代码:
scope.timeDiff = 0;
var intervalId = $interval(function(){
scope.timeDiff += 1000;
},1000);
scope.$on('$destroy',function(){
$interval.clear(intervalId);
});
我试图像这样创建一个计时器服务:
angular.module('myModule').factory('customTimer', ['$interval','$rootScope',
function ($interval,$rootScope) {
var timerId, defaultInterval = 1000;
return {
startTimer: function (timeDiff) {
$interval(function(){
timeDiff += 1000;
},1000);
return timeDiff;
}
};
}]);
然后我尝试在我的控制器中调用此服务,如下所示:
scope.timeDiff = customTimer.startTimer( scope.timeDiff);
console.log( "new timediff:",scope.timeDiff );
虽然timeDiff在我的计时器服务中更新,但控制器总是得到0.可能是什么原因?
答案 0 :(得分:1)
首先,角度服务和工厂已经是单身。
唯一的问题是同步问题。
它的异步调用,所以你必须通过使用回调或承诺来确保它。
在控制器中添加以下方法:
$scope.callback = function(retTime) {
console.log( "new timediff:",retTime);
}
$scope.timeDiff = customTimer.startTimer( scope.timeDiff, $scope.callback);
$scope.$on('$destroy',function(){
customTimer.stopTimer();
});
工厂可以写成如下:
angular.module('myModule').factory('customTimer', ['$interval','$rootScope',
function ($interval,$rootScope) {
var timerId, defaultInterval = 1000;
return {
startTimer: function (timeDiff, callback) {
timerId = $interval(function(){
timeDiff += 1000;
// This if block will ensure your controller callback called after the value of time diff is updated.
if(callback) {
callback(timeDiff)
}
},1000);
return timeDiff;
},
stopTimer: function () {
$interval.cancel(timerId);
}
};
}]);
角度服务可以写成如下:
angular.module('myModule').service('customTimer', ['$interval','$rootScope',
function ($interval,$rootScope) {
var self = this;
self.defaultInterval = 1000;
self.startTimer = function (timeDiff, callback) {
self.timerId = $interval(function(){
timeDiff += 1000;
// This if block will ensure your controller callback called after the value of time diff is updated.
if(callback) {
callback(timeDiff)
}
},1000);
return timeDiff;
}
self.stopTimer = function () {
$interval.cancel(self.timerId);
}
}]);