2016-08-12 55 views
1

我認爲這個問題是真的清楚。這是我的代碼:如何通過真正的價值,而迭代循環?

// Add markers for each spot 
for(var spot of spots) { 

    var spotId: number = +spot.id; 
    console.log(spotId); 

    // Add marker for current spot 
    L.marker([spot.latitude, spot.longitude], {icon: this.mapService.getSchoolIcon() }) 
    .addTo(this.map) 
    .on('click',() => console.log('CLICKED: ' + spotId) ); 
} 

而且這是在控制檯輸出,如果我點擊的所有引腳:

1 
2 
3 
4 
CLICKED: 4 
CLICKED: 4 
CLICKED: 4 
CLICKED: 4 
+0

如果你正在寫打字稿,爲什麼不使用'let'? https://www.typescriptlang.org/docs/handbook/variable-declarations.html – crashmstr

+0

由於JS沒有塊範圍,唯一的功能範圍,您只創建'spotId'一次,然後循環使用的所有其他迭代(並修改)相同的'spotId'。請參閱Sushanth的答案。 – CoconutFred

+0

這是因爲關閉,要打印相應的數字,你需要做以下任一修改, - 你可以使用'let'而不是'var' - 或者你可以使用自動執行匿名函數 –

回答

1

更換var spotIdlet spotId應該解決的問題,因爲它會使spotId塊範圍變量。

+0

謝謝,這也適用於我。我認爲這將是更優雅的解決方案。 – rakete

1

它經典關閉問題的情況下。

爲了解決我們一般通過ARG到的範圍,其形成在excecution時的閉合。

(function(scopedSpotId) { 
    return function() { 
     console.log('CLICKED: ' + scopedSpotId); 
    } 
}(spotId)) 

您必須爲循環中的每個元素返回一個新函數。

((scopedSpotId) -> 
    -> 
    console.log 'CLICKED: ' + scopedSpotId 
    return 
) spotId 
+0

如果你願意,你可以添加此工作的代碼作爲一個例子:L.marker([spot.latitude,spot.longitude],{圖標:this.mapService.getSchoolIcon()}) .addTo(this.map) 。對( '點擊', (functionld(scopedSpotId){ }(spotId)));(函數(scopedSpotId) – rakete