Gmaps4Rails.clear_marker TypeError: невозможно прочитать свойство «serviceObject» со значением null

Я динамически обновлял свой Gmaps4Rails, ожидая, пока пользователь перестанет вводить форму поиска в течение 0,5 с, а затем отправив запрос AJAX. Однако после 2 или 3 запросов карта перестает обновляться после Gmaps4Rails.replaceMarkers с ошибкой Javascript

TypeError: Не удается прочитать свойство serviceObject со значением null

который я отследил до Gmaps4Rails.clear_marker:

Gmaps4Rails.clearMarker = function(marker) {
  if (marker!=null) { // <-- I've added this line to make it work
    marker.serviceObject.setMap(null);
  }                   // <-- I've added this line to make it work
};

Это что-то, что нужно исправить, или я делаю что-то не так в другом месте?

Вот соответствующий раздел из моего application.rb

$('.venue_find').live('keyup', function() {
    window.clearTimeout(window.timeOutId);
    window.timeOutId = window.setTimeout(function() {
    $.get('/venues/find?address='+$('#venue_address').val()+","+$('#venue_city').val()+","+$('#venue_state').val()+","+$('#venue_postal_code').val()+","+$('#venue_country').val());
    },500); 
});

Карта настроена так:

<div id="venue_form">
  <div id="venue_map">
    <%= gmaps("map_options"=>{"centre_latitude"=>51.500181,"centre_longitude"=>-0.12619,"maxZoom" => 16, "auto_zoom"=>true},"markers"=>{"data"=>@json}) %>
  <div id="addresses">
  </div>
</div>

Вот соответствующие материалы из */venues/_form.html.erb*

<%= form_for(@venue, :remote=>true) do |f| %>
    <div class="field">
        <%= f.label :address %><br />
        <%= f.text_field :address, :class=>"venue_find" %>
    </div>
    <div class="field">
        <%= f.label :city %><br />
        <%= f.text_field :city, :class=>"venue_find" %>
    </div>
    <div class="field">
        <%= f.label :state %><br />
        <%= f.text_field :state, :class=>"venue_find" %>
    </div>
    <div class="field">
        <%= f.label :postal_code %><br />
        <%= f.text_field :postal_code, :class=>"venue_find" %>
    </div>
    <div class="field">
        <%= f.label :country %><br />
        <%= f.text_field :country, :class=>"venue_find" %>
    </div>
<% end %>

Вот сайты_controller.rb

def find
  if !params[:address].nil? && params[:address]!=""
    begin
      addresses=Gmaps4rails.geocode(params[:address])
      @json = "[" + addresses.map {|a|  "{\"lng\": \"#{a[:lng]}\",\"lat\": \"#{a[:lat]}\"} " }.join(",")+"]"
      @matched_addresses = addresses.map{|a| a[:matched_address]}.join("<br/>")
    rescue Gmaps4rails::GeocodeStatus
      @json=[]
      @matched_addresses=[]
    end
  else
    @json=[]
  end
  respond_to do |format|
    format.js
  end
end

И, наконец, find.js.erb

$('#addresses').empty();
$('#addresses').html('<%=pluralize(@matched_addresses.length,'result')%><br/><%=raw @matched_addresses %>');
Gmaps4Rails.replaceMarkers(<%= raw @json %>);

person David    schedule 09.08.2011    source источник


Ответы (1)


Я не могу воспроизвести вашу ошибку и даже не могу понять, чем полезно ваше исправление :)

Собственно, в clearMarkers есть цикл по всем существующим маркерам:

for (var i = 0; i < this.markers.length; ++i) {
  this.clearMarker(this.markers[i]);
}

Так что, если нет маркера, нет цикла...

Не могли бы вы предоставить больше контекста?

Я разместил этот длинный комментарий в качестве ответа, потому что почти единственный, кто ответил на этот тег

person apneadiving    schedule 10.08.2011
comment
Я согласен с вашей логикой - это было очень странно. Починив его и изменив другие детали, я попытался вернуться и снова сломать его, как описано выше, и он отказывается ломаться. Я оставлю спящих собак лежать, но все равно большое спасибо за вашу помощь! - person David; 10.08.2011