所以我正在使用Ember.js在XMPP客户端上工作。由于我的数据来自XMPP,我想创建自己的模型并找到这个很好的教程:http://eviltrout.com/2013/03/23/ember-without-data.html和小示例应用程序emberreddit。
设置应该非常简单。我只是扩展Ember.Object并实现一个find函数,它可以创建或返回对象:
App.Conversation = Ember.Object.extend({
messages: [],
talkingPartner: null,
init: function(){
this._super();
console.log("Init called for App.Conversation");
//Binding for XMPP client event
$.subscribe('message.client.im', _.bind(this._onMessage, this));
},
//Private Callbacks
_onMessage: function(event, message){
console.log("Received message");
this.find(message.jid).messages.pushObject(message);
}
});
App.Conversation = Ember.Object.reopenClass({
store: {},
find: function(id){
if(!this.store[id]){
this.store[id] = App.Conversation.create();
}
return this.store[id];
}
});
这大致遵循here的代码。它工作正常,但永远不会调用init
。如果我创建的对象不使用find
则可以。所以我有点困惑。
store
对于所有实例都应该相同
App.Conversation
。那是对的吗?此外,如果这是真的,我必须
将messages
和talkingPartner
移至init
并将其设置为
this.set('message')
,不是我。ìnit
中调用App.Conversateion.create()
时未调用App.Conversation.find(id)
。有谁能解释为什么?我发现Ember.js的行为有时与最初的预期有点不同。答案 0 :(得分:1)
你需要改变这个:
App.Conversation = Ember.Object.reopenClass({
对此:
App.Conversation.reopenClass({
您的代码正在重新打开Ember.Object本身,并完全覆盖App.Conversation
的定义。
根据您的代码,这是working jsFiddle。