我目前正在研究一個應用程序,與websockets一起實施實時聊天(以及許多其他事情)。Ember.computed不與Ember.Array更新
但是,我觀察Ember.NativeArray
的Ember.computed
成員有一些問題。
我試着用Google搜索這個問題時發現了一些事情,但他們都沒有工作! 我的陣列是在服務定義像這樣的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);
如果我直接觀察陣列,沒有什麼變化(I可以與混淆,但是,這不是嵌入的陣列的點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。
謝謝!
謝謝您的回答!不幸的是,我的數組中有純JavaScript對象,可能爲空,所以我不認爲我可以可靠地觀察它們的屬性,因爲當對象本身設置爲「null」時,需要激發我的計算值。 – blue
@blue我不明白你是什麼意思設置空對象?如果一個對象是'null',那麼刪除那個 –
對不起,我昨天有一個截止日期,我需要處理其他事情。事情是,我不能真正刪除它,因爲服務器現在非常依賴數組索引。相反,它將刪除的消息設置爲'null'。客戶端需要做更多或更少的事情,因爲一些有效載荷在數據中帶有數組索引,所以我需要保留完全相同的順序。 – blue