2014-09-02 92 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