我在我的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
我用這種方法(''Webapp.StatusHelper''作爲控制器)的問題是我們不能讓2個控制器渲染一個頁面/視圖。把它想象成一個電子郵件頁面,我們有2頁:所有電子郵件和一封電子郵件。在他們兩個我想檢查新的電子郵件,在一個我想每隔5秒,另一個每25秒。這就是我想要的 –
確定你想要的總是有意義的,但在我看來'Webapp.StatusController'支持這一點。 「我們不能讓2個控制器渲染一個頁面/視圖」是什麼意思? Ember容器將確保只有一個「Webapp.StatusHelper」實例。然後你的路由setupController鉤子會做一些事情,比如'controllerFor('status').start(5)'和停用hook將會有'controllerFor('status')。stop()'。用代碼更新我的答案... –
很好地工作,謝謝 –