私はGWTとJavaScriptの初心者です。私が従おうとしたこのタイプの同様の質問がありますが、私は失敗し続けます。
私はGWTアプリを持っているので、JavascriptからJava関数を呼び出す必要があります(特にhrefタグのonclickで)。)以下は私が行ったことです。
public class JSNITest {
public static void handleAnchorClick(int a , int b) {
Window.alert("Current row and Column is " + a + " " + b);
}
public static native void exportMyFunction()/*-{
$wnd.handleAnchorClick = function(param1,param2){
@company.package.class.JSNITest::handleAnchorClick(*)(param1,param2);
}-*/;
}
そしてHTMLでは、
<a href="javascript:handleAnchorClick(a1,a2);">link</a>
(a1 , a2)
は私のコードの2つの整数変数です。また、エントリポイント関数でEncloseingClass.exportMyFunction()を呼び出しました。私はさまざまな種類の例外に遭遇し続けます(そのようなクラス例外はありません)。誰かが私を訂正してくれませんか?
よろしく
GWTのものをJSの世界にエクスポートすることについてもう少し説明しましょう。それを行うにはいくつかのオプションがありますが、3つの方法に焦点を当てます。
[編集済み]
0-JsInterop:GWTメンテナは、Javaメソッドをjavascriptに簡単にエクスポートし、javascriptをラップするための新機能に取り組んでいますこの機能は2.7.0では非常に実験的で、一部の機能はありませんでしたが、2.8.0ではほぼ機能します。 設計ドキュメント およびその他の ディスカッション をご覧ください。 =メーリングリスト内。
[終わり]
1-[〜#〜] jsni [〜#〜]:最初の方法は、独自のjsniを作成することです。この場合、注意する必要があります。あなたが犯す可能性のある間違いについて。基本的に、これらの間違いは、型の処理方法を知っている必要があるためです。あなたの場合、(以下のコメントで尋ねているように)javascript配列を取得したい場合、解決策は次のようになります。
_public static native void exportMyFunction()/*-{
$wnd.handleAnchorClick = @company.package.class.JSNITest::handleAnchorClick(*);
}-*/;
public static void handleAnchorClick(JsArrayMixed args) {
Window.alert("Current row and Column is " +
args.getNumber(0) + " " + args.getNumber(1));
}
public void onModuleLoad() {
exportMyFunction();
}
//javascript code
window.handleAnchorClick([1,2])
_
JSNIでは、primitive
タイプ(longを除く)とJavaScriptObject
オブジェクトのみを渡すことができることに注意してください。したがって、javascript配列を渡すときは、例のようにJavaScriptObject
で受け取る必要があります。この場合、javascriptは数値の型のみを使用するため、_args.getNumber
_は常にdoubleを返し、Javaで変換する必要があります。
2-gwt-exporter大規模なプロジェクトをエクスポートする場合、または複雑なオブジェクトやクラスを処理する必要がある場合は、 gwt-exporter
_static class MyClass implements Exportable {
@Export("$wnd.handleAnchorClick")
public static void handleAnchorClick(double[] args) {
Window.alert("Current row and Column is " +args[0] + " " + args[1]);
}
}
public void onModuleLoad() {
GWT.create(MyClass.class);
}
//javascript code
window.handleAnchorClick([1,2])
_
gwt-exporterは、あらゆる種類のプリミティブ型(longでも)myfunc(long[] args)
、var-args myfunc(long...args)
を処理し、メソッドのオーバーロードなどをサポートします。
3-gwtquery最後に、 gwtquery が必要な場合は、テクニックを使用して、window
などの任意のjsオブジェクトに関数プロパティを追加できます。
_// The GQuery Properties object is able to wrap a Java Function object
// into an js property.
Properties wnd = window.cast();
wnd.setFunction("handleAnchorClick", new Function() {
public void f() {
// Get the js arguments[] array
JsArrayMixed args = arguments(0);
// Get the first element of the arguments[] array
JsArrayMixed ary = args.getObject(0);
Window.alert("Current row and Column is " +
ary.getNumber(0) + " " + ary.getNumber(1));
}
});
//javascript code
window.handleAnchorClick([1,2])
_
Gqueryを使用すると、常に数値をdoubleとして返すgwt JsArrayMixed
クラスを使用できます。または、Java _((JsCache)ary.get(1, Integer.class)
_で数値を他の数値タイプに変換できるJsCache
を使用できます。
要約すると、この問題の処理に特化しているため、最初のオプションとしてgwt-exporterを使用したいと思います。 2番目のオプションとして、gwtを大幅に補完するgqueryを使用します。最後に、可能な場合は手書きのjsniを使用しないようにします。通常、Javascriptは問題や間違いの原因です(gwtの主な目標はjsを扱わない)。
GWTエクスポーターを検討する必要があります。 GWT 2.8が間もなくリリースされるので、待つことを検討することもできます。 2015年の懇願の頃に出てくるはずだった。2015年はすでに始まっており、彼らは今GWT.createでデモンストレーションを行っているので、いつか出てくるはずだ。待つことができない場合は、experimental is interop、トップアンサーのようなJSNI、またはGWTエクスポーターのいずれかを使用できます。 JSNIはより複雑で、多くのボイラープレートコードが含まれるため、多くのjs相互運用を行う必要がある場合は、GWT-exporterをお勧めします。