【问题标题】:custom plugin events in GWTGWT 中的自定义插件事件
【发布时间】:2011-10-23 07:06:07
【问题描述】:

我们编写了一个浏览器插件。它触发像“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)。它正在被添加并在页面中正常运行,我可以使用 JSNI 从 gwt 调用它的 js 函数。

@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 类,定义了扩展 EventHandler 的 MyCustomEventHandler 接口,以及定义了扩展 HasHandlers 的 HasMyCustomEventHandler 接口,但是在将它们全部连接起来之后,我什么也没得到。为简洁起见,我省略了它们,我很乐意添加任何可能有帮助的内容。

我可以在裸js中添加事件监听器。

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

每次都捕获事件(foo() 被调用),所以我确信事件被触发了。

我已经尝试将以下内容添加到我的 PluginObject 类中,但这只是我从搜索的内容中猜测的结果。它没有工作。

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

这里的正确方法是什么?

【问题讨论】:

    标签: gwt plugins jsni custom-event


    【解决方案1】:

    这是我最终在 PluginObject 中所做的。我很想听听改进它的方法。我在 subscribeToBrowserEvents() 和对“this”的引用上挂断了一段时间。最初我是调用 addEvent 方法并引用

    this.@....
    

    在运行时引用了错误的位置。有关此问题的更多信息,请参见this bit of the JSNI docs。享受吧。

    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);
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      相关资源
      最近更新 更多