有以下代码:
class OrdersBySalonUpdater
sendRequestToUpdateOrders: ->
console.log('123')
startDate = transformDate($("#from_datepicker"))
endDate = transformDate($("#to_datepicker"))
businessId = $(".maininfo__datepickerwrap").attr("data-business-id")
url = "some url"
$.get url, (data) ->
@updateOrders(data.orders)
updateOrders: (orders) ->
$("#salon_stat_table tr").slice(1).remove()
$.each orders, (index) ->
console.log(orders[index])
但是当我执行以下内容时:
x = new OrdersBySalonUpdater()
x.sendRequestToUpdateOrders()
我收到消息“TypeError:this.updateOrders不是函数”。我该如何解决?有什么问题?感谢。
答案 0 :(得分:1)
在JavaScript中,this
是一个上下文对象。它可以改变,通常是在我们不想要的时候。
当您编写@updateOrders(data.orders)
时,CoffeeScript会将其转换为JavaScript this.updateOrders(data.orders)
。但是,您在jQuery的updateOrders
回调中调用$.get
。代码执行后,this
不再引用您的OrdersBySalonUpdater
类 - the context passed in the Ajax settings, or the settings themselves。
我们有三种方法可以解决这个问题。最后一个是最好的 - 它是最短的,也是最惯用的CoffeeScript。
存储this
的当前值,并在回调中使用。 this
可以更改,但如果我们将其当前值存储在变量中,那么我们以后可以使用它。调用这些变量that
:
sendRequestToUpdateOrders: ->
that = this
url = "some url"
$.get url, (data) ->
that.updateOrders(data.orders)
将this
作为上下文传递给您的回调。 jQuery允许我们将context
选项传递给我们的Ajax方法。我们传递的任何内容都将在回调中以this
:
sendRequestToUpdateOrders: ->
url = "some url"
$.get url,
success: (data) ->
@updateOrders(data.orders)
context: this
使用CoffeeScript胖箭头编写回调。胖箭defines a function and binds this
for you:
sendRequestToUpdateOrders: ->
url = "some url"
$.get url, (data) =>
@updateOrders(data.orders)