使用GWT,有没有办法不加载在uibinder xml文件中声明的小部件?

时间:2010-12-01 14:33:40

标签: gwt gwt2 uibinder

我使用GWT的一个常见设计是创建一个包含两个子节点的小部件:A和B.

我在与我的主要小部件关联的uibinder文件中声明了这两个小部件A和B.

我想要做的是根据if语句加载或不加载小部件A.

理想的方法是为小部件A设置provided = true,并在我不想加载此小部件时将小部件A设置为null。但GWT会引发错误。

有没有办法在uibinder中声明小部件然后不加载它们?

感谢

编辑:经过大量讨论后,理想的方法是在optional = true时声明一个字段“provided = true”和“optional = true”,如果该字段为null,则createAndBindUI不得抛出异常。这是一个干净的方法。

如果您认为此功能必须存在于GWT中,请为此问题加注星标: http://code.google.com/p/google-web-toolkit/issues/detail?id=5699

编辑2:使用Thomas描述的LazyPanel似乎是一种更好的方法来解决这个问题。

3 个答案:

答案 0 :(得分:5)

我偶然发现了GWT问题,这导致我来到这里,所以这是我对它的看法,20个月后。

使用LazyPanel并将其设置为visible="false",以便在您需要之前不会构建内容(只需调用setVisible(true)即可显示内容,从而触发其内容的延迟初始化

LazyPanel与UiBinder完全集成,因此您可以在同一个UiBinder模板中声明其内容,就像它是SimplePanel一样,甚至无需创建LazyPanel的子类。见https://developers.google.com/web-toolkit/doc/2.4/DevGuideUiBinder#Lazy

答案 1 :(得分:1)

我会恢复逻辑。如果您不需要小部件删除它

widget.removeFromParent();

我认为这是一种更简洁的方法,因为UIBinder会自动定义和创建它们。

答案 2 :(得分:1)

由于UiBinder XML中不允许使用条件,我建议您在ui.xml中定义占位符(即面板),在视图类中引用它们并决定是否需要创建和添加特定小部件。

将MVP模式与嵌套演示者一起使用时,这是一种常见方法。

编辑:

在您的请求由GWT开发人员实施之前,您可以扩展FlowPanel并覆盖add(Widget)方法以检查null,如下所示:

public class ExtendedFlowPanel extends FlowPanel {

    public ExtendedFlowPanel() {
        super();
    }

    @Override
    public void add(Widget w) {
        if (w != null) {
            super.add(w);
        }
    }
}

这样您就可以使用provided = true并将null传递给面板。