2

ajax 呼び出しに基づいて、qooxdoo デスクトップ アプリケーションで動的にコンテンツを作成しています。私が作成しているコンテンツの一部には、多数のウィジェット (200 以上) が含まれています。

Google Chrome でプロファイリングを行いましたが、作成するすべてのウィジェットのコンテナーで add() を呼び出しているため、処理時間のほとんどがレイアウト マネージャーによって占められているようです。

すべてのウィジェットを追加している間にレイアウト マネージャーを一時停止し、最後に 1 回実行する方法はありますか?

コンテナに多くのウィジェットを動的に追加するためのより良いアプローチはありますか?

これが私がやっていることの例です:

var container = new qx.ui.container.Composite(new qx.ui.layout.Flow());

var groupbox = new qx.ui.groupbox.GroupBox();
groupbox.setLayout(new qx.ui.layout.Grid(10, 10));
container.add(groupbox);

// loop through data received from AJAX call and add it to the group box
var row = 0;
data.each(function(pair) {
    var label = new qx.ui.basic.Label(pair.key);
    var field = new qx.ui.form.TextField(pair.value);
    groupbox.add(label, {row: row, column: 0});
    groupbox.add(field, {row: row, column: 1});
    ++row;
});
4

2 に答える 2

1

あなたはおそらくできる

  1. 最初にすべてのウィジェットを「未接続」のコンテナ、つまりまだどこにも追加されていないコンテナ、またはその先祖がレイアウトの一部ではないコンテナに追加します

  2. 次に、「接続されていない」コンテナをレイアウトに追加し、ウィジェットのレイアウトをトリガーします

于 2012-09-19T19:00:29.067 に答える
0

ウィジェットを追加すると、スレッド終了後に実行されるキューに追加されますが、同じスレッドに多数のウィジェットを追加すると、レイアウト リフローが 1 回実行されます。

したがって、1 つの .add() と次の .add() の間に非同期がない場合、それらは同じスレッド上にあり、1 回のリフローのみを行います。

プロファイルに表示される時間は、レイアウト マネージャーがレンダリングにかかる​​通常の時間です。いくつかの要素のサイズを知るために dom にアクセスする必要があり、この操作には多くの時間がかかります。私が行った最後のプロファイルでは、よりコストのかかる操作でした」 el.innerWidth".

Qooxdooを使いたいならそこまでする必要はないと思います。

于 2012-10-05T11:21:16.453 に答える