在CoffeeScript中,JS消息“不是一个函数”

时间:2014-09-04 07:23:44

标签: javascript coffeescript

有以下代码:

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不是函数”。我该如何解决?有什么问题?感谢。

1 个答案:

答案 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。

  1. 存储this的当前值,并在回调中使用this可以更改,但如果我们将其当前值存储在变量中,那么我们以后可以使用它。调用这些变量that

    是一种常见的约定
    sendRequestToUpdateOrders: ->
      that = this
      url = "some url"
    
      $.get url, (data) ->
        that.updateOrders(data.orders)
    
  2. this作为上下文传递给您的回调。 jQuery允许我们将context选项传递给我们的Ajax方法。我们传递的任何内容都将在回调中以this

    的形式提供
    sendRequestToUpdateOrders: ->
      url = "some url"
    
      $.get url, 
        success: (data) ->
          @updateOrders(data.orders)
        context: this
    
  3. 使用CoffeeScript胖箭头编写回调。胖箭defines a function and binds this for you

    sendRequestToUpdateOrders: ->
      url = "some url"
    
      $.get url, (data) =>
        @updateOrders(data.orders)