【问题标题】:CoffeeScript object properties and closuresCoffeeScript 对象属性和闭包
【发布时间】:2011-11-16 21:53:32
【问题描述】:

我有一个 MapHandler 类。

我创建了一个对象 myMaphandler = new MapHandler 并调用了初始化方法。 但是 @userLocationMarker.getPosition() 返回 null :(

如果我要评论警报并从 Chrome JS 控制台调用 @userLocationMarker.getPosition(),我会得到必要的坐标。

class window.MapHandler

  initialize: (centerLocation) ->
    @makeMap(centerLocation)
    @defineUserLocation()
    alert @userLocationMarker.getPosition()


  makeMap: (centerLocation) ->
    myOptions =
      zoom: 14
      center: centerLocation
      mapTypeId: google.maps.MapTypeId.ROADMAP
    @map = new google.maps.Map(document.getElementById("map_canvas"), myOptions)


  placeMarker: (location, icon_path) ->
    if icon_path
      markerImage = new google.maps.MarkerImage(icon_path, null, null, null, new google.maps.Size(25, 25))
    else
      markerImage = null
    marker = new google.maps.Marker(
      position: location
      map: @map
      icon: markerImage)

  defineUserLocation: () ->
    @userLocationMarker = @placeMarker(null, null)

    handleMap = (position) =>
      pos = new google.maps.LatLng(position.coords.latitude, position.coords.longitude)
      infowindow = new google.maps.InfoWindow(
        map: @map
        position: pos
        content: 'Если это не ваше местоположение - передвиньте маркер'
      )
      @map.setCenter(pos)
      @userLocationMarker.setPosition(pos)

    if navigator.geolocation
      @userPosition = navigator.geolocation.getCurrentPositon(
        handleMap
      )

LINK

为什么会发生这种情况,我应该怎么做才能避免这种情况?

【问题讨论】:

  • 只是为了澄清.. console.log(@userLocationMarker.getPosition()) 给你正确的数据?我觉得您的帖子中缺少某些内容...您在使用图书馆吗?
  • 好的,getPosition 到底是在哪里定义的?
  • 这是一个 Google Maps API 和 Marker 类的这个方法。
  • 当我从 JS 控制台调用 myMapHandler.userLocationMarker.getPosition() 我得到:Q Pa: 54.7242243 Qa: 20.46035059999997 proto: Q
  • 好吧,当您在尝试提醒它之前调用 defineUserLocation 时,您将 userLocationMarker 设置为 null... @userLocationMarker = @placeMarker(null, null) 我不知道它会在哪里换到你的位置。如果不亲自进行实际测试,就很难解决这样的问题。发出警报以确保您的位置正在设置中。

标签: javascript variables closures coffeescript


【解决方案1】:

您使用null 位置初始化@userLocationMarker

@userLocationMarker = @placeMarker(null, null)

然后您在handleMap 中设置“真实”位置:

handleMap = (position) =>
  #...
  @userLocationMarker.setPosition(pos)

用作getCurrentPosition的回调:

if navigator.geolocation
  @userPosition = navigator.geolocation.getCurrentPosition(
    handleMap
  )

问题在于getCurrentPosition 是异步的,因此您的alerthandleMapgetCurrentPosition 调用之前被调用。任何取决于getCurrentPosition 所做的事情都必须在handleMap 回调中,否则他们需要准备好处理尚未到达的数据。

您的示例代码中还有一个拼写错误,您在 if navigator.geolocation 块中拼写了 getCurrentPosition 错误。

当您尝试从 JavaScript 控制台检查位置时,getCurrentPosition 已调用 handleMap 并且 @userLocationMarker 将正确初始化其位置。

【讨论】:

  • @Trevor:认为你可能会因为囤积 CoffeeScript 积分而感到孤独 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 2013-05-13
  • 2017-11-13
  • 2022-07-07
  • 2014-06-06
  • 2011-12-11
相关资源
最近更新 更多