我有一個要求,我必須從JavaScript調用一個Java GWT方法,但它不起作用。沒有發生異常,但應用程序在某處掛起而代碼無法運行。當我不打這個電話時,該應用程序工作正常。我的GWT編譯是成功的。我在Firefox中以開發模式進行測試。從JavaScript不工作的GWT調用java方法
我的代碼是這樣的 -
class CPClass {
public native void jsCallViewDocument(String objectId)/*-{
$wnd.jsCallViewDocument =
$entry([email protected]::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,或者是首先要註冊的方法嗎?
我已經調用了它。你的理由不正確,但你的代碼是正確的。我測試並發現使用「this」。直接是問題的原因。分配並使用它解決了問題。 var currentPage = this;但谷歌的網站也使用這個。@的東西,爲什麼它沒有工作是混亂? $條目也不需要。即使刪除它以同樣的方式工作。但反正烏爾代碼包含它,所以我標記它是正確的。 – abhihello123
@weakstudent真的嗎?我認爲我的理由是正確的;您似乎對JSNI方法的工作方式以及Javascript一流功能的工作方式完全感到困惑。你最初的代碼是錯誤的,因爲它將'$ wnd.jsCallViewDocument'分配給不接受參數的'$ entry()'包裝器。您還將一個參數不必要地傳遞給本地方法。在編寫更多JSNI代碼之前,您需要了解更多關於這些主題的內容 - 尤其是您需要了解原始代碼錯誤的原因。 – funkybro
從JSNI代碼調用Java需要'$ entry',請參閱此評論以獲取更多信息:http://stackoverflow.com/questions/5234735/gwt-jsni-problem-passing-strings#comment5894088_5235580我還建議您使用Google「開始真正瞭解GWT「,以獲得關於JSNI的兩個優秀博客。最後,我建議你閱讀道格拉斯克羅克福德爲JavaScript的基礎,你需要有效地使用GWT和JSNI。 – funkybro