2013-04-08 61 views
1

我正在構建一個系統,作爲用戶的主要工作環境在企業環境中使用。我們希望能夠爲特定功能打開第二個瀏覽器窗口,並讓2個窗口通信(例如,瀏覽一個映射界面,選擇一個對象並在另一個窗口的編輯器中打開它)。 我有兩個選項,我可以拿出:與GWT或GXT的多瀏覽器窗口通信

1)試圖實現一些JSNI方法來獲得窗口上的句柄,並以這種方式進行通信。

2)實現長輪詢服務器通過cookie

傳遞與共享會話事件是否有關於如何去實現選項1任何實例或建議?我正在使用GWT和GXT。

或者,您有關於如何實現多個瀏覽器通信的另一個建議?

回答

0

感謝您的建議。我們計劃重新審視我們的導航機制,「活動與地點」看起來像是一種非常整潔的做事方式。現在,我們通過針對EventBus觸發的事件進行導航,該事件總線由Navigation類偵聽並相應地指導導航。

我已經通過JSNI進行了溝通。但是,我遇到了一個煩人的問題。新的窗口進行呼叫:

public native void fireCrossBrowserEvent(GwtEvent<?> event) /*-{ 
    $wnd.opener.fireCrossBrowserEvent(event); 
}-*/; 

其中要求在主窗口中此方法:

$wnd.fireCrossBrowserEvent = $entry(function(event) { 
    $wnd.alert("fireCrossBrowserEvent: " + event); 
    @my.application.client.event.EventBus::fireEvent(Lcom/google/gwt/event/shared/GwtEvent;)(event); 
}); 

的呼叫:

public static void fireEvent(GwtEvent<?> event) { 
    System.out.println("fireEvent: " + event); 
    bus.fireEvent(event); 
} 

我結束了使用谷歌AutoBean同步和desynchronise通過JSNI發送的事件。所有的作品很好。另外,爲了回到子窗口的通信,我必須創建一個新的Native方法來替換GWT的Window.open方法,以便它返回對新窗口的引用。 javascript函數返回對新窗口的引用,但由於某種原因,GWT的包裝器返回void。

0

我做瀏覽器使用websockets通過JMS服務器進行廣播的瀏覽器通信。建立中繼服務器相對簡單。

如果您可以將您的有效載荷編碼到加載到其他窗口位置的URL中,那麼位置可能是解決方案。

重:空GwtEvent

javadoc

所有GWT事件被認爲是死,不應再被訪問 一旦最初發射與 它的活動結束HandlerManager。也就是說,不要拘泥於您的處理程序 方法之外的事件對象。

也許你應該在JavaScript中重載類型之前將你的GwtEvent複製到JavaScriptObject中,按照this blog entry進一步中繼。