2016-07-06 18 views
0

我目前正在研究一個應用程序,與websockets一起實施實時聊天(以及許多其他事情)。Ember.computed不與Ember.Array更新

但是,我觀察Ember.NativeArrayEmber.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。

謝謝!

回答

1

我假設在chatMessages你有財產對象title

所以,如果要觸發每一次的任何對象的title改變,你需要計算的:

Ember.computed('[email protected]', ...);

+0

謝謝您的回答!不幸的是,我的數組中有純JavaScript對象,可能爲空,所以我不認爲我可以可靠地觀察它們的屬性,因爲當對象本身設置爲「null」時,需要激發我的計算值。 – blue

+0

@blue我不明白你是什麼意思設置空對象?如果一個對象是'null',那麼刪除那個 –

+0

對不起,我昨天有一個截止日期,我需要處理其他事情。事情是,我不能真正刪除它,因爲服務器現在非常依賴數組索引。相反,它將刪除的消息設置爲'null'。客戶端需要做更多或更少的事情,因爲一些有效載荷在數據中帶有數組索引,所以我需要保留完全相同的順序。 – blue