0

我正在使用 Rails 3.0.9 版本和 jquery。我一直在使用这个没有数据库的 gem。它仅用于地图显示,并在其上显示 KML 文件。为此,我使用了:

<div id='ajax_map'>
    <% @kmlurl="http://mysite/file1.kml" %>
    <%= gmaps( :kml => { :data => "[{ url: #{@kmlurl.inspect}}]" } ) %>
</div>

所有精彩的节目。

我想在您更改链接 (@kmlurl) 后执行此操作,然后单击按钮,使用这个新的 KML 文件更新地图。我使用带有以下代码的单独操作 js.erb:

$('#ajax_map').html('<%= @kmlurl="http://mysite/file2.kml" %>'+'<br />'+'<%= gmaps( :kml => { :data => "[{ url: #{@kmlurl.inspect}}]" } ) %>');

但他没有更新 DIV。“js.erb”正常渲染,不使用gmaps()的方法正常返回@kmlurl。我在标签中的“.html.erb”中测试了相同的代码,它加载了一个新文件,但是,当然,只是在页面加载时。我怎么解决这个问题?

4

2 回答 2

1

解决问题如下(在js.erb中):

$('#ajax_map').html('<%= escape_javascript( gmaps({:last_map => false}) ) %>');

Gmaps.map = new Gmaps4RailsGoogle();
Gmaps.load_map = function() {
    Gmaps.map.map_options.maxZoom = 15;
    Gmaps.map.initialize();
Gmaps.map.kml = [{ url: '<%= "#{@kmlurl}" %>'}];
Gmaps.map.create_kml();
    Gmaps.map.adjustMapToBounds();
    Gmaps.map.callback();
};
Gmaps.loadMaps();
于 2012-05-07T22:37:16.207 回答
0

首先,我会稍微重构一下。

假设第一段代码在您的索引页中。我会将@kmlurl 的设置移动到相应的控制器操作中:

def index
   @kmlurl = "http://mysite/file1.kml"
end

然后(假设索引?)您的索引视图将很简单:

<div id="ajax_map">
  <%= gmaps( :kml => { :data => "[{ url: #{@kmlurl}}]" } ) %>
</div>

然后添加将更新地图的链接:

<%= link_to 'Other Map', '/othermap', :remote=>true %>

现在您将在 routes.rb 中创建一个路由:

match '/othermap' => 'foo#othermap'

然后在 foo_controller.rb 中:

def othermap
  @kmlurl = "http://mysite/file2.kml"
end

然后创建 othermap.js.erb:

$('#ajax_map').html(
  '<%= 
    escape_javascript(
      gmaps( :kml => { :data => "[{ url: #{@kmlurl}}]" } )
    )
   %>'
  )

这是一个快速修复,但我真正要做的是努力使您的视图代码尽可能简单,并在控制器中完成所有实际工作。理想情况下,您的观点只是:

<div id="ajax_map">
  <%= gmaps( :kml => { :data => @mapdata } ) %>
</div>

在您的控制器中根据需要设置@mapdata。您有太多真正属于嵌入在视图代码中的控制器的东西!您的 othermap.js.erb 应该同样简化。IE

$('#ajax_map').html('<%= escape_javascript(gmaps( :kml => { :data => @mapdata } ))%>')
于 2012-05-07T00:35:52.677 回答