Wdrażam Mapę Google do joniki, ale stoję w obliczu problemu, próbując wdrożyć marker i infowindow.

Jak widać poniżej, gdy próbuję wdrożyć Infowainow do każdego markera, działa zgodnie z przeznaczeniem:

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]);
         })

Ale kiedy próbuję go zmodyfikować, aby użyć a do pętli, nie działa.

Wygląda dokładnie tak samo, ale nie wiem, dlaczego to nie działa.

// tutaj, to

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])

        })
    }

Próbowałem też tego:

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

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

Najpierw pomyślałem, że po kliknięciu pierwszym znacznikiem powinien się zalogować 1, a po kliknięciu drugiego markera należy zalogować się 2, ale jedyne rejestrowanie 2.

0
Pd.Jung 4 wrzesień 2017, 08:30

2 odpowiedzi

Najlepsza odpowiedź

Wraz z ostatnim rozwiązaniem Zamknięcie Działa, więc dlaczego nie otrzymasz oczekiwanego wyniku. Możesz użyć let zamiast var i będzie działać. var będzie zachować zmienną i dla każdej iteracji zmienisz tylko zmienną j. Więc po tym, jak można odnieść się do zmiennej j, która wartość jest 2. Z let dla każdej iteracji zostanie utworzona nowa zmienna, a każda funkcja będzie miała własną zmienną j.

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

Albo jeśli chcesz w środowisku pod ES6, możesz użyć Iefe, aby utworzyć zmienną scoped dla słuchaczy

for(var j = 0; j < 2; j++){
    ((k) => this.markerStart[k].addListener('click', () => console.log(k)))(j);
}
1
Suren Srapyan 4 wrzesień 2017, 05:36

Wystarczy wymienić var j=0; za pomocą let j=0; do pętli i będzie działać, jak się spodziewasz.

Ponieważ let oświadcza zmienną, która jest ograniczona w zakresie bloku, oświadczenia lub ekspresji, na której jest używany. Z drugiej strony var definiuje zmienną na całym świecie lub lokalnie do całej funkcji niezależnie od zakresu bloku.

0
Rohit Gupta 4 wrzesień 2017, 06:11