4

我正在使用 gmaps4rails 将地图添加到我的 rails 应用程序。我正在尝试通过单击标记来记录用户的年龄。

在我的索引操作中,我有 -

    @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

2 回答 2

4

您正在使用闭包,并且遇到了一个问题,即“this”并不指代您认为它所指的对象。为了引用 Gmaps.map.markers[*],首先创建一个立即函数,按值传入 'i',并返回一个记录 .age 属性的函数:

<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

于 2012-05-29T22:27:17.987 回答
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>
于 2012-05-29T22:18:27.960 回答