Задать вопрос

На какие компоненты разбить приложение на angular 1.5?

Всем привет!
Мне необходимо реализовать таймер. Текст с секундами поместил в директиву с изолированным скопом. Подскажите, пожалуйста, где должна располагаться логика самого таймера, с методами: старт, пауза, ресет, получить\установить текущее значение? Можно в контроллер директивы, но как использовать потом методы в других компонентах?
Можно, конечно, в контроллер приложения всю логику запихать, но тогда потеряется смысл использования ангуляра.
  • Вопрос задан
  • 833 просмотра
Подписаться 4 Оценить 8 комментариев
Решения вопроса 1
Пригласить эксперта
Ответы на вопрос 1
@Kano
Для решения задачи вам даже не нужна директива. Лучше и правильнее воспользоваться компонентом (https://habrahabr.ru/post/277087/), связать свойства компанента start, pause (все значения являются булевскими) с одноименными атрибутами компонента (связывать лучше в одностороннем порядке). В самом компоненнте реализовать всю необходимую логику отсчтета (например через сервис $timeout - https://docs.angularjs.org/api/ng/service/$timeout), не забываем делать отмену ожидания временного интервала через реализацию метода $onDestroy() в компоненте.
Контроллер же через установку своих свойств которые будут связаны с атрибутами компонента будет запускать и останавливать ваш секундомер
Вот пример как это работает output.jsbin.com/camuvetixo
Вот код как это выглядит
//main.js
angular.module("myApp", []);

//app.component.js
angular.module("myApp").component("body", {
    controller: MyAppComponent,
    template: '<a href="javascript:void(0)" ng-click="$ctrl.OnStart()">start</a><br /><a href="javascript:void(0)" ng-click="$ctrl.OnStop()">stop</a><my-timer start="$ctrl.start"></my-timer>'
});
function MyAppComponent() {
    this.start = false;
    this.OnStart = function () {
        this.start = true;
    };
    this.OnStop = function () {
        this.start = false;
    }
}

//timer.component.js
angular.module("myApp").component("myTimer", {
    controller: MyTimerComponent,
    bindings: { start: "<" },
    template: "<div>{{$ctrl.time}}</div>"
});

function MyTimerComponent($timeout) {
    var _start, _cancel, _time = 0;

    function OnTime() {
        _cancel = $timeout(OnTime, 1000);
        _time++;
    }

    function Start() {
        if (_start) return
        _start = true;
        _cancel = $timeout(OnTime, 1000);
    }

    function Stop() {
        if (_start) {
            $timeout.cancel(_cancel);
            _time = 0;
            _start = false;
        }
    }

    Object.defineProperty(this, "start", {
        get: function () {
            return _start;
        },
        set: function (value) {
            if (_start != value) {
                if (value)
                    Start();
                else
                    Stop();
            }
        }
    });
    Object.defineProperty(this, "time", {
        get: function () {
            return _time;
        }
    });

    this.$onDestroy = Stop;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы