Обмен данными между диалоговыми окнами
По моему мнению, "правильный" способ сделать это - реализовать некую структуру MVP в приложении, чтобы докладчик управлял представлением (DialogBox
es, среди прочего) и знает, как передать простые данные в представление для отображения (докладчик будет обрабатывать данные MapWidget
, представление позаботится о его отображении в DOM).
Однако, если вы ищете более быстрый / более простой подход, у вас есть несколько вариантов (которые вы действительно выбираете, зависит от структуры приложения):
- Создайте
Composite
, как вы упомянули, который знает, как передавать необходимые данные туда и обратно. Имея Composite
управляющий объектом данных и сообщающий двум DialogBox
о том, как его отобразить, вы фактически приближаетесь к архитектуре MVP в пределах Composite
.
- Подкласс
DialogBox
в класс, который содержит HandlerManager
(иногда используется в качестве "Шины событий"), которая генерирует события при нажатии кнопки. Вы можете создавать события, предназначенные для передачи данных назад и вперед между двумя DialogBox
(даже сделать их безопасными с помощью параметров типа). См. этот вопрос StackOverflow для получения подробной информации об использовании HandlerManager
. Статья MVP, ссылка на которую приведена выше, также содержит некоторую полезную информацию об использовании шины событий .
Model-View-Presenter - это проверенный метод структурирования приложения, который дает более тестируемый код, лучшую структуру проекта и может помочь вам при принятии таких решений. Я настоятельно рекомендую проверить это, если вы еще этого не сделали.
Совместное использование функции автоматического скрытия
GWT PopupPanel
(на котором основан DialogBox
) предлагает метод addAutoHidePartner(Element)
, который описан таким образом:
События мыши, происходящие в партнере autoHide, не скрывают панель, для которой установлено значение autoHide.
Таким образом, вы можете создать два автоматически скрываемых DialogBox
, которые закрываются только при нажатии за пределами их обоих (например, они не закрываются, когда вы щелкаете в любом из полей) со следующим кодом:
// Create the dialog boxes
DialogBox dbox1 = new DialogBox(true, false);
DialogBox dbox2 = new DialogBox(true, false);
// Set some visual options
dbox1.setPopupPosition(10, 10);
dbox2.setPopupPosition(200, 10);
dbox1.setAnimationEnabled(true);
dbox2.setAnimationEnabled(false);
// Set the dialog boxes' caption and content
dbox1.setHTML("Dialog Box 1");
dbox2.setHTML("Dialog Box 2");
dbox1.setWidget(new HTML("This is the first dialog box."));
dbox2.setWidget(new HTML("This is the second dialog box."));
// Making dobx2 a partner of dbox1 means clicking
// in dbox2 won't cause dbox1 to close
dbox1.addAutoHidePartner(dbox2.getElement());
// Similarly, setting dbox1 as a partner of dbox2 means
// clicking in dbox1 won't cause dbox2 to close
dbox2.addAutoHidePartner(dbox1.getElement());
// Show the dialog boxes
dbox1.show();
dbox2.show();
Вы можете взаимодействовать с любым из диалоговых окон, не закрывая другое. Пропустите соответствующий звонок на setAutoHidePartner
, если вы хотите только одностороннее партнерство.