我遇到了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表单元素。
有没有办法在回调视图中访问该功能?
答案 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)