2012-05-29 109 views
4

我正在使用gmaps4rails將地圖添加到我的rails應用程序。 我正在嘗試通過點擊標記來記錄用戶的年齡。獲取點擊標記的ID

在我的索引行動我有 -

@json = User.all.to_gmaps4rails do |user, marker| 
     marker.json({ :id => user.id, :age => user.age }) 
    end 

這是創建地圖和添加我的所有標記。

如果我把Gmaps.map.markers [0]在我的js控制檯我可以看到我的對象,可以看到它有年齡屬性。

我試圖做這樣的事情,通過點擊登錄該屬性 -

<script type="text/javascript"> 
    Gmaps.map.callback = function() { 
    for (var i = 0; i < this.markers.length; ++i) { 
    google.maps.event.addListener(
    Gmaps.map.markers[i].serviceObject, 'click', function() { console.log(this.age) }); 
    } 
};   
</script> 

this.age是不確定的。顯然,它正在記錄serviceObject而不是標記對象。

我在做什麼錯?

回答

4

你是一個封閉的工作和你正在運行到一個問題,即「本」並不指的對象,您認爲它。爲了引用Gmaps.map.markers [*],首先創建一個立即的功能,通過在「i」的值通過,並返回記錄該屬性。年齡的函數:

<script type="text/javascript"> 
    Gmaps.map.callback = function() { 
    for (var i = 0; i < this.markers.length; ++i) { 
    google.maps.event.addListener(
    marker.serviceObject, 'click', (function(i) { 
     return function() { 
      console.log(Gmaps.map.markers[i].age) 
     } 
    })(i)); 
    } 
};   
</script> 

聲明函數(閉包)在循環中可能會很棘手。這裏是一個非常有用的步行通過的解釋,我發現:http://www.mennovanslooten.nl/blog/post/62

+0

好的博客貼子,封鎖確實會有點有時疼我的頭。 – Finnnn

+0

這是一個非常好的答案,謝謝你的幫助 – Finnnn

1

要正確使用閉包,這樣做:

<script type="text/javascript"> 
    Gmaps.map.callback = function() { 
    for (var i = 0; i < Gmaps.map.markers.length; ++i) { 
    marker = Gmaps.map.markers[i]; 
    google.maps.event.addListener(
    marker.serviceObject, 'click', function() { console.log(marker.age) }); 
    } 
};   
</script> 
+0

簡單,現在我把它做好。非常感謝。熱愛寶石btw,真的很期待完成的開放版本。 – Finnnn

+0

不幸的是,我還沒有計劃開展工作:我很忙,但開放貢獻 – apneadiving

+0

我仍然是一個鐵軌初學者,但我一定會盡我所能做出貢獻。 – Finnnn