0

jquery-file-uploadとBackboneでコンテキストの問題が発生しています。fileupload'done'コールバックで、バックボーンビューで定義された別の関数を呼び出したいのですが、コンテキストが失われます。

class MyBackboneView extends Backbone.view

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

    some_function: ->
        ...

ブラウザコンソールに返されるエラーは「UncaughtTypeError:Object#has no method'some_function'」です。これは、「this」がバックボーンビューではなく、jqueryフォーム要素を参照しているためです。

コールバックからビューでその関数にアクセスする方法はありますか?

4

1 に答える 1

6

すべての関数 ( ->) には独自のコンテキスト ( 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()

コンテキスト値をスコープ変数に格納することによっても実現できます。

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 に答える