3

我对 GWT 的一个常见设计是创建一个包含两个孩子的小部件:A 和 B。

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

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

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

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

谢谢

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

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

编辑 2:使用 Thomas 描述的 LazyPanel 似乎是处理这个问题的更好方法。

4

3 回答 3

5

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

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

LazyPanel与 UiBinder 完全集成,因此您可以在同一个 UiBinder 模板中声明其内容,就好像它SimplePanelLazyPanel. 请参阅https://developers.google.com/web-toolkit/doc/2.4/DevGuideUiBinder#Lazy

于 2012-08-24T08:42:42.923 回答
1

我会恢复逻辑。如果您不需要小部件,请将其删除

widget.removeFromParent();

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

于 2010-12-01T14:42:25.543 回答
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给面板。

于 2010-12-01T14:49:50.007 回答