Ember.computed 未更新 Ember.Array
Ember.computed not updating with Ember.Array
我目前正在开发一个应用程序,该应用程序与 websockets 配合使用以实现实时聊天(以及许多其他功能)。
但是,我对观察 Ember.NativeArray
的 Ember.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', ...);
我目前正在开发一个应用程序,该应用程序与 websockets 配合使用以实现实时聊天(以及许多其他功能)。
但是,我对观察 Ember.NativeArray
的 Ember.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', ...);