有没有办法在将大量内容添加到容器时暂停qooxdoo布局管理器?

时间:2012-09-19 18:17:13

标签: layout dynamic containers qooxdoo

我基于ajax调用在qooxdoo桌面应用程序中动态创建内容。我正在创建的一些内容中有很多小部件(大约200+)。

我使用谷歌浏览器进行了一些分析,看起来布局管理器占用了大部分处理时间,因为我在容器上为我创建的每个小部件调用add()。

有没有办法在我添加所有小部件时暂停布局管理器,然后让它在最后运行一次?

是否有更好的方法可以动态地向容器添加大量小部件?

这是我正在做的一个例子:

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;
});

2 个答案:

答案 0 :(得分:1)

你可以

  1. 首先将所有小部件添加到“未附加”的容器中,即尚未在任何地方添加的容器或其后代不是布局的一部分

  2. 然后将“未附加”容器添加到布局中,触发窗口小部件布局

答案 1 :(得分:0)

当您添加一个小部件时,它会被添加到一个队列中,以便在线程结束后执行,如果在同一个线程上添加许多小部件,则布局重排将执行一次。

因此,如果一个.add()与下一个之间没有异步,则它们位于同一个线程上,并且它们只进行一次重排。

你在配置文件上看到的时间是布局管理器渲染的正常时间,它必须访问dom以了解某些元素的大小,这个操作需要很多,我做的最后一个配置文件更贵操作是“el.innerWidth”。

如果您想使用Qooxdoo,我认为没有什么可做的。