Ember.computed没有使用Ember.Array进行更新

时间:2016-07-06 14:30:01

标签: ember.js ember-data

我目前正在开发一个与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。

谢谢!

1 个答案:

答案 0 :(得分:1)

我假设你在chatMessages中拥有属性为title的对象。

因此,如果您想在每次title更改任何对象时触发,则需要计算:

Ember.computed('liveSocket.chatMessages.@each.title', ...);