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);
    }
  }
}
Другие вопросы по тегам