2013-12-17 48 views
1

這是參照這個例子:GWT調用Java功能從手寫的JavaScript

package mypackage; 

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

我需要知道的JavaScript代碼來調用這個函數。如果我用<input type="button" onclick=computeLoanInterest(1,2.1,1)/>這個例子工作,但是var x = computeLoanInterest(1,2.1,1) does not work。有人能告訴我我在這裏錯過了什麼。

var x = computeLoanInterest(1,2.1,1);使得X未定義 的價值var x = window.computeLoanInterest(1,2.1,1)顯示類型不匹配錯誤

感謝 拉維

+0

它會拋出「一個錯誤或只是返回意想不到的值?(可能是0/undefined?) –

+0

x的值是未定義的 –

+0

SImplest建議:擺脫$ entry :)只需寫:'$ wnd.computeLoanInterest = @ mypackage.MyUtilityClass :: computeLoanInterest(IFI)':) –

回答

2

最簡單的辦法是剛剛擺脫$進入包裝的。只需在您的JSNI導出方法中寫入:

public static native void exportStaticMethod() /*-{ 
    $wnd.computeLoanInterest = @mypackage.MyUtilityClass::computeLoanInterest(IFI); 
}-*/; 

爲什麼這麼說? 的$入口函數在com.google.gwt.core.client.impl.Impl 它看起來像定義(我刪除了評論):

public static native JavaScriptObject entry(JavaScriptObject jsFunction) /*-{ 
    return function() { 
     try { 
      return @com.google.gwt.core.client.impl.Impl::entry0(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)(jsFunction, this, arguments); 
     } catch (e) { 
      throw e; 
     } 
    }; 
}-*/; 

這也沒什麼特別可疑它只是包裝您的功能與其他功能,但...看到entry0方法簽名:

private static Object entry0(Object jsFunction, Object thisObj, 
    Object arguments) throws Throwable 

它返回對象 - 這可能是爲什麼你會得到類型不匹配的錯誤。 正如你所看到的調用$入口不會增加太多的價值:)。