断言失败:必须使用Ember.set()将属性([object Object])设置为`[object Object]`

时间:2017-03-04 04:10:29

标签: javascript networking ember.js websocket

我正在尝试集成一个与EmberJS构建的Javascript库。

几乎正常工作的示例: https://github.com/pubnub/open-chat-framework/blob/ember/examples/ember

库返回一个包含许多嵌套对象的对象。该库基于网络事件,因此子对象在没有用户输入的情况下定期更新。可以收听的更新的火灾事件。

这会导致EmberJS出现问题,因为Ember需要通过我的库不使用的Ember.set()来完成每个属性更新。

该库是一个通用的JS库,因此我拒绝为其添加Ember特定代码。我想知道如何在不重写我的库的情况下解决上述错误。

如何以Ember想要的方式包装基于事件的库?我之前尝试过全局和Ember服务。

在其他示例中,我看到人们用Ember特定代码包装库的每个方法。这似乎是重复的。

是否可以手动告知Ember对根对象的更改并让Ember忽略所有其他更改?意思是,我可以在没有观察到变化的情况下,并在事情发生变化时手动告诉余烬吗?

该库包含一个根事件发射器,通知树中任何对象的所有更改。

ember-cli: 2.11.1
node: 6.7.0
os: darwin x64

1 个答案:

答案 0 :(得分:0)

您无需更改自己创建的强大的库。

每个人都想使用它,应该以ember的方式使用它。

只需更改此示例的控制器:

import Ember from 'ember';

export default Ember.Controller.extend({

    OCF: null,
    me: null,
    messages: [],
    messageInput: '',
    init: function() {

        this._super(...arguments);

        // test
        let OCF = window.OpenChatFramework.create({
          rltm: {
              service: 'pubnub', 
              config: {
                  publishKey: 'pub-c-07824b7a-6637-4e6d-91b4-7f0505d3de3f',
                  subscribeKey: 'sub-c-43b48ad6-d453-11e6-bd29-0619f8945a4f',
                  restore: false
              }
          },
          globalChannel: 'ocf-demo-ember-2'
        });
    this.set('OCF', OCF);

        // create a user for myself and store as ```me```
        let me = this.get('OCF').connect(new Date().getTime());
    this.set('me', me);

        this.get('me').plugin(window.OpenChatFramework.plugin.randomUsername(this.get('OCF').globalChat));

        this.get('OCF').globalChat.on('message', (payload) => {
          console.log(payload)
          this.get('messages').pushObject(payload);
        });

    },
    actions: {
        sendChat: function() {
            let messageInput = this.get('messageInput');
            if(messageInput) {

                this.get('OCF').globalChat.send('message', {
                    text: messageInput
                });

                Ember.set(this, 'messageInput', '');

            }

            return false;

        }
    }
});