2012-11-05 13 views
15

我們建立使用KnockoutJS,面對表現不佳尤其是在IE8複雜的企業應用。應用程序可能需要超過1GB的RAM,並且永遠不會釋放內存。在調查過程中,我們發現KnockoutJS保持對DOM節點的引用,並且永遠不會刪除它。這可以使用IESieve針對任何公共KnockoutJS示例進行復制,只需在添加和刪除DOM節點的示例中觀看DOM使用。KnockoutJS IE8的性能問題和內存泄漏

有任何人面對這個問題,對於如何來解決這一問題的任何想法?

+0

我還沒遇到過這個問題。也許你的應用程序有問題。 – Tyrsius

+0

幸運的是,不過也有不同的人抱怨@ knockoutjs論壇。你有什麼特別對待IE8? –

+3

我不熟悉Knockoutjs,但我熟悉基於IE的開發。如果Knockoutjs使用引用DOM的JavaScript閉包,這些可能會導致引起懸掛的引用,從而導致性能下降和內存泄漏。爲了解決這些問題,你很可能需要修改javascript庫。 – Anthill

回答

1

大概做時,他們的DOM元素被刪除沒有被釋放事件綁定。如果這是在淘汰賽中發生的事情,您將不得不打補丁並提交拉取請求。

我有這樣的事情發生了很多與backbonejs了。 JavascriptMVC自身清理後稍微好一些。

+2

你在這裏提到的是真實的。問題是事件綁定以及一些dom引用沒有正確發佈。 – ryadavilli

2

我們已經面臨着敲除JS類似問題上IE 8.一個問題領域的是具有可觀察到的陣列(500種+元素)和構建UI(想象一個表或類似列表狀結構)與所有這些的。 唯一能解決這個問題的方法就是改變視圖模型,使它只包含很少幾個可以放在屏幕上的項目。另外,我們必須爲滾動事件添加處理程序,以便可觀察數組不斷更新。並且(對此不太感冒),我們必須在顯示的記錄頂部添加一個空的div,以給出滾動視圖的錯覺。

+0

你能分享一些相同的代碼嗎?我們也在尋找類似的東西。 – Rups

+1

不能給任何代碼,但高級邏輯是這樣的。將所有記錄保存在一個javascript數組中,例如masterData。根據用戶界面標識一次顯示在頁面上的記錄數,如pageSize。現在在第一次加載時,從masterData向VM可觀察數組中只添加pageSize記錄數。還計算了總記錄的總頁面大小。現在到滾動部分。更多下面。 – ryadavilli

+1

爲頁面添加了一個滾動處理程序,其中根據滾動位置和網頁的總高度計算當前索引。現在清空虛擬機並添加主數據,記錄從當前索引開始到當前索引+ pageSize。在第一個呈現的元素之前添加sizeize recordsize * current索引的空白div,以給出正確滾動的錯覺。希望這有助於 – ryadavilli