无法在异步函数 - 骨干中设置模型

时间:2012-06-14 16:18:47

标签: backbone.js coffeescript

我有观点

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,但这让我感到难过!

1 个答案:

答案 0 :(得分: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定义为bound method

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

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