2011-10-20 53 views
1

我使用GWT構建了一個Web應用程序,我希望用戶能夠通過某種可與GWT中編寫的應用程序內核進行交互的JavaScript API來擴展其功能。基本上,這個JS API會映射到我的一些GWT內部方法,它們可以完成實際的工作。因此,爲了達到這個目的,我閱讀了GWT JSNI官方文檔中的一個技巧,其中包括從GWT創建全局JS變量並將其分配給實際的GWT方法。然後我會通過這個變量在我手寫的JS代碼中進行調用。從手寫Javascript調用GWT方法

不幸的是,我不能讓它的工作(該示例包含語法錯誤兒子即時通訊不知道它甚至已經過測試)。做更多的研究,我在這個網站上找到了一個類似的解決方案,它爲JS var分配了一個匿名函數來進行調用。它看起來像這樣:

/*GWT code that assigns the anonymous function*/ 

private static native void loadWrapper() /*-{ 
    $wnd.showMessage = 
     $entry(@com.Glob3Mobile.client.TestApi::msgBox()); 
}-*/; 

public static void msgBox() { 
    Window.alert("hello"); 
} 

該解決方案看起來很有希望,但我還沒有能夠使它工作。當我做「window.showMessage();」在我手寫的JS代碼中它不會工作。我已經發現了這些問題:

  • window.showMessage似乎被創建,但JS控制檯說,它不是一個函數,即使我檢查了DOM樹,驗證了變量不包含一個函數。
  • 看來我總是要追加「窗口」。 preffix,因爲var是在窗口對象內創建的。這是一個相當重要的問題,因爲每次他們想調用一個函數時都會迫使用戶寫這樣的內容真是很乏味。

如果有人知道這些問題的解決方案(或實現什麼我試圖做的替代方法),編號非常感謝聽到。提前致謝。

回答

1

你需要做一些額外的工作。因爲你描述的方法只在編譯時才起作用。編譯之後,GWT方法名稱不見了,因爲它們被混淆了。但有一個圖書館可以幫助你:gwt-exporter