0

所以我正在使用 Ember.js 开发 XMPP 客户端。由于我的数据来自 XMPP,我想创建自己的模型并找到了这个不错的教程:http ://eviltrout.com/2013/03/23/ember-without-data.html和小示例应用程序emberreddit

设置应该非常简单。我只是扩展 Ember.Object 并实现一个创建或返回对象的查找函数:

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];
    }
});

这大致遵循此处的代码。它工作正常,但从init未被调用。如果我创建不使用find它的对象,它会起作用。所以我有点困惑。

  • 据我所知store,所有 App.Conversation. 那是对的吗?另外,如果这是真的,我必须通过 移动和messages设置它们 ,不是吗?talkingPartnerinitthis.set('message')
  • 为什么在ìnit调用时不App.Conversateion.create()调用App.Conversation.find(id)。谁能解释为什么?我发现 Ember.js 的行为有时与最初预期的有些不同。
4

1 回答 1

1

你需要改变这个:

App.Conversation = Ember.Object.reopenClass({

对此:

App.Conversation.reopenClass({

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

这是一个基于您的代码的工作 jsFiddle 。

于 2013-04-08T13:51:14.503 回答