我正在使用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");
}
}-*/;
Run Code Online (Sandbox Code Playgroud)
我试图证明该方法testMethod
不会从内部方法调用onPositionUpdate
.甚至更多:之后没有显示警报(当删除testMethod调用时它会显示),但在日志中没有发现警告或错误.
我的问题是:如何从内部函数引用此方法?我觉得这this.
不是内部功能的正确参考.如果无法正确引用Java类,那么可能的解决方法是什么?请注意,我无法传递任何其他功能,onPositionUpdate()
因为它是一个回调函数.
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);
}
// ...
}-*/;
Run Code Online (Sandbox Code Playgroud)
我确信这是在google的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);
}
// ...
}-*/;
Run Code Online (Sandbox Code Playgroud)