0

XMLHttpRequestを使用してファイルをサーバーに正常に送信するコレクションがあります。しかし、XHR2イベントに関数をアタッチする方法がわかりません。

コードがsend()内に直接ある場合にのみ機能しているようです:

var Photos = Backbone.Collection.extend({
    url: config.url,

    /**
     * Send file to server.
     * @todo Should Backbone.sync be overwritten instead?
     */
    send: function (file) {
        var data = new FormData(),
            xhr = new XMLHttpRequest();

        // ======> Doesn't work:
        xhr.addEventListener('load', this.onLoad(xhr));

        // ======> Doesn't work either:
        xhr.onload = this.onLoad(xhr);

        // ======> But this works:
        xhr.onload = function () {
            var response = $.parseJSON(xhr.responseText);
            console.log(response); // Works!
        };

        data.append('file', file);

        xhr.open('POST', this.url);
        xhr.send(data);
    },

    /**
     * Respond to XHR2 'onload' event.
     */
    onLoad: function (xhr) {
        var response = $.parseJSON(xhr.responseText);
        console.log(response); // Doesn't work!
    }

});

なぜそうなのか、そしてどうすればコードをsend()の外で別の関数に移動できますか?

4

2 に答える 2

0

this.onLoad(xhr)関数参照を渡すのではなく、で関数を呼び出しています。試す

var self = this;
xhr.onload = function () {
    self.onLoad(xhr);
};
于 2013-01-09T01:28:03.117 に答える
0

したがって、 MusaJonathan Lonowskiのおかげで、次の作業コードができました。

var Photos = Backbone.Collection.extend({
    url: config.url,

    /**
     * Send file to server.
     * @todo Should Backbone.sync be overwritten instead?
     */
    send: function (file) {
        var data = new FormData(),
            xhr = new XMLHttpRequest();

        xhr.addEventListener('load', this.onLoad);

        data.append('file', file);

        xhr.open('POST', this.url);
        xhr.send(data);
    },

    /**
     * Respond to XHR2 'onload' event.
     *
     * No need to pass in the xhr object, since addEventListener
     * automatically sets 'this' to 'xhr'.
     */
    onLoad: function () {
        var response = $.parseJSON(xhr.responseText);
        console.log(response); // Works now!
    }

}); 
于 2013-01-09T02:18:41.670 に答える