Данные сервисов и контроллеров angularjs не синхронизированы

У меня есть то, что я считал довольно простым приложением AngularJS. Раньше у меня в коде контроллера был простой таймер обратного отсчета, но я решил разбить его на отдельный сервис. Вот тут и начались проблемы.

Раньше, когда мой код таймера был встроен в контроллер, переменная области видимости countdown отображалась правильно - каждую секунду она отсчитывала на единицу меньше, до 0, в соответствии с функцией таймера. Однако теперь, когда я переместил это в службу и передавал данные туда и обратно с некоторыми вызовами функций, countdownvariable отсчитывает 2 числа каждую секунду, а не 1. Если я console.log(countdown); в своей функции rundownClock() службы, правильный номер обратного отсчета отображается каждый проход, однако: 10,9,8,7 ... до 1.

Может ли кто-нибудь понять, что я сейчас делаю не так, и почему происходит этот «двойной счет»? Я неправильно поддерживаю прицел в контроллере?

Вот некоторые из контроллеров с выделенными соответствующими битами CountdownService:

myApp.controller('myCtrl', ['$scope', 'CountdownService', function($scope, CountdownService) {

    // TIMER SERVICES
    $scope.startTimer = CountdownService.startTimer;

    $scope.runClock = function () {

        $scope.updateCountdown();

        if (($scope.countdown > 0) && ($scope.roundStarted == true)) {
            CountdownService.rundownClock($scope.countdown);
        }
    };

    $interval($scope.runClock, 1000);

    $scope.updateCountdown = function () {

        CountdownService.setCurrentRound($scope.currentRound);
        $scope.countdown = CountdownService.getCountdown();
        $scope.roundStarted = CountdownService.getRoundStarted();

    }

    }]);

Вот некоторые из рассматриваемых услуг. (Не беспокойтесь о настройке переменной rounds в начале, это не имеет отношения к проблеме):

myApp
    .factory("CountdownService", function (gameSetUp) {

        var rounds = gameSetUp.rounds,
            roundStarted = false,
            roundFinished = false,
            currentRound = 0,
            countdown = rounds[currentRound].time;

        // grab the round from the controller's scope to set the current round
        function setCurrentRound(round) {
            currentRound = round;
        }

        function getRoundStarted() {
            return roundStarted;
        }

        function getCountdown() {
            return countdown;
        }

        function startTimer() {
            roundStarted = true;
        }

        function rundownClock() {

            if (roundStarted === true) {

                if (countdown > 0) {
                    countdown = countdown - 1;
                }

                if (countdown === 0) {
                    roundFinished = true;
                }
            }
        }

        return {
            startTimer: startTimer,
            rundownClock: rundownClock,
            getCountdown: getCountdown,
            getRoundStarted: getRoundStarted,
            setCurrentRound: setCurrentRound
        };
    });

И, наконец, фрагмент из представления, в котором отображается переменная области обратного отсчета:

<div class="timer md-body-2">{{ countdown }} seconds</div>

person The Pied Pipes    schedule 16.09.2015    source источник
comment
Не должно ли в контроллере быть CountdownService.startTimer ()?   -  person changtung    schedule 16.09.2015
comment
Как насчет использования new Date (). GetTime () / 1000 для хранения начальной секунды и для получения прошедших секунд?   -  person Joao Polo    schedule 16.09.2015
comment
@cyan нет, так как это фактически вызывается onClick другой частью представления. Немного странно, но так работает ... :)   -  person The Pied Pipes    schedule 16.09.2015
comment
rundownClock не имеет параметра, но вызывается с параметром.   -  person Petr Averyanov    schedule 16.09.2015
comment
@JoaozitoPolo да, мне, наверное, следовало начать с использования прошедшего времени, но я сделал это так, как я это сделал ... был бы признателен за любой совет о том, почему данные не синхронизируются между контроллером и сервисом. какая-нибудь подсказка?   -  person The Pied Pipes    schedule 16.09.2015
comment
@PetrAveryanov хороший крик, но это не решает проблему двойного счета. какие-нибудь подсказки?   -  person The Pied Pipes    schedule 16.09.2015
comment
Ok. Вы также можете попробовать включить $ interval в службу и упростить использование контроллера ... Я считаю, что доступ к контроллеру должен быть чем-то вроде CountdownService.count (seconds, callbackFunction)   -  person Joao Polo    schedule 16.09.2015


Ответы (1)


Обновление @downvoter:

Вот рабочая демонстрация (без использования контроллера в маршруте и шаблоне 2 мест)

Вот точное поведение, о котором говорит автор (использование контроллера в маршруте и шаблон)

Мой исходный ответ

Я думаю, ваш myCtrl контроллер запускается дважды, поэтому ваш $interval($scope.runClock, 1000); также работает дважды ...

Используете ли регистрацию myCtrl в качестве контроллера маршрута и в вашем шаблоне с ng-controller?

person Moncef Hassein-bey    schedule 16.09.2015
comment
Ах! Теперь я понимаю, о чем вы говорите, и вы совершенно правы. :) Я использовал ng-controller=myCtrl", а также ng-view. Задача решена! Спасатель жизни! - person The Pied Pipes; 16.09.2015