【问题标题】:With GWT, is there a way to not load widgets declared in uibinder xml files?使用 GWT,有没有办法不加载在 uibinder xml 文件中声明的小部件?
【发布时间】:2010-12-01 14:33:40
【问题描述】:

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

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

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

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

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

谢谢

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

如果您认为 GWT 中一定存在这个功能,请star this issue: http://code.google.com/p/google-web-toolkit/issues/detail?id=5699

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

【问题讨论】:

    标签: gwt gwt2 uibinder


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,这似乎是一个很好的方法。我认为这是最好的方法。 20 个月后,我更新了我的投票;)(Thomas,你是我关于 gwt 的大部分答案的赢家,如果你在这些日子里来蒙彼利埃,请告诉我,我会给你一杯酒!)跨度>
    • 请注意,我没有尝试在内容中使用 @UiField(provided=true) 小部件,这也没有经过单元测试。
    • @ThomasBroyer,为什么 LazyPanel 只允许一个孩子?我看不出有什么理由不生多个孩子。现在我必须用SimplePanel 包裹孩子,这让布局太笨拙了。
    【解决方案2】:

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

    widget.removeFromParent();
    

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

    【讨论】:

    • 我想到了这个解决方案,但存在性能问题:实例化和删除小部件:两个 DOM 操作。另一个问题是,如果我需要在构造函数不为空的情况下通过 provided=true 提供小部件,并且在一种情况下我不想提供这个(我不知道要提供什么实例)
    【解决方案3】:

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

    这是在嵌套演示者中使用 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 传递给面板。

    【讨论】:

    • 这个解决方案的问题是我们不能使用简单的处理程序定义,我们不能在 uibinder 中设计小部件
    • 对于简单的事件处理程序:除了以“旧”方式(仍然很好用:))之外,我没有看到任何解决方案。对于样式:在代码中执行(我知道这很痛苦)或在其 UiBinder XML 中设置小部件(可重用的部分)的样式。还是不可能?
    • ...oooor(只是一个想法):创建一个包含这两个小部件 A 和 B 的新 Composite 并让它决定何时以及如何显示什么...
    • 不,我不能这样做,因为这是一个示例,这并不总是相同的小部件 A 和 B ;) 但是很好尝试!我想我会在 GWT 中打开一个 issue,为这个问题提供一个好的和干净的解决方案(例如,如果 provided=true 返回一个 null 小部件,请不要加载它)
    • :) 不是真的。我认为这个问题很好,我正试图帮助找到一个有效的解决方案。扩展流量面板有用吗?它在我的小例子中有效。
    猜你喜欢
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 2011-07-27
    • 2011-02-08
    相关资源
    最近更新 更多