私は現在、他の多くのものと一緒にリアルタイムチャットを実装するためにウェブソケットで動作するアプリケーションを開発中です。Ember.computedがEmber.Arrayで更新されない
しかし、Ember.computed
のメンバーにはEmber.NativeArray
の問題があります。
問題を見つけながらいくつか試してみましたが、どれもうまくいかないようです。 私の配列は、このようなサービスで定義されてEmber.NativeArray
です:
messages: Ember.computed('liveSocket.chatMessages', function() {
return this.get('liveSocket').get('chatMessages').toArray().reverse();
}),
そして、私は私のサービスに配列にオブジェクトを設定します。
chatMessages: Ember.A()
私の計算された財産、私のコンポーネントでは、そのように定義されます次のように:
this.get('chatMessages').set(data.id, null);
を私は直接配列を観察した場合、何も(私はそれと混同されることが変化していないが、配列を埋め込む点ということではありませんI n Ember.Arrayオブジェクト?)。さて、liveSocket.chatMessages.length
プロパティを見て、新しい要素の配列を簡単に見ることができます。すべて正常に動作し、新しいメッセージが正しく追加されます。問題はメッセージを削除しようとするときです。 websocketサーバはひどく設計されており、変更することは可能ではありません。削除されたメッセージのインデックスは削除されず、代わりにnull
オブジェクトが返されます。
したがって、配列の長さだけでなく、その要素の変更も監視する必要があります。私は、私の観測された要素リストに[email protected]
を追加しようとしましたが、それはどちらもうまくいきません。それを要約する:
// 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', '[email protected]', ...)
私はここに何かが欠けていますか?配列の長さとそれに含まれるすべての要素を観察する方法はありますか?私のアプローチは間違っていますか?私はEmber 2.6とEmber Data 2.6.1を使用しています。
ありがとうございます!
感謝を!残念なことに、nullの可能性がある純粋なjavascriptオブジェクトが配列に含まれているため、オブジェクト自体が 'null'に設定されているときに計算値を起動する必要があるため、プロパティを確実に確認できるとは思われません。 – blue
@blue nullをオブジェクトに設定するとどういう意味が分かりませんか?オブジェクトが「ヌル」であればそれを取り除いてください –
遅れて申し訳ありませんが、私は昨日締め切りがありました。私は他のことに取り組む必要がありました。問題は、サーバーが現時点ではアレイインデックスに非常に依存しているため、実際には削除できません。代わりに、削除されたメッセージを 'null'に設定します。クライアントは、データ内に配列インデックスが付いているペイロードがあるため、同じことをやる必要があります。そのため、同じ順序を維持する必要があります。 – blue