GWT JSNI - Java到Javascript返回到Java结果未定义的参数

GWT JSNI - Java To Javascript Back To Java Results in undefined params

本文关键字:Java 未定义 参数 结果 Javascript JSNI GWT 返回      更新时间:2023-09-26

这两天我已经绞尽脑汁了。我已经通读了这里的JSNI文档以及一些关于JSNI和传递变量的不同博客文章,没有任何迹象表明我做错了什么。本质上,我要做的是从我的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);
}

该方法使用JSNI方法exportMyFunction…作为函数导出到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;));
}-*/;

一切似乎都很顺利。它导出,我能够调用handletargetpick在我的JS如下…

handleTargetPicked(encodeURIComponent(place.formatted_address), 
    encodeURIComponent(place.geometry.location.lat()),
    encodeURIComponent(place.geometry.location.lng()));

所有这些似乎都可以工作,并且windows .alert()显示正确的值。这让我相信它有我的类的适当实例,并且它适当地设置了变量。后来,虽然当我回到我的Java类,我尝试引用这些变量,他们总是返回为"未定义"。'

Window.alert("reading on the java side" + pw.getLoc() + pw.getLat() + pw.getLng());

这将导致三个值都为'undefined'。所以我的大问题是…是否有可能从JS端在Java类中设置一个值,然后在以后的类中使用该值?

我刚刚遇到了类似的情况,碰巧看到了你的帖子。我找不到任何建议的解决方案,所以我试着自己调试。

我看到的是,'this'变量指向Window而不是对象实例。

因此,而不是直接调用方法,如handletargetpick (arg1, arg2),我使用method.call()传递上下文,如handletargetpick。调用(instance, arg1, arg2)。这种方法解决了我的问题。