2017-09-04 63 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定义了一个全局变量,或者本地定义一个整个函数,而不管块范围。