Свойства и замыкания объекта CoffeeScript - PullRequest
0 голосов
/ 17 ноября 2011

У меня есть класс MapHandler.

Я создал объект myMaphandler = new MapHandler и вызвал метод initialize.Но @ userLocationMarker.getPosition () возвращает null: (

Если я прокомментирую предупреждение и вызову @ userLocationMarker.getPosition () из консоли Chrome JS, я получу необходимые координаты.

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
      )

ССЫЛКА

Почему это происходит и что я должен сделать, чтобы избежать этой ситуации?

1 Ответ

6 голосов
/ 17 ноября 2011

Вы инициализируете @userLocationMarker с позицией null:

@userLocationMarker = @placeMarker(null, null)

И затем вы устанавливаете «реальную» позицию в handleMap:

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

, который используется как обратный вызов для getCurrentPosition:

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

Проблема в том, что getCurrentPosition является асинхронным, поэтому ваш alert вызывается до того, как handleMap был вызван getCurrentPosition. Все, что зависит от того, что getCurrentPosition делает, должно быть в обратном вызове handleMap, или они должны быть готовы обрабатывать данные, которые еще не поступили.

В вашем примере кода также есть опечатка, которую вы написали getCurrentPosition неправильно в блоке if navigator.geolocation.

К тому времени, когда вы попробуете проверить позицию с консоли JavaScript, getCurrentPosition вызвал handleMap, и @userLocationMarker будет правильно инициализировано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...