2013-04-23 52 views
2

我有以下情形: - 具有大量項目的應用程序。 (1mil +) - 列表1中每個項目的可觀察值。銷燬取消訂閱的觀察對象

如果我從應用程序初始化創建可觀察對象,應用程序將凍結,因爲它需要大量的處理和內存。解決方案是根據需要創建它們,因爲項目一次會以部分形式呈現。這很容易做到。

我需要的是,我解綁後的項目,顯示一個新的批次,銷燬創建的觀察對象,不再使用。

一個解決方案是,當我切換到新批處理時,迭代舊批處理並銷燬。這也很容易做,但不幸的是還不夠。

我的應用程序被拆分成組件,每個組件可能會或可能不會使用主項目池中的項目。這意味着我不能只搜索以前的項目,我解除綁定,只是銷燬observables,但我必須搜索所有組件。從性能角度來看,這並不好,並且由於組件不需要彼此瞭解就不太好。

所以我的問題是。有沒有什麼方法(內置或不是)在淘汰賽中摧毀一個可觀察的,一旦沒有更多的用戶呢?

謝謝。

+0

'ko.computed'必須手動處理,因爲它會創建對其他可觀察對象的新引用,但是一旦沒有更多引用對JS進行垃圾回收時,便可觀察對象。我錯了嗎? – 2013-04-23 13:28:45

+0

不是真的。 ko.computed有以下2個選項:處置時,處置時爲了處理它們而被刪除。觀察對象基本上都附在模型上,所以除非你特意刪除它們,否則它們不會被收集。我的問題是,我需要知道什麼時候處理observables,像disposeWhenNodeIsRemoved這樣的東西絕對是太棒了,但我沒有找到類似的東西或回調。 – 2013-04-23 13:43:44

+0

您的「按需創建邏輯」是在單個位置還是在每個組件中?如果你可以把這個邏輯放在一個單一的位置,你是否也可以跟蹤它們並解除之前的任何一個? – 2013-04-23 15:09:56

回答

0

會不會Delete operator在這種情況下工作?如果刪除某個對象的某些屬性是您想要完成的操作,那麼使用刪除操作符應該做到這一點。

var viewModel = { name: ko.observable("me"),` age: "a lot" }; 

,當你準備(通過事件或其他方式)刪除屬性

$('element').on('event', function() { delete viewModel.prop; }); 

這是假設你要定位的淘汰賽視圖模型對象中的一個屬性。

+0

刪除作爲「刪除的方法」。問題是跟蹤我必須刪除的內容。最初的問題是如果淘汰賽讓我有可能跟蹤而不是自己編寫代碼。 – 2013-05-14 06:21:02

+0

@DumitrescuBogdan我認爲這就是你要找的。 [鏈接](http://www.knockmeout.net/2012/05/using-ko-native-pubsub.html) – 2013-05-14 22:45:23