Использовать ClickHandler с нативным объектом Javascript? - PullRequest
4 голосов
/ 25 января 2010

В Javascript я делаю SVG-фигуру и добавляю к ней обработчик кликов следующим образом:

  var rect = document.createElementNS('http://www.w3.org/2000/svg','rect');
  rect.addEventListener('click', myClickHandler, false);

Это прекрасно работает. Я пытаюсь создать оверлейный класс Rect в GWT. Если возможно, я бы хотел сделать что-то вроде этого:

public class SVGRect extends JavaScriptObject {

    public native void addClickHandler(ClickHandler handler) /*-{
        addEventListener('click', handler, false);
    }-*/;
}

Таким образом, я могу передать «нормальный» обработчик GWT этому классу и использовать его извне, как любой другой обычный элемент пользовательского интерфейса GWT. Я не уверен, как подключить объект ClickHandler к нативной реализации объекта на javascript?

Спасибо

1 Ответ

3 голосов
/ 25 января 2010

Поскольку вам нужно ClickEvent для перехода к ClickHandler.onClick и получения его из JavaScript, возникает проблема (AFAICT) - я бы выбрал немного другой, более «общий» подход:

Создание простого интерфейса обратного вызова:

public interface Callback {
    void execute();
}

Затем вы можете передать его напрямую и назвать его так:

public native void addClickHandler(Callback callback) /*-{
        addEventListener('click', function() {
           callback.@path.to.your.package.Callback::execute()();
        }, false);
}-*/;

Или создайте промежуточный шаг:

public void addClickHandler(Callback callback) {
    _addClickHandler(getCallback(callback));
}

private native void _addClickHandler(JavaScriptObject callback) /*-{
     addEventListener('click', callback, false);
}-*/;

// This can be moved to a better place
private native static JavaScriptObject getCallback(Callback callback) /*-{
    return function()
    {
        callback.@path.to.your.package.Callback::execute()();
    };
}-*/;

И, конечно, вы бы использовали это так:

SVGRect svg = getMeSVGRect();
svg.addClickHandler(new Callback() {
    @Override
    public void execute() {
        // Do some stuff
    }
});

Лично я предпочитаю второе решение - хотя это больше кода, мне нравится сохранять свои собственные методы / JSNI закрытыми (если это не объект наложения или что-то подобное), а код более читабелен и менее подвержен ошибкам (нет необходимости использовать прикольный синтаксис для вызова функций Java из собственного кода / JSNI).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...