2013-04-17 40 views
0

我在我的emberjs應用程序中有一個沒有任何數據庫數據的模型。我創建了這個模型,因爲我想要一些對象來集中服務器的一些請求,但不綁定到控制器或視圖。emberjs模型中的SetTimeout

類似: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;博士

  • 如何更改從內部控制器路線?
  • 我怎麼能只有一個函數運行間隔?
  • 還有其他(更好)的方法嗎?


編輯

我的庫版本:

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 
}); 

然後你就可以擺脫的init()App.ready()掛鉤,而是用你的ApplicationRoute的setupController鉤來配置和啓動定時器。當然,因爲您現在處於控制器中,您將能夠訪問路由器。

我該如何阻止它,並只有一個功能工作?

所以基本上你需要在轉換到新路線時啓動/停止計時器。當路由改變時,使用路由的activate,deactivatesetupController掛鉤來打開/關閉定時器。這樣你可以確保定時器只在你想要的時候運行。

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

確定你想要的總是有意義的,但在我看來'Webapp.StatusController'支持這一點。 「我們不能讓2個控制器渲染一個頁面/視圖」是什麼意思? Ember容器將確保只有一個「Webapp.StatusHelper」實例。然後你的路由setupController鉤子會做一些事情,比如'controllerFor('status').start(5)'和停用hook將會有'controllerFor('status')。stop()'。用代碼更新我的答案... –

+0

很好地工作,謝謝 –