2012-12-21 45 views
3

我正在使用淘汰賽mapping plugin爲我自動創建視圖,並且它們工作正常。從具有多個可觀察屬性的對象中獲取一個通知

但是,我使用Raphael.js來生成一個基於我映射對象中的值的量表,但我注意到該量表會重新繪製每個已更新的可觀察值。鑑於頁面上有大量的這些量表,每次從AJAX調用中獲取新數據時,每次重新繪製它們都會重新繪製三次,這對性能並不是很好。

因此,我已經將對象上的所有屬性都改爲了正常的JavaScript屬性,在映射選項中使用了copy

現在我遇到的問題是,一個可觀察的屬性正在更新之前所有的直線javascript屬性已被更新,所以量表的一部分不同步。具體來說,observable屬性是DisplayValue,我將其作爲文本輸出到量表的中間,而我也有一個正常的屬性PercentValue,用於在量表上實際繪製線條。因此DisplayValue在PercentValue之前更新,這會導致標尺重新繪製,這意味着標尺上的線始終顯示最後一個PercentValue,而不是當前的百分比值。

我已經看了throttle extender,看來我必須添加一個計算屬性,其中包含我的observables這個工作,但我不喜歡必須添加屬性的想法只是爲了獲得這個功能。同樣,我假設我可以添加一個可觀察屬性(例如LastUpdated),並在整個對象更新後手動更新該屬性,但這也令人不滿意。

確實似乎有一個combinedObservable提出的問題,所以我想現在沒有辦法按照我想要的方式做這件事。

那麼,有沒有更好的方式來完成這一切?有沒有一些方法可以在observables之前獲得正常的javascript屬性更新?我猜這些屬性是按字母順序處理的?

+1

一種技術是讓observable包含一個對象,分別更新對象屬性,然後調用myObservable.valueHasMutated()或將observable設置爲更新的對象(當新值爲對象,即使它是同一個對象)。 –

+0

爲此歡呼,它確實有幫助,雖然我已經按照你的建議稍微不同地實施了,所以我已經回答了。希望沒關係? –

回答

2

我大部分實現RP的建議,但是,當他把它作爲一個評論,我稍微不同的方式實現它,我想我會在這裏回答這個問題完全,如果它的任何使用其他任何人。

我做了我的計利用正常JS性能,而不是離開DisplayValue作爲可觀察的所有屬性,但我已經添加了一個新的觀察特性的對象,所謂的更新。一旦我使用映射插件將新數據複製到現有對象,我使用上面提到的valueHasMutated方法RP。

ko.mapping.fromJS(point, existingPoint); 
existingPoint.updated.valueHasMutated(); 

我有一個淘汰賽custom binding handler我綁在觀察到的財產使用

ko.utils.unwrapObservable(viewModel.updated); 

,現在我只得到一個更新事件被解僱。很顯然,我仍然不認爲這是理想的,但除非映射插件獲取一旦複製了所有的正常特性可觀察到的已更新的選項只有火,這可能是最好的選擇。

相關問題