0

我有观点

class FoursquareSearch.Views.Origin extends Backbone.View

events:
    'change [name=origin]': 'setOrigin'
    'click [name=geolocate]' : 'geolocate'

  geolocate: ->
    navigator.geolocation.getCurrentPosition(@handle)

  handle: (response) ->
    @model.set(coords: response)  

我正在尝试确定设备的位置,然后使用响应设置模型。但是我得到

Uncaught TypeError: Cannot call method 'set' of undefined 

奇怪的是,这只发生在它在这个函数中时。例如,如果我使用:

  geocode: (location) ->
    data = 
      location: location

    $.ajax(
      type: 'POST'
      url: '/search/geocode'
      data: data
      dataType: 'json'

      error: (jqXHR, textStatus, errorThrown) =>
        alert("ERROR")


      success: (response, text, xhr) =>
        @model.set(coords: response)
        @center(@model.get('coords'))
        )

在同一个视图中它可以工作,而且效果很好......但是我无法获得其他功能来设置模型。我认为这是关于它是异步的。我绝不是这方面的专家,我一直在学习 Backbone,但这让我很难过!

4

1 回答 1

2

Geolocation API没有为getCurrentPosition回调函数指定任何特定的上下文,因此回调this内部可能是window; window通常不会有一个model属性,所以这个:

handle: (response) ->
  @model.set(coords: response)

getCurrentPosition调用它时最终看起来像这样:

handle: (response) ->
  window.model.set(coords: response)

所以handle尝试调用set不存在window.model的,这是你的Cannot call method 'set' of undefined错误。

尝试定义handle绑定方法

handle: (response) =>  # fat arrow here
  @model.set(coords: response)

您的其他@model.set调用工作正常,因为@您的视图对象确实具有model属性。

于 2012-06-14T16:48:07.057 回答