上下文与Jquery文件上传和Backbone

sug*_*ane 0 javascript jquery coffeescript backbone.js jquery-file-upload

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

class MyBackboneView extends Backbone.view

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

    some_function: ->
        ...
Run Code Online (Sandbox Code Playgroud)

浏览器控制台中返回的错误是"未捕获的TypeError:对象#没有方法'some_function'",因为"this"不再引用Backbone视图,而是引用jquery表单元素.

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

Jon*_*ski 6

每个function(->)都有自己的context(this).这包括done: (e, data) -> ...,以及initialize_fileupload: -> ....并且,在这种情况下,它们每个都有自己的上下文值,因此this.some_function()不引用您的view.

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

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

它也可以通过将上下文值存储在范围变量中来实现:

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

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

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