2012-11-05 15 views
15

KnockoutJSを使用して複雑なエンタープライズアプリケーションを構築し、特にIE8でパフォーマンスが低下しました。アプリケーションには1GBを超えるRAMが必要で、メモリを解放することはありません。調査中、KnockoutJSはDOMノードへの参照を保持し、それを削除しないことを発見しました。これは、公開されているKnockoutJSの例に対してIESieveを使用して再現することができ、DOMノードを追加および削除する例で再生しながらDOMの使用率を監視するだけです。KnockoutJS IE8のパフォーマンス上の問題とメモリリーク

この問題に直面した人は誰ですか?これを解決する方法はありますか?

+0

この問題は発生していません。アプリケーションに問題がある可能性があります。 – Tyrsius

+0

あなたは幸いですが、違う人々も@nockoutjsフォーラムに不満を寄せています。あなたはIE8を扱うために何か特別なことをしますか? –

+3

私はKnockoutjsに慣れていませんが、私はIEベースの開発に精通しています。 KnockoutjsがDOMを参照しているjavascriptクロージャを使用している場合、参照が不足してパフォーマンスが低下し、メモリリークが発生する可能性があります。これらを修正するには、javascriptライブラリを変更する必要があります。 – Anthill

答えて

1

おそらく、DOM要素が削除されたときにイベントバインディングが解放されないことが考えられます。それがノックアウトでボンネットの下で起こっているものなら、パッチを当ててプルリクエストを提出する必要があります。

私はバックボーンズでもこのようなことが起こっています。 JavascriptMVCは、それ自身の後にクリーンアップのための少し良いです。

+2

あなたがここで言及したことは本当です。問題はイベントバインディングであり、DOMリファレンスのいくつかは適切にリリースされていません。 – ryadavilli

2

私たちはIE 8のノックアウトJSに似た問題に直面していました。問題の領域の1つは、観察可能な配列(500+要素)とUI(ビルディングのような表や構造を想像する) 。 私たちのために働いた唯一の回避策は、画面に収まる非常に少数のアイテムしか含まないようにビューモデルを変更することでした。また、スクロールイベントのハンドラを追加して、観測可能な配列がリフレッシュされ続けるようにしなければなりませんでした。そして(それほど誇りではない)、スクロールしたビューの錯覚を与えるために、表示されたレコードの上部に空のdivを追加する必要がありました。

+0

同じコードをいくつか共有できますか?私たちも同じようなものを探しています。 – Rups

+1

コードを入力することはできませんが、ハイレベルのロジックはこのようです。 javascript配列内のすべてのレコード、たとえばmasterDataを保持します。 UIに基づいて、一度にページに表示されるレコードの数を特定しました。たとえばpageSizeです。今すぐ最初の負荷で、masterDataからVMのobservable配列へのpageSizeレコード数だけを追加します。また、合計レコード数に対するレンダリングされたページサイズの合計を計算します。今スクロールする部分に。もっと下に。 – ryadavilli

+1

ページのスクロール・ハンドラを追加しました。スクロール・ハンドラは、スクロール位置とWebページの合計高さに基づいて、現在の索引を計算します。 VMを空にして、現在のインデックスから現在のインデックス+ pageSizeまでのレコードをマスターデータから追加します。最初のレンダリングされた要素の前にサイズrecordsize *現在のインデックスの空のdivを追加して、適切なスクロールの錯覚を与えます。これが役に立ったら – ryadavilli

関連する問題