3

javascriptからjavaGWTメソッドを呼び出さなければならないという要件がありますが、機能しません。例外はスローされませんが、アプリケーションがどこかでハングし、コードが実行されません。電話をかけなくても、アプリケーションは正常に動作します。私のGWTコンパイルは成功しました。Firefoxの開発モードでテストしています。

私のコードはこのようなものです-

class CPClass {

    public native void jsCallViewDocument(String objectId)/*-{
        $wnd.jsCallViewDocument = 
            $entry(this.@com.srre.g0a.client.presenter.impl.viewdoc.CPClass::testJS(Ljava/lang/String;)(objectId));
    }-*/;

    private void testJS(String objectId) {
        SC.say("Call successfull" + objectId);
    }

    private void setDocName(ListGridRecord newRecord, someDTO currDocInfo) {

        String anchorTag = "<a href ='#' onclick = \"javascript:jsCallViewDocument('" 
            +  currDocInfo.getDocName() + "')\">" + currDocInfo.getDocName() + "</a>";

        newRecord.setAttribute(Display.GRID_FIELD_DOC_NAME, anchorTag);
    }

}

これまで、JSNIを使用して$ wnd.close()や$ wnd.alert()のような単純な呼び出しを行ってきたので、何かが足りない可能性があります。私のクラス(ネイティブメソッドと呼び出されるメソッドが定義されている)はJavaScriptObjectを拡張する必要がありますか、それともそのネイティブメソッドを最初に登録する必要がありますか?

4

2 に答える 2

3

ここで少し混乱したと思います。

jsCallViewDocument()リンクがクリックされる前にJavaコードからすでに呼び出されている場合にのみ、そのままのコードが機能します。そうでない場合、$wnd.jsCallViewDocument関数は存在しません。

その場合、文字列を関数に渡すことは意味がありません。

おそらく代わりに必要なのは、次のような関数です。

public static native void setupJsCallViewDocument(CPClass p) /*-{
    var fn = function(objectId) {
        // invoke our (Java) testJS function, passing objectId as a parameter
        $entry(
           p.@com.srre.g0a.client.presenter.impl.viewdoc.CPClass::testJS(Ljava/lang/String;)(objectId)
        );
    };

    // assign this function to the global jsCallViewDocument
    $wnd.jsCallViewDocument = fn;
}-*/;

今あなたのsetDocName機能で:

private void setDocName(ListGridRecord newRecord, someDTO currDocInfo) {
    // set up the native function call
    setupJsCallViewDocument(this);

    String anchorTag = "<a href ='#' onclick = \"javascript:jsCallViewDocument('" 
        +  currDocInfo.getDocName() + "')\">" + currDocInfo.getDocName() + "</a>";

    newRecord.setAttribute(Display.GRID_FIELD_DOC_NAME, anchorTag);
}
于 2012-08-29T13:50:12.663 に答える
0

(属性ではなく)属性javascript:は必要ありませんonClickhref

切り替える:

String anchorTag = "<a href ='#' onclick = \"jsCallViewDocument('" 
        +  currDocInfo.getDocName() + "')\">" + currDocInfo.getDocName() + "</a>";

また:

String anchorTag = "<a href = \"javascript:jsCallViewDocument('" 
        +  currDocInfo.getDocName() + "')\">" + currDocInfo.getDocName() + "</a>";

ちなみに、Java GWTコードでイベントリスナーを割り当ててみませんか?

于 2012-08-29T09:18:33.953 に答える