3

IE8のノックアウトマッピングプラグインに問題があります。私たちの状況は、クライアントに表示できるすべての可能なレコードを送信することです。次に、レスポンシブシステムのクライアント側ですべてのページングとフィルタリングを処理します。

現在、jQueryajaxを介してjQueryテンプレートベースのグリッドに表示する250レコードのリストを送信しています。オブジェクトをマップするためにko.mapping.fromJS(fromJSON関数ではない)を呼び出すと、IE8から「スクリプトに時間がかかりすぎています」というメッセージが表示されます。FFとChromeでは、Javaスクリプトの実行速度がはるかに速いため、発生しません。

マッピングを調整する簡単な方法はありますか?クライアントに送信するレコードが1000近くある状況になる可能性があるため、これは長期的な問題です。

4

3 に答える 3

2

IEはやんちゃな子です.....そうではありません。

JavaScriptを使用してデータバインディングを実行するときに、UIが大幅に更新される場合は、次のようにします。

function ajaxCallback(listOfDataItems){

  var addToUiFunction = function(item){
     // add it to the ko.observable array which is data bound to the UI
     myDataBoundArray.push(item);
  };

  for (var i = 0, arrayLength = listOfDataItems.length; i < arrayLength; i++){
    var temp = listOfDataItems[i];

    //create an immediately executing function to close around
    //the item that returns a function to call at a later date.
    var tempFunction = (function(){
      var item = temp;
      return function() { addToUiFunction(item) };
    })();

    setTimeout(tempFunction, 0);

  }
}

ここで起こったことは、一度に1つのアイテムだけをUIに追加することです。現在の呼び出しが終了するまで個々の追加の実行を延期するために、遅延0でsetTimeoutを使用します。これは、ブラウザがタイムアウトしない非常に短い作業単位を意味します。

psコードは少し危険です、それは単に要点を説明しようとしているだけです。

于 2012-04-02T23:14:06.043 に答える
0

これが理想的な答えではないことは知っていますが、状況が許せば、常に内部アイテムをマップすることはできません。元。ajax呼び出しが1000人を返し、UIを更新してそれらすべての人を表示したい場合は、ビューモデルにraw人のjsオブジェクトのobservableArrayを含めることができます(koマップされた同等のものではありません)。observableArrayにアイテムを追加または削除すると、UIに正しく表示されますが、各ユーザーのすべてのプロパティのすべてのプロパティ変更イベントをサブスクライブする必要がある場合は役に立ちません。

通常、これだけ多くのアイテムを取得する場合、これはレポート用であるため、アイテム自体を編集する必要はありませんが、フィルター基準に応じてレポートに行を追加/削除する必要があります。

于 2012-12-12T22:11:40.940 に答える
0

私たちも同じ問題を抱えていました。私たちのビューモデルには計算されたオブザーバブルが多すぎて、スクリプトの実行が遅くなりました。不要なサブスクライブを削除すると、この問題を回避できる場合があります。

于 2012-07-06T15:17:31.003 に答える