1

我正在尝试使用骨干网、咖啡脚本和谷歌地图 api。我能够渲染地图并添加中心标记。我在地图上添加位置集合作为 morker 时遇到问题。如何与视图中的其他功能或应用程序的其他部分共享下面的@map 对象?

在 addMarker @map 中未定义。

render: ->
    $(@el).html(@template())
    primary = @collection.at(@collection.length - 1)
    if primary
      latlng = {}
      @collection.each(@appendLocation)
      latlng['latitude'] = primary.attributes.latitude;
      latlng['longitude'] = primary.attributes.longitude;
      @renderMap(latlng)
   this

  renderMap: (latlng) ->
    view = new Bone.Views.Map()
    $('#map').append(view.render().el)
    latlng = new google.maps.LatLng(latlng['latitude'], latlng['longitude'])
     myOptions =
      zoom: 12
      center: latlng
      mapTypeId: google.maps.MapTypeId.ROADMAP
     @map = new google.maps.Map(view.render().el, myOptions)
    marker = new google.maps.Marker({
      position: latlng,
      animation: google.maps.Animation.DROP,
      map: @map,
      title:"Hello World!"
    })
    @collection.each(@addMarker)

  addMarker: (location)->
    console.log(@map) <-----UNDEFINED
    latlng = new google.maps.LatLng(location.attributes.latitude, location.attributes.longitude)
    console.log location.attributes.latitude
    location_marker = new google.maps.Marker({
      position: latlng,
      animation: google.maps.Animation.DROP,
      map: @map,
      title:"Hello World!"
    })
4

1 回答 1

0

我假设您的缩进问题只是一个复制/粘贴错误,并且您的代码看起来像这样:

renderMap: (latlng) ->
  view = new Bone.Views.Map()
  $('#map').append(view.render().el)
  latlng = new google.maps.LatLng(latlng['latitude'], latlng['longitude'])
  myOptions =
    zoom: 12
    center: latlng
    mapTypeId: google.maps.MapTypeId.ROADMAP
  @map = new google.maps.Map(view.render().el, myOptions)
  marker = new google.maps.Marker({
    position: latlng,
    animation: google.maps.Animation.DROP,
    map: @map,
    title:"Hello World!"
  })
  @collection.each(@addMarker)

each集合上的方法只是 Underscore 的一个薄包装,each精美的手册有这样的说法each

每个 _.each(list, iterator, [context])别名:forEach

迭代一个元素列表,依次将每个元素生成一个迭代器函数。如果传递了一个,则迭代器绑定到上下文对象。

使用时没有指定上下文each

@collection.each(@addMarker)

所以@(AKA this) 将在window(或者你的环境中的任何全局上下文) inside addMarker。你想@成为你的观点,所以要么指定上下文:

@collection.each(@addMarker, @)

或定义addMarker绑定函数

addMarker: (location) =>
  #...

您也可以_.bindAll在视图的initialize方法中使用,但这在 CoffeeScript 中很少见。

于 2012-11-04T20:01:12.067 回答