2014-09-02 131 views
1

我是Ember.js的新手,我試圖更新模型中的狀態變量,但是當我更改它時,視圖不會更新。更新模型時不會更新模板輸出

這是我想要做的JavaScript代碼:

App = Ember.Application.create({}); 

App.EventBus = Ember.Object.extend({ 
    eventBus: null, 
    connect: function() { 
     Ember.run.later(this, function() { 
      App.Sessiondata.connection.status = "Online"; 
      console.log("status: " + App.Sessiondata.connection.status) 
     }, 2000) 
    }.on('init') 
}); 

App.Router.map(function() { 
    this.resource('home', { path: '/' }); 
}); 

App.Sessiondata = { 
    connection : { 
     status: 'Offline', 
     statusClass: 'alert-error', 
     retryInterval: 20000, 
     maxAttempts: 5 
    }, 
    user : { 
     fullname: 'Dummy User', 
     email: '[email protected]' 
    }, 
}; 

App.ApplicationRoute = Ember.Route.extend({ 
    model: function() { 
     return App.Sessiondata; 
    } 
}); 

App.ApplicationController = Ember.ObjectController.extend({ 
    eventbus: App.EventBus.create() 
}) 

這裏是的jsfiddle:http://jsfiddle.net/k82Lhj0j/

的想法是,一旦eventbus是開放的,以更新連接狀態。 對於這個小測試,我忽略了真正的事件總線代碼(它確實有效,但與本次測試無關),並簡單地使用run.later來模擬類似的行爲。

正如您所看到的,結果始終爲「狀態:離線」,而它應在2秒後變爲「狀態:在線」。

我可能在Ember.js的工作原理上做錯了什麼,但我沒有看到它。

回答

0

您正在修改普通JavaScript對象,而不是Ember對象。如果您沒有使用ember的'set'方法,Ember將不會注意到屬性發生了更改並且模板需要更新。 該作品(簡化你的例子):

http://emberjs.jsbin.com/yaliyo/1/edit

話雖這麼說,你現在必須處理其他問題找到存儲您的Sessiondata等的ApplicationController是一個選擇的地方,但可能不會最好的。

+0

好的,謝謝。我知道這是明顯的,但我不習慣有特定的對象,而不是普通的JavaScript對象。 – 2014-09-02 10:08:31

+0

是的,你找對存儲Session數據的地方是對的。 這實際上與我目前在Ember.js中遇到的另一個問題有關:您應該在哪裏放置應該在應用程序範圍內可用的數據/代碼? 例如事件總線代碼將不得不通過額外的方法進行擴展,例如發送,發佈等,這些應該可以從整個應用程序中訪問 (編輯:固定錯字) – 2014-09-02 10:11:25