骨干模型如何从Ajax结果中触发事件?

时间:2012-04-05 14:02:38

标签: javascript backbone.js underscore.js

我有以下情况:

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");

我做错了什么?或不做:)

3 个答案:

答案 0 :(得分:12)

匿名函数中的

this引用了ajax对象。这是因为"这个"在javascript中关于函数范围的更改。为了参考"这个"初始函数,将其分配给不同的变量。以下内容适用:

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

编辑:请参阅an explanation如何"此"确定了。

答案 1 :(得分: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");
    }

答案 2 :(得分: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");
           }
         });
    }
});

可能是在最近版本的jQuery中添加了context属性,之前它不可用。但这是(在我看来)最好的方法。