上下文与Jquery文件上传和Backbone

时间:2013-01-24 20:26:35

标签: javascript jquery backbone.js coffeescript 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: ->
        ...

浏览器控制台中返回的错误是 “Uncaught TypeError:Object#没有方法'some_function'”因为“this”不再引用Backbone视图,而是引用jquery表单元素。

有没有办法在回调视图中访问该功能?

1 个答案:

答案 0 :(得分: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)