在编辑模式下,为什么延迟加载在我的表中这么慢?

时间:2013-09-23 15:48:35

标签: vaadin vaadin7

我有一个包含15列的表,总共约有4000行。我需要使一些列可编辑,所以我正在使用TableFieldFactory。

问题在于,当我进入编辑模式时,事情的加载速度非常慢。当我向下滚动并且延迟加载加载另一个缓冲区时,在重新绘制表之前最多可能需要20秒。

即使只有一列可编辑,它也会加载得无法忍受。

@Override
public Field<?> createField(Container container, Object itemId, Object propertyId, com.vaadin.ui.Component uiContext) {

    TextField tField = (TextField) DefaultFieldFactory.get().createField(container, itemId, propertyId, uiContext);
    tField.setImmediate(true);

    if (propertyId.equals("Foo") {
        return tField;
    }
    else {
        tField.setReadOnly(true);
    }

    return tField;
}

在一个延迟加载中,加载了大约500-1000行,因此createField()被调用可能是7500-15000次,但这是Vaadin的已知限制还是我做错了什么?也许我不应该首先使用TableFieldFactory,因为有这么多列?

有没有人知道是否有更好的方法来实现上面提到的表,而没有获得这些疯狂的缓冲区加载时间?

提前致谢!

1 个答案:

答案 0 :(得分:2)

当您说“一行可编辑”时 - 您是否仍在创建只读字段(如上面的引用代码中所示)?

别。

从FieldFactory返回null(以及非“Foo”字段)。如果希望列可编辑,则只返回Field工厂中的字段:如果不可以,则返回null。

无字段和只读字段之间存在很大差异:没有字段(或字段工厂),Vaadin只会生成一个非常简单的<div>,没有监听器或其他任何东西。一旦你开始在一个大的Vaadin表中有很多组件,你就会看到某种性能下降。

所以 - 首先,我会将您的现场工厂更改为以下内容。

@Override
public Field<?> createField(Container container, Object itemId, Object propertyId, com.vaadin.ui.Component uiContext) {

 if (propertyId.equals("Foo") {
   TextField tField = (TextField) DefaultFieldFactory.get().createField(container, itemId, propertyId, uiContext);
   tField.setImmediate(true);

   return tField;
 }

 return null;
}

如果这没有产生足够大的差异,我会将工厂更改为仅为当前选定的行创建字段。