LoginSignup
6
6

More than 5 years have passed since last update.

イベントを活用する

Last updated at Posted at 2014-04-17

Apache CordovaでGoogle Mapsを表示します。

phonegap-googlemaps-pluginというプラグインを使用します。
インストール方法はこちらをご覧ください。
* Androidのインストール方法
* iOSのインストール方法

今回はイベントの仕組みを活用し、 地図ダイアログが閉じた時に地図上のマーカーを全て削除する という機能を実装します。

1. イベントとは

イベントとは、ある状態が変化した時にその事を通知する仕組みです。
イベントが発生したことを知るには、イベントリスナを追加します。
1つのイベントに対して、イベントリスナはいくつも追加することが可能です。

例えば、ボタンが押されたという事を検出するには、次のようなコードです。

var button = document.getElementById("button");
button.addEventListener("click", function() {
  console.log("ボタンがクリックされた");
});


button.addEventListener("click", function() {
  alert("ボタンがクリックされた");
});

2. phoengap-googlemaps-pluginでイベント処理

phonegap-googlemaps-pluginでは、MapMarkerPolylinePolygonCircleTileOverlayGroundOverlayクラスでは、イベントを使うことができます。

例えば次のようなコードで、これは地図の初期化が完了したことを検出します。

var map = plugin.google.maps.getMap();
map.addEventListener(plugin.google.maps.event.MAP_READY, function(map) {
  console.log("Mapの準備が完了");
});

イベントは 何かが変化したことを知る だけでなく、 何かが変化したことを知らせる ためにも使うことができます。

map.addEventListener("MY_EVENT", function() {
  alert("MY_EVENT が発生した");
});

map.trigger("MY_EVENT");

イベントと一緒にデータを渡すこともできます。

map.addEventListener("MY_EVENT", function(map, data) {
  alert("MY_EVENT (" +  data + ")が発生した");
});

map.trigger("MY_EVENT", "DATA1");
map.trigger("MY_EVENT", "DATA2");

3. マーカーをまとめて削除する

イベントを使って、マーカーをまとめて削除する、という処理を実装してみます。

まず イベントを使わないでコードを書くと、このようになります。
このコードの問題点は、マーカーを削除するためには、all_markers変数にアクセスできる必要があります。
JavaScriptコードを複数のファイルに分割するような場合、1つの変数が他のファイルからもアクセスできるようなコードを書くと、
コードが読みにくくなり、また変数を不意に上書きしてしまう、という危険性もあります。

//マーカーを保持するための配列
var all_markers = [];

//位置の定義
const GOOGLE = new plugin.google.maps.LatLng(37.422858, -122.085065);
const GOOGLE_TOKYO = new plugin.google.maps.LatLng(35.660556,139.729167);
const GOOGLE_SYDNEY = new plugin.google.maps.LatLng(-33.867487,151.20699);
const GOOGLE_NY = new plugin.google.maps.LatLng(40.740658,-74.002089);

//マーカーを追加する
var GOOGLES = [GOOGLE, GOOGLE_TOKYO, GOOGLE_SYDNEY, GOOGLE_NY];
GOOGLES.forEach(function(latLng) {

    map.addMarker({
        'position': latLng
    }, function(marker) {

        //配列にマーカーを追加
        all_markers.push(marker);
    });
});

//ボタンがクリックされたら、マーカーを削除する
var button = document.getElementById("button");
button.addEventListener("click", function() {

    //全てのマーカーをここで削除する
    all_markers.forEach(function(marker) {
        marker.remove();
    });
});

そこでイベントを使います。
イベントを使うことで マーカーを削除しろ という指示だけを発行し、その処理はそれぞれのイベントリスナに任せるのです。

//位置の定義
const GOOGLE = new plugin.google.maps.LatLng(37.422858, -122.085065);
const GOOGLE_TOKYO = new plugin.google.maps.LatLng(35.660556,139.729167);
const GOOGLE_SYDNEY = new plugin.google.maps.LatLng(-33.867487,151.20699);
const GOOGLE_NY = new plugin.google.maps.LatLng(40.740658,-74.002089);

//マーカーを追加する
var GOOGLES = [GOOGLE, GOOGLE_TOKYO, GOOGLE_SYDNEY, GOOGLE_NY];
GOOGLES.forEach(function(latLng) {

    map.addMarker({
        'position': latLng
    }, function(marker) {

        // MARKER_REMOVEイベントが発行されたら、マーカーを削除する
        map.addEventListener("MARKER_REMOVE", function() {
            marker.remove();
        });
    });
});

//ボタンがクリックされたら、マーカーを削除する
var button = document.getElementById("button");
button.addEventListener("click", function() {

    // MARKER_REMOVEイベントを発行する
    map.trigger("MARKER_REMOVE");
});

4.地図ダイアログが閉じたことを検出する

地図ダイアログが閉じられたことを検出するには、MAP_CLOSEイベントを検出します。

map.addEventListener(plugin.google.maps.event.MAP_CLOSE, function() {

    alert("地図が閉じられた");

});

img

5. 組み合わせる

これらを総合すると、以下のコードで 地図ダイアログが閉じた時に地図上のマーカーを全て削除する を実現できます。

function onMapReady(map) {
  /**
   * ボタン1が押されたら、地図を表示して、マーカーを追加する
   */
  var button1 = document.getElementById("button1");
  button1.addEventListener("click", function() {

    map.showDialog();

    /**
     * マーカーの追加
     */
    const GOOGLE = new plugin.google.maps.LatLng(37.422858, -122.085065);
    const GOOGLE_TOKYO = new plugin.google.maps.LatLng(35.660556,139.729167);
    const GOOGLE_SYDNEY = new plugin.google.maps.LatLng(-33.867487,151.20699);
    const GOOGLE_NY = new plugin.google.maps.LatLng(40.740658,-74.002089);

    var GOOGLES = [GOOGLE, GOOGLE_TOKYO, GOOGLE_SYDNEY, GOOGLE_NY];
    GOOGLES.forEach(function(latLng) {

      map.addMarker({
        'position': latLng
      }, function(marker) {

        // MARKER_REMOVEイベントが発行されたら、マーカーを削除する
        map.addEventListenerOnce("MARKER_REMOVE", function() {
          marker.remove();
        });

      });
    });

    // マーカーが画面に収まるようにカメラの位置を合わせる
    map.moveCamera({
      'target': GOOGLES
    });

  });


  /**
   * 地図ダイアログが閉じられた時、MARKER_REMOVEイベントを発行する
   */
  map.addEventListener(plugin.google.maps.event.MAP_CLOSE, function() {
    map.trigger("MARKER_REMOVE");
  });


  /**
   * 確認のために、ボタン2を押したら地図ダイアログを表示する
   */
  var button2 = document.getElementById("button2");
  button2.addEventListener("click", function() {

    map.showDialog();

  }, false);
}

img

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6