GWT: при добавлении пользовательского виджета в таблицу ячеек потери событий пользовательских виджетов
Наше требование состоит в том, чтобы сделать редактируемую сетку, используя CellTable
содержащий пользовательские виджеты в своей ячейке. Пользовательский виджет имеет текстовое поле и кнопку поиска, связанные с текстовым полем. Чтобы добавить пользовательский виджет в качестве ячейки, создан подкласс AbstractEditableCell
класс (предоставленный GWT) и имеет переопределение render()
а также onBrowserEvent()
методы.
render(Context context, String value, SafeHtmlBuilder sb)
Метод пользовательской ячейки виджета создает безопасный HTML для виджета и выводит этот безопасный HTML в ячейку. Но проблема, с которой я сталкиваюсь, заключается в том, что пользовательский виджет отображается правильно, но он теряет связанные события. Метод рендеринга приведен ниже:
if (viewData.isEditing()) {
textBoxSelector.setText(text);
OnlyToBeUsedInGeneratedCodeStringBlessedAsSafeHtml safeHtmlObj = new OnlyToBeUsedInGeneratedCodeStringBlessedAsSafeHtml(textBoxSelector.toString());
sb.append(safeHtmlObj);
} else {
// The user pressed enter, but view data still exists.
sb.append(html);
}
Если я попытаюсь добавить виджет в render()
Метод с использованием следующего кода, он не добавляет виджет.
int left = parent.getAbsoluteLeft();
int top = parent.getAbsoluteTop();
String elementId = "ID" + left + top;
try {
parent.setId(elementId);
// parent.removeFromParent();
RootPanel.get(elementId).add(textBoxSelector);
} catch (AssertionError error) {
RootPanel.get(elementId).add(textBoxSelector);
}
Буду очень признателен, если кто-нибудь поможет мне в достижении добавления виджета в CellTable
без потери связанных событий.
1 ответ
Ячейки GWT несовместимы с виджетами GWT. Это означает, что вы не можете разместить виджет GWT внутри ячейки и по-прежнему работать. Ячейки действительно имеют альтернативный механизм обработки событий (рассматривается ниже)
Причина в том, что ячейки ближе к лицам без гражданства. При наличии объекта данных ячейка будет выплевывать HTML. Одна и та же ячейка будет многократно использоваться - выплевывая HTML для различных элементов на странице - и никогда не сохраняя ссылки на какие-либо элементы DOM, которые она создает.
В приведенном выше примере вы вызываете "someWidget.toString()". Это вернет только HTML-представление вашего виджета и потеряет обработку вашего события.
Обработка событий в ячейках
GWT Dev Guide для пользовательских ячеек (имеет некоторые дополнительные детали)
Для обработки событий в ячейках вам нужно переопределить отдельный метод с именем onBrowserEvent
, Вам также необходимо настроить свою ячейку, чтобы получать уведомления о конкретных событиях по телефону super('click', 'keydown')
в вашем конструкторе со списком событий, которые вы заинтересованы в прослушивании.
Поскольку ячейки являются средствами визуализации без сохранения состояния, onBrowserEvent будет передан контекст визуализированного элемента, по которому был выполнен щелчок, вместе с исходным объектом данных, который визуализировала ваша ячейка. Затем вы можете применить изменения или манипулировать DOM по мере необходимости.
Вот пример, взятый из связанного руководства разработчика выше:
@Override
public void onBrowserEvent(
Context context,
Element parent,
String value,
NativeEvent event,
ValueUpdater<String> valueUpdater) {
// Let AbstractCell handle the keydown event.
super.onBrowserEvent(context, parent, value, event, valueUpdater);
// Handle the click event.
if ("click".equals(event.getType())) {
// Ignore clicks that occur outside of the outermost element.
EventTarget eventTarget = event.getEventTarget();
if (parent.getFirstChildElement().isOrHasChild(Element.as(eventTarget))) {
doAction(value, valueUpdater);
}
}
}