пользовательские события плагина в GWT - PullRequest
0 голосов
/ 23 октября 2011

Мы закодировали плагин для браузера.Он запускает пользовательские события, такие как «mycustomevent».Мне нужно включить (т.е. назначить слушателей) эти пользовательские события в GWT.Вот мой класс плагинов в GWT.

class PluginObject extends Composite implements HasMyCustomEventHandler{
    private Element plugin;
    private HTML html;
    private HandlerManager handlerManager;

    public PluginObject(){
        handlerManager = new HandlerManager(this);
        html = new HTML("<object id='plugin0' type='application/x-ourplugin' width='300' height='300'>"
                       +"<param name='onload' value='pluginLoaded' />"
                       +"</object>");
        initWidget(html);
        plugin = html.getElement().getFirstChildElement();
    }
}

Вот как я добавляю его в свое представление (я использую gwtp).Он добавляется и работает правильно на странице, и я могу вызывать его функции js из gwt с помощью JSNI.

@Inject
public MyPageView(){

    ...
    plugin = new PluginObject();
    panel.add(plugin);
}

Мне нужно иметь возможность назначать обработчики для событий, запускаемых из плагина.Я хотел бы иметь возможность сделать следующее в моем докладчике, но до сих пор я не смог подключить его.

@Override
protected void onBind(){
    super.onBind();
    registerHandler(getView().getPluginObject().addMyCustomEventHandler(
        new MyCustomEventHandler() {
            @Override
            public void onMyCustomEvent(MyCustomEvent event) {
                // call some other presenter stuff here...
            }
        }));
}

Выше упоминается несколько дополнительных занятий.У меня есть определенный класс MyCustomEvent, интерфейс MyCustomEventHandler, который расширяет определенный EventHandler, и интерфейс HasMyCustomEventHandler, который расширяет определенный HasHandler, но после их подключения я ничего не получаю.Я опущу их для краткости, я был бы рад добавить что-нибудь, что может помочь.

Я могу добавить прослушиватели событий в формате js.

obj.addEventListener("mycustomevent", function(){ foo(); }, false);

и каждый раз перехватывать событие (вызывается foo ()), поэтому я уверен, что события запускаются.

Я пытался добавить следующее в мой класс PluginObject, но это только я догадываюсь из того, что нашел при поиске.Это не сработало.

public HandlerRegistration addMyCustomEventHandler(MyCustomEventhandler handler){
    return handlerManager.addHandler(MyCustomEvent.TYPE, handler);
}

Каков здесь правильный подход?

1 Ответ

0 голосов
/ 25 октября 2011

Вот что я в итоге сделал в PluginObject.Я хотел бы услышать способы улучшить это.Я немного повесил трубку на subscribeToBrowserEvents () и ссылку на 'this'.Сначала я вызывал метод addEvent и ссылался на

this.@....

, который ссылался на неправильное место во время выполнения.Подробнее о проблеме здесь в этот бит документации JSNI .Наслаждайтесь.

class PluginObject extends Composite implements HasMyCustomEventHandler{

public PluginObject(){
    handlerManager = new HandlerManager(this);

    html = new HTML("<object id='plugin0' type='application/x-myplugin' width='300' height='300'>"
                         +"<param name='onload' value='pluginLoaded' />"
                         +"</object>");
    initWidget(html);
    plugin = html.getElement().getFirstChildElement();      
}

public void bindBrowserEvents(){
    subscribeToBrowserEvents(plugin);
}

public void eventHandlerMethod(String message){
    MyCustomEvent event = new MyCustomEvent(message);       
    fireEvent(event);
}
@Override
public void fireEvent(GwtEvent<?> event){
    handlerManager.fireEvent(event);
}

public native void subscribeToBrowserEvents(Element eventObject) /*-{

    var pluginReference = this;

    // bind the listener
    function addEvent(obj, name, func)
    {
        if (window.addEventListener) {
            obj.addEventListener(name, func, false); 
        } else {
            obj.attachEvent("on"+name, func);
        }
    }

    addEvent(eventObject.br,'mycustomevent', 
        function(message){
            pluginReference.@com.Name.SomeTest2.client.core.PluginObject::eventHandlerMethod(Ljava/lang/String;)(message);
        });
}-*/;

@Override
protected void onAttach(){
    super.onAttach();
    // bind in the onAttach, it was not working earlier. I assume the plugin needs to exist before the bindings will work  
    bindBrowserEvents();
}

@Override
public HandlerRegistration addMyCustomEventHandler(MyCustomEventHandler handler)
{ 
    return handlerManager.addHandler(MyCustomEvent.TYPE, handler);
}
}
...