3

次のような状況があります。

var Task = Backbone.Model.extend({
    initialize: function() {
    },
    save: function() {
        $.ajax({
           type    : "POST",
           url     : "/api/savetask",
           data    : this.toJSON(),
           success : function (response) {
           this.trigger("something", "payload");
           }
         });
    }
});

これを実行すると、次のエラーが表示されます

this.trigger関数ではありません

外部アプローチでは、何かをトリガーできます..

var task = new Task();
task.trigger("something","payload");

私が間違っていることは何ですか?またはしていない:)

4

3 に答える 3

12

this匿名関数では、ajax オブジェクトを参照します。これは、関数のスコープに関して、javascript の「this」が変化するためです。初期関数の「this」を参照するには、別の変数に代入します。以下が機能します。

save: function() {
    var self = this;
    $.ajax({
        type    : "POST",
        url     : "/api/savetask",
        data    : this.toJSON(),
        success : function (response) {
            self.trigger("something", "payload");
        }
    });
}

編集: 「これ」がどのように決定されるかの説明を参照してください。

于 2012-04-05T14:07:45.630 に答える
7

個人的にsaveSuccessは、モデルにメソッドがあることを好みます。

    save: function() {
        var self = this;
        $.ajax({
            type    : "POST",
            url     : "/api/savetask",
            data    : this.toJSON(),
            success : this.saveSuccess
        });
    },
    saveSuccess: function(response) {
        this.trigger("something", "payload");
    }
于 2012-04-06T21:39:36.910 に答える
0

これは非常に遅い回答ですが、他の誰かがこのページに遭遇した場合に備えて、もっと良い方法があります. (私の経験では) self オブジェクトを使用することは、少しアンチパターンと見なされます。これは、underscore.js を使用してbind関数にアクセスできるためです。とにかく、ここにもっと良い方法があります:

var Task = Backbone.Model.extend({
    initialize: function() {
    },
    save: function() {
        $.ajax("/api/savetask", {
           type    : "POST",
           data    : this.toJSON(),
           context : this,
           success : function (response) {
               this.trigger("something", "payload");
           }
         });
    }
});

属性がcontextjQuery の最近のバージョンで追加され、以前は使用できなかった可能性があります。しかし、これは(私の意見では)それを行うための最良の方法です。

于 2015-06-18T20:21:10.530 に答える