2012-10-02 39 views
1

外部JavaScript提供了一個應該交給Java方法mycallback的數字。將JavaScript參數從外部javascript傳遞到java

我已經定義:

的Java:

class MyClass { 
    public static void mycallback(JavaScriptObject number) { 
     // do something with the number 
    } 
} 

的Javascript:

$wnd.callback = $entry(@com.package.MyClass::mycallback(Lcom/google/gwt/core/client/JavaScriptObject)); 

和JavaScript調用是:

$wnd.callback(number_from_external_javascript); 

,但我得到的錯誤:

JS value of type number, expected com.google.gwt.core.client.JavaScriptObject 

而我的終極目標是與參數類型不是JavascriptObject的Integer,Java方法。我只是認爲GWT應該將Javascript對象封裝在JavascriptObject中,但它似乎不會。

GWT版本是2.4。

回答

6

GWT將自動一個JS Number值到任何Java數原始類型(intdouble等),JS字符串到Java String和JS布爾到Java boolean。它永遠不會通過它們作爲JavaScriptObject s。

如果該數字不能爲空,那麼只需用int參數聲明回調。如果它可以爲空,那麼你就必須明確地創建一個Integer情況下,是這樣的:

$wnd.callback = $entry(function(n) { 
     if (number != null) { 
     // box into java.lang.Integer 
     number = @java.lang.Integer::valueOf(I)(n); 
     } 
     @com.packge.MyClass::mycallback(Ljava/lang/Integer;)(number); 
    }); 

另外,我覺得你可以通過一個JS數作爲JavaScriptObject如果它是一個Number對象,而不是數字值,所以這個威力工作:

$wnd.callback = $entry(function(n) { 
     n = new Number(n); // "box" as a Number object 
     @com.packge.MyClass::mycallback(Lcom/google/gwt/core/client/JavaScriptObject;)(n); 
    }); 
+0

這是一個非常有用的答案。這兩種建議的方法都有效。我不知道你可以做這種轉換到Integer。謝謝! – egaga

2

怎麼樣使用gwt-exporter發電機暴露你的GWT代碼,JS,所以你沒有對付JSNI,你可以從中受益的很好的特性,它有(複雜的對象,數組,閉包,overl ays,doclet等)

使用gwt-exporter你的類只需實現Exportable並使用一個註解來公開你的方法。

public static class MyClass implements Exportable { 
@Export("$wnd.mycallback") 
public static void mycallback(long number) { 
    Window.alert("" + number); 
} 
} 

此行添加到您的onmoduleload離開編譯器做的工作

public void onModuleLoad() { 
    ExporterUtil.exportAll(); 
} 

然後你可以使用的方法如你所說

<script> 
    window.mycallback(1234) 
</script> 
+0

很高興知道,謝謝! – egaga