这两天我已经绞尽脑汁想这个问题了。我已阅读 JSNI here 上的文档以及一些关于 JSNI 和传递变量(如 this one)的不同博客文章没有任何迹象表明我做错了什么。本质上我想做的是从我的 GWT 客户端类调用一个 javascript 方法,我在类加载时将其导出到 javascript。该方法从另一个 JS 方法获取参数并将它们存储在我传递的 Java 类的实例中。这似乎有效。但是,一旦我在 java 代码中引用这些方法,它们就变成了未定义的。我相信正在发生的事情是我的 Java 类实例在 JS 完成后不知何故丢失了。这里有一些代码可以帮助解释工作流程...
我有一个名为 ProfileWidgee 的 Java 类。该类有一个方法来设置位置、纬度和经度的局部变量。该方法名称是...
public void handleTargetPicked(String mloc, String mlat, String mlng) {
loc = mloc.equalsIgnoreCase("undefined") ? "" : mloc;
lat = mlat.equalsIgnoreCase("undefined") ? "" : mlat;
lng = mlng.equalsIgnoreCase("undefined") ? "" : mlng;
Window.alert("setting on js side" + loc + lat + lng);
}
使用名为exportMyFunction 的 JSNI 方法将该方法作为函数导出到 JS...
public static native void exportMyFunction(ProfileWidgee instance)/*-{
$wnd.handleTargetPicked = $entry(
instance.@com.n.j.client.widgees.profile.ProfileWidgee::handleTargetPicked(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;));
}-*/;
一切似乎都很顺利。它导出,我可以在 JS 中调用 handleTargetPicked,如下所示...
handleTargetPicked(encodeURIComponent(place.formatted_address),
encodeURIComponent(place.geometry.location.lat()),
encodeURIComponent(place.geometry.location.lng()));
所有这些似乎都有效,并且 Window.alert() 显示正确的值。这让我相信它有我的类的适当实例,并且它正在适本地设置变量。后来,当我回到 Java 类时,我尝试引用这些变量,但它们总是以“未定义”的形式返回。
Window.alert("reading on the java side" + pw.getLoc() + pw.getLat() + pw.getLng());
这会导致所有三个值均“未定义”。所以我的大问题是...是否可以从 JS 端在 Java 类中设置一个值,然后在稍后的类中使用该值?
最佳答案
我刚刚遇到了类似的情况,碰巧看到了你的帖子。 我在任何地方都看不到任何建议的解决方案,因此尝试自己调试。
我看到的是,“this”变量指向 Window 而不是对象实例。
所以不要像这样直接调用该方法handleTargetPicked(arg1, arg2),我使用 method.call() 传递上下文,例如handleTargetPicked.call(实例,arg1,arg2)。这种方法为我解决了这个问题。希望有帮助。
关于javascript - GWT JSNI - Java 到 Javascript 返回 Java 导致未定义的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39642914/