2011-10-23 360 views
0

我們編寫了一個瀏覽器插件。它觸發了像'mycustomevent'這樣的自定義事件。我需要將這些自定義事件合併(即分配偵聽器)到GWT中。這是我在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接口,以及一個擴展了HasHandler的HasMyCustomEventHandler接口,但是將它們連接起來後我什麼也得不到。爲了簡潔,我省略了它們,我很樂意添加任何可能有所幫助的內容。

我可以在裸露的js中添加事件偵聽器。

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

每次都抓住事件(foo()被調用),所以我相信事件正在被解僱。

我已經嘗試添加以下到我的PluginObject類,但這只是我從我發現搜索的東西猜測。它沒有奏效。

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

這裏的正確方法是什麼?

回答

0

這是我最終在PluginObject中做的事情。我很樂意聽到改進它的方法。我在subscribeToBrowserEvents()和對'this'的引用上掛了一陣子。最初我打電話給addEvent方法,指的是

[email protected] 

在運行時引用了錯誤的地方。更多關於這裏的問題在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){ 
      [email protected]::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); 
} 
}