2012-02-02 74 views
1

當我的用戶登錄時,我從服務器加載一堆數據。這需要花費很多時間,因爲似乎每一次對observableArray()的添加都會更新依賴的觀察值。我想推遲評估所有依賴關係,直到所有數據加載完畢。我已經看到如何使用deferEvaluation: true來影響特定ko.computed()變量的行爲,但我希望將observable隔離直到我知道它已完成更新,然後使整個模型無效以重新繪製視圖。當使用knockoutjs加載數據時推遲依賴關係

我創建了一個jsfiddle來說明問題。請注意,在我的真實代碼中,我使用映射插件來加載對象,但在此我只模擬了每個狀態更改都會調用的.subscribe函數的所有依賴關係。我想阻止它直到最後才被調用。

回答

4

通常情況下,在這種情況下,您可以從observableArray訪問底層數組並推送到它。然後,您要麼將最後一個推向observableArray,要麼撥打myObservableArray.valueHasMutated()

所以,總的來說它看起來像:

var underlyingArray = this.items(); 
underlyingArray.push(one); 
underlyingArray.push(two); 
underlyingArray.push(three); 
this.items.valueHasMutated(); 

在你的小提琴,你可以做this.document().history().push(this);。然後,如果您希望訂閱運行,則必須返回並在受影響的文檔上調用valueHasMutated()。

+1

這個解決方案的一個問題是它似乎不適用於'ko.mapping'插件。在通話完成之前,我看到更新從'ko.mapping.fromJS'調用中傳播到顯示器。 – 2012-02-02 22:54:20