1

Android用のphonegapアプリケーションを作成しています。私はJavascriptにあまり詳しくなく、「マップ」と呼ばれるマップを初期化する関数と、データベースからロードされているマーカーのリストをマップに表示する関数の2つの関数があるシナリオに遭遇しました。

ただし、私の質問は、別の機能で開始されたマップにマーカーを表示するように設定するにはどうすればよいですか?

編集ここにいくつかのコードがあります:

function map() { ... map = new google.maps.Map(document.getElementById("map"), mapOptions);
... }

function markers() { var MarkerType1 = new google.maps.MarkerImage("/android_asset/www/assets/markerType1.png", new google.maps.Size(29.0, 48.0), new google.maps.Point(0, 0), new google.maps.Point(14.0, 24.0) );

var MarkerType2 = new google.maps.MarkerImage("/android_asset/www/assets/markerType2.png", new google.maps.Size(29.0, 48.0), new google.maps.Point(0, 0), new google.maps.Point(14.0, 24.0) );

var geocoder = new google.maps.Geocoder(); var eventList = $('ul#eventList').empty();

var eventPoints = $.ajax({
    type: 'GET',
    url: 'http://www.somedomain.com/loadEvents.php?&jsoncallback=?',
    dataType: 'JSONp',
    timeout: 5000,
    success: function(data) {
        $.each(data, function(i,item){
            if (item.EventType == 1) {                  
                    new google.maps.Marker({
                        position: new google.maps.LatLng(item.latitude, item.longitude),
                        map: this.map,
                        icon: MarkerType1,
                        draggable:false
                    });                      

            } else if (item.EventType == 2) {
                new google.maps.Marker({
                    position: new google.maps.LatLng(item.latitude, item.longitude),
                    map: this.map,
                    icon: MarkerType2,
                    draggable:false
                });
            }
        }
    }
});

}

4

2 に答える 2

1

これは可変スコープの問題です。変数mapが両方の関数の外部で宣言されていることを確認してください。

例えば。:

$(function() {
    var map;//outer variable is accessible within both functions.

    function createMap() {
        map = new google.maps.Map({
            ...
        });
    }

    function createMarkers() {
        $.ajax({
            ...
            success: function(data) {
                $.each(data, function() {
                    var marker = new google.maps.Marker({
                        map: map,
                        ...
                    });
                });
            }
        });
    }

    createMap();
    createMarkers();

});

実際には、マップ/マーカー作成コードを関数内に配置する必要があるのは、将来のイベントに応答して呼び出す必要がある場合のみです。

マップとそのマーカーをすぐに作成したい場合は、ページが読み込まれたときに、次のように作成できます。

$(function() {
    var map = new google.maps.Map({
        ...
    });

    $.ajax({
        ...
        success: function(data) {
            $.each(data, function() {
                var marker = new google.maps.Marker({
                    map: map,
                    ...
                });
            });
        }
    });
});
于 2012-12-21T16:27:59.217 に答える
0

これを私の頭の上から処理するには2つの方法があります。1 つの解決策は、マーカー スコープとマップ スコープの両方が現在のスコープの子孫になるまでスコープ チェーンを上っていき、変数をインスタンス化することです。

   var map;
   var markers;

次に、これらの関数で、生成されたオブジェクトをそれらの変数にバインドします。このようにして、両方がこれらの変数を介して他方にアクセスできるようになります。

もう 1 つの方法は、オブザーバー パターン (ここではいくつかの代替手段) を使用して、準備が整ったときにマップとマーカーを公開し、いずれか一方にサブスクライバーを配置して (適切と思われる場合)、他方の準備状況をリッスンし、渡されたオブジェクトをキャプチャすることです。

違いは、方法 1 がマップとマーカーを他のすべての子孫スコープに公開することです (望ましくない場合があります)。

于 2012-12-21T16:19:12.720 に答える