0

我遇到了 jquery-file-upload 和 Backbone 的上下文问题。在 fileupload 'done' 回调中,我想调用 Backbone 视图中定义的另一个函数,但我丢失了上下文。

class MyBackboneView extends Backbone.view

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

    some_function: ->
        ...

浏览器控制台中返回的错误是“Uncaught TypeError: Object # has no method 'some_function'”,因为“this”不再指代 Backbone 视图,而是指 jquery 表单元素。

有没有办法从回调中访问视图中的该函数?

4

1 回答 1

6

每个函数 ( ->) 都有自己的上下文 ( this)。这包括done: (e, data) -> ...,以及initialize_fileupload: -> ...。而且,在这种情况下,它们每个都有自己的上下文值,所以this.some_function()不引用你的view.

因此,您必须定义done以保留周围的上下文 (the view)。这可以在 CoffeeScript 中通过使用“胖箭头”(=>)来定义来完成:

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()

或者通过将函数绑定到周围的上下文:

initialize_fileupload: ->
    $('form#my_form').fileupload
        done: ((e, data) ->
            this.some_function()
        ).bind(this)
于 2013-01-24T20:52:23.933 回答