2013-04-17 3 views
0

У меня в приложении 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 

ответ

2

Первая проблема заключается в том, что я не могу изменить маршрут из модели с помощью этого: $ this.transitionToRoute (» проблема ') ;. есть ли способ сделать это из модели?

Вы не можете/не должны обращаться к маршрутизатору с модели. Всякий раз, когда вы считаете это необходимым, это ключ к пониманию того, что, возможно, код, написанный вами, не должен быть моделью. В этом случае Webapp.StatusHelper a действительно должен быть контроллером. Так что-то вроде:

Webapp.StatusController = Ember.Controller.extend({ 
    //your code here 
}); 

Тогда вы можете избавиться от инициализации() App.ready() крючок и вместо того, чтобы использовать setupController крючок вашего ApplicationRoute для настройки и запуска таймера.И, конечно же, поскольку вы сейчас находитесь в контроллере, вы сможете получить доступ к маршрутизатору.

Как я могу остановить его и сделать только одну функцию для работы?

Так что вам нужно начать/остановить таймер при переходе на новые маршруты. Используйте маршруты activate, deactivate и setupController, чтобы включить или выключить таймер при изменении маршрутов. Таким образом вы можете убедиться, что таймер работает только тогда, когда вы этого хотите.

Webapp.IndexRoute = Ember.Route.extend 
  activate: (controller) -> 
    this.controllerFor('status').setTimer 15 
    this.controllerFor('status').start() 

  deactivate: (controller) -> 
    this.controllerFor('status').stop() 

Webapp.IndexRoute = Ember.Route.extend 
  activate: (controller) -> 
    this.controllerFor('status').setTimer 1 
    this.controllerFor('status').start() 

  deactivate: (controller) -> 
    this.controllerFor('status').stop() 
+0

моя проблема с этим подходом ('' Webapp.StatusHelper'' как контроллер) состоит в том, что мы не можем иметь 2 контроллера, отображающих одну страницу/представление. Думайте об этом как о странице электронной почты, у нас есть 2 страницы: все электронные письма и одно электронное письмо. В обоих из них я хочу проверить новые электронные письма, в одном я хочу каждые 5 секунд, а на другом каждые 25 секунд. это то, что я хочу –

+0

OK, что вы хотите, имеет общий смысл, но мне кажется, что 'Webapp.StatusController' поддерживает это. Что вы подразумеваете под «мы не можем иметь 2 контроллера, отображающих одну страницу/представление»? Контейнер Ember гарантирует, что есть только один экземпляр 'Webapp.StatusHelper'. Тогда ваши маршруты setupController hook будут делать что-то вроде 'controllerFor ('status'). Start (5)' и деактивировать hook будет иметь 'controllerFor ('status'). Stop()'. Обновление моего ответа с помощью кода ... –

+0

работал красиво, спасибо –

Смежные вопросы