0

我有上下文問題與jquery文件上傳和主幹。在fileupload'done'回調中,我想調用Backbone視圖中定義的另一個函數,但是我失去了上下文。上下文與jquery文件上傳和主幹

class MyBackboneView extends Backbone.view 

    initialize_fileupload: -> 
     $('form#my_form').fileupload 
      done: (e, data) -> 
       this.some_function() 

    some_function: -> 
     ... 

在瀏覽器控制檯返回的錯誤是 「未捕獲類型錯誤:對象#沒有方法‘some_function’」,因爲「這個」不再指骨幹視圖,但是jquery的形式的元素。

有沒有一種方法可以在回調視圖中訪問該函數?

回答

6

每個函數(->)都有自己的上下文(this)。這包括done: (e, data) -> ...以及initialize_fileupload: -> ...。而且,在這種情況下,它們都有自己的上下文值,所以this.some_function()沒有引用您的view

所以,你必須定義done來保持周圍的環境(view)。這可以在CoffeeScript中通過用「fat arrow」(=>)定義它,而不是來完成:

initialize_fileupload: -> 
    $('form#my_form').fileupload 
     done: (e, data) => 
      this.some_function() 

它也可以通過在一個範圍的變量存儲的上下文值來實現:

initialize_fileupload: -> 
    thisView = this 
    $('form#my_form').fileupload 
     done: (e, data) -> 
      thisView.some_function() 

或者通過binding the function至周圍環境:

initialize_fileupload: -> 
    $('form#my_form').fileupload 
     done: ((e, data) -> 
      this.some_function() 
     ).bind(this)