我有观点
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,但这让我感到难过!
答案 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
属性。