Ember.computed 未更新 Ember.Array

Ember.computed not updating with Ember.Array

我目前正在开发一个应用程序,该应用程序与 websockets 配合使用以实现实时聊天(以及许多其他功能)。

但是,我对观察 Ember.NativeArrayEmber.computed 成员有一些问题。

我尝试了一些在谷歌搜索问题时发现的东西,但其中 none 似乎有效! 我的数组是在这样的服务中定义的 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 服务器的设计很糟糕,更改它是不可能的:它不会删除已删除邮件的索引,而是 returns 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.

谢谢!

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

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

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