使用find时,不会在对象上调用init

时间:2013-04-08 13:23:19

标签: ember.js

所以我正在使用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。那是对的吗?此外,如果这是真的,我必须 将messagestalkingPartner移至init并将其设置为 this.set('message'),不是我。
  • 为什么在ìnit中调用App.Conversateion.create()时未调用App.Conversation.find(id)。有谁能解释为什么?我发现Ember.js的行为有时与最初的预期有点不同。

1 个答案:

答案 0 :(得分:1)

你需要改变这个:

App.Conversation = Ember.Object.reopenClass({

对此:

App.Conversation.reopenClass({

您的代码正在重新打开Ember.Object本身,并完全覆盖App.Conversation的定义。

根据您的代码,这是working jsFiddle