0

我收到的错误this.clustererundefined. 你可以在下面看到我的配置。

预期行为:加载页面,而不是使用#search_form. 最后将标记添加到#map并聚类它们。

我的 js.coffee

$ ->
  handler = Gmaps.build('Google');
  handler.buildMap { provider: {center: new google.maps.LatLng(49.639177, 9.536133),zoom: 6}, internal: {id: 'map'}},
    ()->
      handler._createClusterer()

  markers = []
  placeMarkers = (data, textStatus, jqXHR) ->
    handler.removeMarkers(markers);
    markers = handler.addMarkers(data)  # <<--- here is the error

  $("#search_form").submit (e) ->
    valuesToSubmit = $(this).serialize
    $.ajax({
      url: $(this).attr("action"),
      data: valuesToSubmit,
      success: placeMarkers,
      dataType: 'json'
    })
    e.preventDefault

  $("#search_form").submit()

和控制器:

def index
respond_to do |format|
  format.html {}
  format.json {
    seminars = Seminar.search(params[:search])
    @markers = Gmaps4rails.build_markers(seminars) do |seminar, marker|
    return if seminar.location.is_a? String
      marker.lat seminar.location.lat
      marker.lng seminar.location.lon
      marker.infowindow render_to_string(:partial => 'seminars/seminar.html.haml', :locals => {seminar: seminar})
      marker.title seminar.course.title
      marker.json({ :id => seminar.id })
    end
    render json: @markers
  }
end

end

以及来自控制器的响应:

[{"lat":52.517,"lng":13.3889,"marker_title":"Title1","id":1},
 {"lat":51.5114,"lng":7.46517,"marker_title":"Title2","id":3}]

这是堆栈跟踪

Gmaps.Objects.Handler.Handler.addMarker (application.js:22417)
(anonymous function) (application.js:22409)
_.map._.collect (application.js:21094)
Gmaps.Objects.Handler.Handler.addMarkers (application.js:22408)
placeMarkers (application.js:23263)
jQuery.Callbacks.fire (application.js:3049)
jQuery.Callbacks.self.fireWith (application.js:3161)
done (application.js:8236)
jQuery.ajaxTransport.send.callback (application.js:8779)

版本 gmaps4rails-2.1.1

4

2 回答 2

0

很奇怪,我再也无法重现了……

我认为更改是添加$("#search_form").submit()到 onMapLoad 处理程序。

$ ->
  handler = Gmaps.build('Google');
  handler.buildMap { provider: {center: new google.maps.LatLng(49.639177, 9.536133),zoom: 6}, internal: {id: 'map'}},
    ()->
      $("#search_form").submit()

谢谢你的提示@apneadiving

于 2013-12-19T09:47:11.540 回答
0

最近有同样的问题。基本上@apneadiving 的建议是:在 buildMap 的回调处理程序完成之前完成 ajax 调用时,这是一个时间问题。

解决方案:要么只从回调处理程序(又名序列化)内部开始 ajax 调用,要么我更喜欢:从你的 ajax 响应中通过 setTimeout 使用回调。这应该使您的应用程序更具响应性,因为调用和处理可以并行完成。

于 2017-09-12T16:54:11.893 回答