2

我正在使用 W3C Geolocation API 来检索 GWT Web 应用程序中的位置信息。Geolocation API 的构建方式是在检索到位置位置后立即调用回调函数。

我当前的测试代码如下所示:

public native void getCoordinates() /*-{
    function onPositionUpdate(position) {
        var lat = position.coords.latitude;
        var lng = position.coords.longitude;
        var alt = position.coords.altitude;

        // not OK,- doesn't get invoked, and function execution stops at this point
        this.@com.test.GpsPanel::testMethod()();

        alert("Coordinates retrieved: " + lat + ";" + lng + ";" + alt);
    }

    function onPositionUpdateFailed(error) {
        alert("Some error");
    }

    if(navigator.geolocation) {
        // OK when invoked somewhere here
        this.@com.test.GpsPanel::testMethod()();

        navigator.geolocation.getCurrentPosition(onPositionUpdate, onPositionUpdateFailed);
    } else {
        alert("Geolocation is not available");
    }
}-*/;

我试图证明该方法testMethod不会从内部方法调用onPositionUpdate。甚至更多:之后没有显示警报(当 testMethod 调用被删除时它会显示),但在日志中没有发现警告或错误。

我的问题是:如何从内部函数中引用此方法?我觉得这this.不是内部功能的正确参考。如果无法正确引用 Java 类,那么可能的解决方法是什么?请注意,我不能将其他任何东西传递给函数onPositionUpdate(),因为它是一个回调函数。

4

2 回答 2

8

this当实际执行 JSNI 块的 javascript 中定义的函数时,超出范围。

在 周围添加一个闭包this

public native void getCoordinates()
/*-{

    var that = this;

    function onPositionUpdate(position) {
        var lat = position.Wecoords.latitude;
        var lng = position.coords.longitude;
        var alt = position.coords.altitude;

        that.@com.test.GpsPanel::testMethod()();

        alert("Coordinates retrieved: " + lat + ";" + lng + ";" + alt);
    }

    // ...
}-*/;

我确信这在谷歌的 JSNI 文档中有所记录,至少在一个传递的例子中,但我现在找不到它。

这也可以通过将实例传递给 javascript 注入来完成,例如:

public native void getCoordinates(com.test.GpsPanel instance)
/*-{

    function onPositionUpdate(position)
    {
        var lat = position.Wecoords.latitude;
        var lng = position.coords.longitude;
        var alt = position.coords.altitude;

        instance.@com.test.GpsPanel::testMethod()();

        alert("Coordinates retrieved: " + lat + ";" + lng + ";" + alt);
    }

    // ...
}-*/;
于 2012-07-21T21:17:53.647 回答
3

A related trivial mistake resulting in the same behaviour is to forget the second pair of brackets when invoking Java methods. The first pair restates the method header for identification purposes while the second pair contains the actual argument(s). This mistake is particularly easy to make when there are no arguments, e.g.

instance.@com.test.GpsPanel::testMethod()();
于 2014-05-05T11:59:59.630 回答