在两天的大部分时间里,我已经全神贯注于此。我已经阅读了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(
      [email protected]::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类中设置一个值,然后稍后在您的类中使用该值?

最佳答案

我遇到了类似的情况,碰巧看到了您的帖子。
我在任何地方都看不到任何建议的解决方案,因此请尝试自行调试。

我看到的是,“此”变量指向Window,而不是对象实例。

所以不要像直接调用该方法一样handleTargetPicked(arg1,arg2),我使用method.call()传递上下文,例如handleTargetPicked.call(instance,arg1,arg2)。这种方法为我解决了这个问题。希望能有所帮助。

09-26 09:31