2

GWT Web アプリケーション内で位置情報を取得するために、W3C Geolocation API を使用しています。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

thisJSNIブロック内の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);
    }

    // ...
}-*/;

これは、少なくとも通過する例では、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);
    }

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

これに関連して、Java メソッドを呼び出すときに 2 番目の角かっこのペアを忘れてしまうと、同じ動作が発生します。最初のペアは識別目的でメソッド ヘッダーを再記述し、2 番目のペアは実際の引数を含みます。この間違いは、引数がない場合に特に犯しやすいです。

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