将.js转换为.js.coffee时未捕获的ReferenceError

时间:2017-09-23 17:16:57

标签: javascript ruby-on-rails google-maps coffeescript

在将Uncaught ReferenceError转换为map之后,我将.js的{​​{1}}转换为.js.coffee,而不会更改流程或代码中的任何内容。

我的脚本在使用.js时运行正常,.js.coffee中没有。

我正在使用GMAP API以及时髦的infowindows,rails 5,ruby 2.4。

你知道为什么吗?

修改

为了清楚起见,我没有把mapOptions变量放在那里,它只是我存储GMAP Snazzy主题的文件中定义的变量。

markersData = '<%= raw @places_markers.to_json %>'

  markers = []

  icon =
    path: 'M4.415,8.829c2.432,0,4.415-1.983,4.415-4.415 C8.829,1.983,6.846,0,4.415,0S0,1.983,0,4.415C0,6.846,1.983,8.829,4.415,8.829z'
    fillColor: '#2962FF'
    fillOpacity: 1
    anchor: new (google.maps.Point)(0, 0)
    strokeWeight: 1
    scale: 2

  initializeMap = ->
    map = new (google.maps.Map)(document.getElementById('places-map'), mapOptions)

    google.maps.event.addListener map, 'click', ->
      infoWindow.close()

    displayMarkers(markersData)


  createMarker = (latlng, markerInfowindow, icon) ->
    marker = new (google.maps.Marker)(
      map: map
      position: latlng
      icon: icon
      draggable: true)

    markers.push(marker)

    google.maps.event.addListener marker, 'click', ->
      iwContent = markerInfowindow

      infoWindow = new SnazzyInfoWindow(
        marker: marker
        content: iwContent
        placement: 'top'
        maxWidth: 400
        maxHeight: 200
      )

      infoWindow.open(map, marker)

  displayMarkers = (markersData) ->
    bounds = new (google.maps.LatLngBounds)
    places_coordinates = []

    i = 0
    while i < markersData.length
      latlng = new (google.maps.LatLng)(markersData[i].place_lat, markersData[i].place_lng)

      markerInfowindow = markersData[i].infowindow

      places_coordinates.push(latlng)

      createMarker(latlng, markerInfowindow, icon)

      bounds.extend(latlng)
      i++

    markerCluster = new MarkerClusterer(map, markers)
    map.fitBounds(bounds)

  newLocation = (newLat, newLng) ->
    map.setCenter
      lat: newLat
      lng: newLng
    map.setZoom 15

  initializeMap()

1 个答案:

答案 0 :(得分:1)

mapinitializeMap中的局部变量:

initializeMap = ->
    map = new (google.maps.Map)(document.getElementById('places-map'), mapOptions)
    ...

所以除非你强迫它是全球性的,否则它在其他任何地方都不可见。除非您明确说明,否则CoffeeScript中的所有变量都是本地的。

您可以创建一个类并使map成为实例变量:

class YourMap
  constructor:
    @map = new google.maps.Map(...)

  # The rest of your code converted to methods goes here

或者,由于CoffeeScript wraps your code in a self executing function要维护其范围规则,您可以在函数外声明map

map = undefined
markersData = '<%= raw @places_markers.to_json %>'
markers = []
#...

然后将其他一切都留下。

在CoffeeScript中使用类可能会被认为更惯用。