У меня в приложении emberjs есть модель, которая не имеет данных базы данных. Я создал эту модель, потому что мне нужен какой-то объект, который объединяет некоторые запросы с сервера, но не привязан к контроллеру или виду.SetTimeout внутри emberjs model
что-то вроде: StatusChecker
внутри моей Application.create я сделать так:
Webapp = Ember.Application.create({
rootElement: '#content',
LOG_TRANSITIONS: true,
ready: function() {
return Webapp.status_helper = Webapp.StatusHelper.create({
timer: 15
});
}
});
это экземпляр Webapp.StatusHelper
объект, который должен быть уникальным для данного приложения. когда я называю init
на этом объекте я также запустить опрос с использованием таймера по умолчанию:
Webapp.StatusHelper = Ember.Object.extend({
init: function(params) {
this.timer = this.get("timer");
this.timeoutID = null;
this.controller = null;
this.start();
},
start: function() {
this.execute();
},
stop: function() {
clearTimeout(this.timeoutID);
},
setTimer: function(newTime) {
this.stop();
this.timer = newTime;
this.start();
},
execute: function() {
var $this = this;
this.stop();
$.get("/status").done(function(data) {
console.log(data);
if (data["status"] === 0) { // Continue trying
$this.timeoutID = setTimeout(function() {
$this.execute();
}, $this.timer * 1000);
} else if (data["status"] === 1) { // Go to a given controller
$this.setTimer(15);
$this.transitionToRoute('index'); // This doesn't work
} else {
$this.setTimer(15);
$this.transitionToRoute('problem'); // This doesn't work
}
});
}
});
Первая проблема заключается в том, что я не могу изменить маршрут из модели с помощью этого: $this.transitionToRoute('problem');
. есть ли способ сделать это из модели?
вторая проблема заключается в том, что иногда, когда я получаю в контроллер я должен указать интервал для StatusHelper
сразу после того, мне нужно, чтобы остановить этот таймер и запустить его с другим интервалом, например:
Webapp.IndexRoute = Ember.Route.extend
setupController: (controller) ->
Webapp.status_helper.setTimer 15
Webapp.ProblemRoute = Ember.Route.extend
setupController: (controller) ->
Webapp.status_helper.setTimer 1
это происходит потому, что мне нужно проверить, была ли проблема решена каждую секунду, а индексная страница переходит на страницу проблем, когда это необходимо. После перехода я получаю 2, а иногда и больше, интервалы, работающие на одной и той же работе.
как я могу остановить его и сделать только одну функцию для работы?
P.S .: Если вы обнаружите, что мне нужно изменить модель с чем-то другим, я могу ее изменить.
TL; др
- Как изменить маршруты из внутри контроллера?
- Как я могу использовать только одну функцию с интервалом?
- есть другой (лучше) способ?
EDIT
Версия моих библиотек:
DEBUG: Ember.VERSION : 1.0.0-rc.1 ember.js:348
DEBUG: Handlebars.VERSION : 1.0.0-rc.3 ember.js:348
DEBUG: jQuery.VERSION : 1.9.1
моя проблема с этим подходом ('' Webapp.StatusHelper'' как контроллер) состоит в том, что мы не можем иметь 2 контроллера, отображающих одну страницу/представление. Думайте об этом как о странице электронной почты, у нас есть 2 страницы: все электронные письма и одно электронное письмо. В обоих из них я хочу проверить новые электронные письма, в одном я хочу каждые 5 секунд, а на другом каждые 25 секунд. это то, что я хочу –
OK, что вы хотите, имеет общий смысл, но мне кажется, что 'Webapp.StatusController' поддерживает это. Что вы подразумеваете под «мы не можем иметь 2 контроллера, отображающих одну страницу/представление»? Контейнер Ember гарантирует, что есть только один экземпляр 'Webapp.StatusHelper'. Тогда ваши маршруты setupController hook будут делать что-то вроде 'controllerFor ('status'). Start (5)' и деактивировать hook будет иметь 'controllerFor ('status'). Stop()'. Обновление моего ответа с помощью кода ... –
работал красиво, спасибо –