Просто чтобы уточнить, что не так с вашим текущим кодом (и не обязательно рекламировать это как решение), вы должны изменить значение, чтобы наблюдатель срабатывал.Если вы установите значение true
, а затем снова установите его на true
, даже не установив false
, Ember внутренне проигнорирует это и не вызовет наблюдателя.См. twiddle , чтобы увидеть рабочий пример с использованием наблюдателей.
Код
init(){
this._super(...arguments);
this.set('count', 0);
this.set('execute', true);
this.timer();
},
timer: observer('execute', function(){
//this code is called on set to false or true
if(this.get('execute')){
Ember.run.later((() => {
this.functionThatIsRunningEachTwoSeconds();
}), 2000);
// THIS IS SUPER IMPORTANT, COMMENT THIS OUT AND YOU ONLY GET 1 ITERATION
this.set('execute', false);
}
}),
functionThatIsRunningEachTwoSeconds(){
let count = this.get('count');
this.set('count', count + 1);
this.set('execute', true);
}
Теперь, когда вы знаете, что не так с вашим текущим подходом, позвольте мне вернутьсяснова записать и предположить, что это не очень хороший, интуитивно понятный способ организовать повторный цикл.Я также рекомендую Ember-Concurrency, поскольку он поддерживает жизненный цикл Ember
Если вы обработали кнопку редактирования на маршруте, вы могли бы очень аккуратно отменить ее при изменении маршрута
functionThatIsRunningEachTwoSeconds: task(function * (id) {
try {
while (true) {
yield timeout(2000);
//work function
}
} finally {
//if you wanted code after cancel
}
}).cancelOn('deactivate').restartable()
Деактивировать соответствуетна конец деактивировать перехват маршрута / событие:
Этот перехват выполняется, когда маршрутизатор полностью выходит из этого маршрута.Не выполняется при изменении модели маршрута.