С GWT, есть ли способ не загружать виджеты, объявленные в XML-файлах uibinder? - PullRequest
3 голосов
/ 01 декабря 2010

Один общий дизайн, который у меня есть с GWT, - это создание виджета, который содержит двух дочерних элементов: A и B.

Я объявляю эти два виджета A и B в файле uibinder, связанном с моим основным виджетом.

Что я хочу сделать - это загружать или не загружать виджет A в зависимости от оператора if.

Идеальным подходом является установка условии = true для виджета A и установка нулевого значения для виджета A, когда я не хочу загружать этот виджет. Но GWT выдает ошибку.

Есть ли способ объявить виджеты в uibinder и затем не загружать их?

спасибо

РЕДАКТИРОВАТЬ: после многих обсуждений идеальным подходом является объявление поля «обеспечено = истина» и «факультативно = истина», когда опционально = истина, createAndBindUI не должен выдавать исключение, если поле пустое. Это чистый подход.

Если вы считаете, что эта функция должна существовать в GWT, отметьте эту проблему следующим образом: http://code.google.com/p/google-web-toolkit/issues/detail?id=5699

РЕДАКТИРОВАТЬ 2: использование LazyPanel, как описано Томасом, кажется, лучший способ справиться с этим.

Ответы [ 3 ]

5 голосов
/ 24 августа 2012

Я наткнулся на проблему GWT, которая привела меня сюда, так что вот мой взгляд на это, 20 месяцев спустя.

Используйте LazyPanel и установите его на visible="false", чтобы его содержимое не былопостроен до тех пор, пока он вам не понадобится (просто вызовите setVisible(true), чтобы открыть его, инициируя ленивую инициализацию его содержимого.

LazyPanel полностью интегрируется с UiBinder, так что вы объявляете его содержимое в том же шаблоне UiBinder,как если бы это был SimplePanel, даже не создавая подкласс LazyPanel. См. https://developers.google.com/web-toolkit/doc/2.4/DevGuideUiBinder#Lazy

1 голос
/ 01 декабря 2010

Поскольку в XML UiBinder не разрешены условные выражения, я бы посоветовал вам определить заполнители (т.е. панели) в вашем ui.xml, иметь ссылку на них в вашем классе представления и решить, есть ли конкретный виджет должен быть создан и добавлен или нет.

Это общий подход при использовании шаблона MVP с вложенными докладчиками.

EDIT:

Пока ваш запрос не будет реализован разработчиками 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 на панель.

1 голос
/ 01 декабря 2010

Я бы изменил логику.Если вам не нужен виджет, удалите его

widget.removeFromParent();

Я думаю, что это более чистый подход, поскольку UIBinder автоматически определяет и создает их.

...