2009-10-08 80 views
4

我需要從手寫Javascript調用實例Java方法。在GWT文檔闡述瞭如何用靜態方法和類做到這一點,它工作得很好:GWT-如何從手寫JavaScript調用INSTANCE Java方法?

http://code.google.com/p/google-web-toolkit-doc-1-6/wiki/DevGuideJavaFromJavaScript(從調用JavaScript的手寫Java方法)

public MyUtilityClass 
{ 
    public static int computeLoanInterest(int amt, float interestRate, 
              int term) { ... } 
    public static native void exportStaticMethod() /*-{ 
     $wnd.computeLoanInterest = 
      @mypackage.MyUtilityClass::computeLoanInterest(IFI); 
    }-*/; 
} 

是否有可能做到這一點?我嘗試了幾種不同的組合,聲明瞭本地方法並使用這個。@和instance。@並沒有成功。

感謝

回答

5

確實有可能這樣做,但你的語法是錯誤的。我在沒有編譯的情況下輸入,所以我可能有一些錯字。但這是我的方式。你的方法不工作的原因是這個變量不是你所期望的。

public MyUtilityClass{  
    public static int computeLoanInterest(int amt, float interestRate, int term) { ... }  

    public static native void exportStaticMethod() /*-{  
     var _this = this; 
     $wnd.computeLoanInterest = function(amt,interestRate,term) { 
      [email protected]::computeLoanInterest(IFI)(amt,interestRate,term);  
     }; 
    }-*/; 
} 
+1

請注意,還有一個名爲GwtExporter的項目,可以刪除手寫JSNI調用所需的內容。我還沒有使用它,但這個想法非常有趣。 – 2009-10-09 07:11:39

+0

什麼是IFI?你能指點我嗎?數據類型 ? – StackOverFlow 2013-01-26 11:58:36

+0

如何通過這個--->(上下文上下文,元素父,字符串值, NativeEvent事件,ValueUpdater valueUpdater)從javascript到gwt-java代碼 – StackOverFlow 2013-01-26 12:26:30

0

你能發佈是工作的代碼? :)

但我看到它的方式,[email protected]將無法​​正常工作,因爲您沒有該類的對象(在手寫JS中,就是這樣),它會和您調用實例一樣首先創建該類的對象的方法。

[email protected]應該可以工作,但是您必須確保instance在手寫JS的函數調用時指向該類的有效實例。

1

大衛Nouls的回答作品,與一個更正:
從方法聲明中移除static關鍵字。

5

我意識到這是舊的,但我努力讓這個工作,因爲大衛努爾斯的答案是不完整的我。我不得不調整它像這樣得到initComplete()調用我的實例方法initComplete()

public static native void exportInitCallback(MyComponent thiz) /*-{ 
    $wnd.initComplete = function(){ 
     [email protected]::initComplete()(); 
    } 

}-*/; 

在建設爲MyComponent的我通過這個到我的靜態方法。全局initComplete方法然後正確地調用實例方法。

我希望這有助於其他GWT新手。