7

我希望能够通过 javascript 循环通过实例 var,但我不太确定如何使其工作。

javascript:
  -@spots.each do |spot|
      map.addMarker({
        lat: "#{spot.latitude}",
        lng: "#{spot.longitude}",
        title: "spot",
      });
  });

我尝试了什么:使用 <% @spots.each 做 |spot| %> 并且没有 #{} 的引号

4

2 回答 2

8

似乎一旦你进入了javascript:slim 块,你就不能再做 ruby​​ 循环了。

我能够让它大部分工作

- @spots.each do |spot|
  javascript:
    map.addMarker({
      lat: #{spot.latitude},
      lng: #{spot.longitude},
      title: "spot"
    });

但这为每个addMarker调用创建了单独的脚本标签,这看起来很愚蠢。

您也可以尝试将数据作为 JSON 放在页面上,然后在 Javascript 中执行循环。像这样的东西:

javascript:
  var spots = #{raw @spots.to_json};
  var ii = 0;
  var nspots = spots.length;
  for(;ii<nspots;++ii) {
    theMap.addMarker(spots[ii]);
  }

你想确保theMap在这些东西运行时它是可用的,但我认为这可能会奏效。您还应该检查每个 @spot 的 JSON 格式。根据您设置 JSON 的方式,每个位置可能看起来像

{'spot': { 'latitude': ###, 'longitude': ### } } 

这意味着您必须取消引用循环中的对象。

于 2013-11-09T22:23:24.307 回答
2

如果斑点太长,容易修复但效率不高。

-@spots.each do |spot|
  javascript:
    map.addMarker({
      lat: "#{spot.latitude}",
      lng: "#{spot.longitude}",
      title: "spot",
    });

2.在js中循环而不是查看上下文

javascript:
  var spots = #{@spots.to_json};
  $(spots).each(function(index, obj) {
    map.addMarker({
      lat: obj.latitude,
      lng: obj.longitude,
      title: "spot",
    });
  });
于 2013-11-09T22:21:47.227 回答