GWT从javascript调用java方法无法正常工作

时间:2012-08-29 08:54:45

标签: gwt gwt2 jsni

我有一个要求,我必须从javascript调用java GWT方法,但它不起作用。没有异常被抛出,但应用程序挂起了某个地方并且代码没有运行。当我不打电话时,应用程序正常工作。我的GWT-Compile是成功的。我正在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(),所以我可能会遗漏一些东西。我的类(定义了Native方法和要调用的方法)是否需要扩展JavaScriptObject或者首先注册该本机方法还是什么?

2 个答案:

答案 0 :(得分:3)

我觉得你在这里有点困惑。

只有在单击链接之前已从Java代码调用jsCallViewDocument()时,您的代码才会起作用 - 否则$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);
}

答案 1 :(得分:0)

javascript:属性中不需要onClick(与href属性相对)

切换到:

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

或:

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

顺便说一下为什么不在java gwt代码中分配事件监听器?