Во-первых, угловая служба и фабрика уже одиночные.
Единственная проблема - это проблема синхронизации.
Это асинхронный вызов, поэтому вы должны убедиться в этом с помощью обратного вызова или обещания.
В контроллере добавьте следующие методы:
$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);
}
}]);