2017-09-04 28 views
0

我正在實施谷歌地圖離子,但我面臨一個問題,試圖實現標記和infowindow。實施forloop點擊addListener

正如你可以看到下面,我曾經嘗試實施信息窗口到每個標記的,它按預期工作:

this.markerStart[0].addListener('click',()=>{ 
      console.log('clicked') 
      this.popuparray[0].open(this.map,this.markerStart[0]); 
     }) 
     this.markerStart[1].addListener('click',()=>{ 
      console.log('clicked2222') 
      this.popuparray[1].open(this.map,this.markerStart[1]); 
     }) 

,但是當我試圖修改它使用一個for循環,然後它不工作。

看起來完全一樣,但我不知道爲什麼它不起作用。

//這裏,this.markerStart.length是2 ...但它在for循環中不起作用。

console.log(this.markerStart); 
    console.log(this.markerStart.length); 
    console.log("this.markerStart") 
    for(var j=0; j<this.markerStart.length; j++){ 
     this.markerStart[j].addListener('click',()=>{ 
      console.log(j); 
      //only log 2 ...which is I don't understand. why log 2? 
      // j should be 0 and 1...because this.markerStart.length is 2 
      this.popuparray[j].open(this.map,this.markerStart[j]) 

     }) 
    } 

我嘗試這樣做,以及:

for(var j=0; j<2; j++){ 

     this.markerStart[j].addListener('click',()=>{ 
      console.log(j); 
     }) 
    } 

所以我起初以爲,當我點擊第一個標記就應登錄1,點擊第二個標記時,應當記錄2,但只有其日誌記錄2.

+0

當點擊被調用時,'j'是'this.markerStart.length' - 它是2? –

回答

1

隨着最後的解決方案closure的作品,所以你爲什麼沒有得到預期的結果。您可以使用let而不是var,它可以工作。 var將保持您的變量,並且對於每次迭代,您只會更改唯一變量j。因此畢竟你指的是一個變量j,其值爲2。對於每次迭代使用let,將創建一個新變量,並且每個函數將擁有它自己的變量j

for(let j = 0; j < 2; j++){ 
    this.markerStart[j].addListener('click',() => console.log(j)); 
} 

或者,如果你的環境要ES6下,你可以使用IIFE創建一個範圍變量的聽衆

for(var j = 0; j < 2; j++){ 
    ((k) => this.markerStart[k].addListener('click',() => console.log(k)))(j); 
} 
0

只是let j=0;更換var j=0;在for循環,也將努力爲你的預期。

因爲let將範圍受限的變量聲明爲使用它的塊,語句或表達式。另一方面,var定義了一個全局變量,或者本地定義一個整個函數,而不管塊範圍。