我目前正在开发一个与websockets配合使用的应用程序来实现实时聊天(以及许多其他事情)。
但是,Ember.computed
会员遇到Ember.NativeArray
会遇到一些问题。
我在谷歌搜索问题时尝试了一些东西,但它们似乎都没有用!
我的数组是在这样的服务中定义的Ember.NativeArray
:
chatMessages: Ember.A()
我的组件中的计算属性定义如下:
messages: Ember.computed('liveSocket.chatMessages', function() {
return this.get('liveSocket').get('chatMessages').toArray().reverse();
}),
我在服务中将对象设置为数组,如下所示:
this.get('chatMessages').set(data.id, null);
如果我直接观察数组,没有任何变化(我可能会对此感到困惑,但是不是在Ember.Array对象中嵌入数组的意思吗?)。现在,我可以通过观察liveSocket.chatMessages.length
属性轻松地观察新元素的数组。一切正常,新消息正确添加。问题是当我尝试删除邮件时。 websocket服务器设计糟糕,更改它是不可能的:它不会删除已删除邮件的索引,而是返回null
个对象。
因此,我不仅需要观察数组长度的变化,还需要观察其元素的变化。我尝试将liveSocket.chatMessages.@each
添加到我观察到的元素列表中,但这也不起作用。总结一下:
// Never updates
Ember.computed('liveSocket.chatMessages', ...)
// Updates only on push/pop (as expected)
Ember.computed('liveSocket.chatMessages.length', ...)
// Still only updates on push/pop
Ember.computed('liveSocket.chatMessages.length', 'liveSocket.chatMessages.@each', ...)
我在这里遗漏了什么吗?有没有办法观察数组的长度及其包含的所有元素?我的做法是错误的吗?我使用的是Ember 2.6和Ember Data 2.6.1。
谢谢!
答案 0 :(得分:1)
我假设你在chatMessages
中拥有属性为title
的对象。
因此,如果您想在每次title
更改任何对象时触发,则需要计算:
Ember.computed('liveSocket.chatMessages.@each.title', ...);