2013-08-03 67 views
0

問題很簡單,但可能無法解決? ATLEAST我:/GWT:多個腳本實例通信

現狀: 比方說,我有一個動態的頁面系統,其中服務器提供了包含GWT模塊自我的其他副本。這意味着客戶端的主GWT實例應該管理新的傳入GWT腳本,這些腳本僅由主實例本身使用標記添加。 現在,主GWT實例需要以最簡單(內部GWT)方式與新創建的腳本實例進行通信。

那麼,什麼是不可能的問題:如果不是絕對需要,雙方都可以寫出愚蠢的JSNI包裝器。

Soltuions我想出了: 做一個模塊都使用,包括一個通用的接口,例如:

package com.whatever.interfaces; 

public interface Communication { 
    void showMessage(String message); 
} 

所以,無論是現在還是將繼承這個模塊,知道的定義。 主要客戶端現在將加載動態JS並註冊通信的實現,動態的會去使用它。我試圖在$ wnd和使用setPropertyObject的元素上存儲引用。在$ wnd他們是空的,這可能/可能與GWT Iframing有關?例如,對於RootPanel元素上的屬性,會引發ClassCastException。

有沒有什麼好的方法來解決這個問題?我的另一個想法是使用JSNI作爲橋接模塊上的實現調用接口,但我不確定這是否是一種好方法。

您的幫助表示感謝,謝謝。

編輯: 好吧,我已經非常認爲這是不可能的。 儘管您可能在某處使用了相同的接口,但即使將相同的模塊用作通用接口,它們也會自行實例化,以便編譯不同的模塊。 使用JSNI的方法當然有些可能,但不是沒有將所有屬性映射到真正的JS對象並將其重新映射回來。這意味着你無法傳遞複雜的Java對象,就像你可能習慣的那樣。我的結論是,使用CodeGenerator可以自動構建JSNI包裝器,併爲這兩個模塊構建重新映射器,但這對我來說太麻煩了。

我仍然敞開,如果有人想出了一個更好的主意,但我只是想提供我發現一些內幕,以便其他人可以受益的我浪費的時間;)

回答

0

前一段時間,我創建一個簡單的原型實現將Object實例共享給其他GWT模塊。你可以在https://code.google.com/p/gwt-plug/找到代碼。是的,正如您所描述的那樣,傳輸Java對象是一個問題。據我記得,你只能傳輸原始值(int,float,...),字符串和JavaScriptObjects。但JavaScriptObjects是一個很好的可能性

0

正如你已經發現,單獨編譯的GWT模塊之間的通信有點難度,因爲一切都被混淆了。儘管通過JavaScript,JSNI,JSO和JSON是可能的。

  1. 您可以使用JSNI直接在$ wnd對象上通過javascript創建通信鉤子。一種事件總線方法可以工作。

  2. 您可以使用JSON來傳遞複雜的對象。

  3. 您可以使用JSO(JavaScript Overlays)來消耗和操縱每個獨立模塊中的JSON。

  4. 把所有這些放在一起,你最終會得到一個迷你框架庫模塊,你將在你想要互相溝通的各種GWT模塊之間共享。他們每個人都會繼承公共框架模塊並以自己的混淆形式進行編譯,但由於他們使用JavaScript和JSON作爲通用語言,因此他們不必擔心混淆。

有意義嗎?