2017-01-19 7 views
1

ionic/angular2アプリを実行しています。表示されているGoogleマップがあります。私はmarkersと呼ばれる観測値を持っており、これはGoogleマップのマーカーオブジェクトの配列です。私は配列にそれらをマップに表示させるためにそれらをプッシュします。その後、すべてのマーカーにイベントリスナーを追加します。クリックは機能しますが、私はthis.markersへのアクセスを失います。なぜこれが起こるのですか?より良い質問は、クラス全体でアクセス可能な単純な変数を作成するにはどうすればよいでしょうか?Angular2:Observableへのアクセスを失う

はここに私のコードです:あなたのコールバックthis.markerClickedが呼ばれたとき、それはもはやクラスにバインドされているので、それはthis.markersはもはやので、アクセスされていないよう

export class MapView 
{ 
    markers: any; 

    ngOnInit() 
    { 
    //initialization for map and the raw marker array data not shown 
    this.addListeners() 
    } 

    addListeners() //functions properly (this.markers is accessible) 
    { 
    console.log(this.markers) //displays the markers array properly 
    for(var i = 0; i < this.markers.length; i++) 
    { 
     this.markers[i].addListener("click",this.markerClicked, this); 
    } 
    } 

    markerClicked(marker) //the clicked marker is passed 
    { 
    console.log(this.markers); 
    //here is the problem. The console says that the markers array is empty 
    //when called from this function 
    } 
} 

答えて

1

が見えません。

は、私は2つのオプションを参照してください。

1)あなたのコールバックをインライン化し、矢印の機能を使用して、それを宣言し(矢印機能は

this.markers[i].addListener("click", (marker) => { 
    // do something with marker and this.markers 
    console.log(this.markers); 
}, this); 

2)は少しハックようだが)thisのコンテキストを保存します。..コールバックをクラスにバインドしようとしましたか?

this.markerClickedの代わりにthis.markerClicked.bind(this)のようなものがあります。

+0

これは完璧に機能しました!もう1つの追加の質問:アレイからのマーカーのどれが実際にクリックされたのかわかる方法はありますか?私は矢印関数に 'i'インデックスを渡そうとしていましたが、それを働かせることができませんでした。他のアイデア? –

+0

GMaps APIをインラインにしておきたい場合は、marker.addListener( 'click'、()=> {...}) 'のように別のイベントリスナーをマーカ自体に付ける必要があります。次に、必要に応じて、矢印関数内から 'marker'変数を再利用することができます。 – AngularChef

関連する問題