我正在尝试集成一个与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
答案 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;
}
}
});