我有以下情况:
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");
我做错了什么?或不做:)
答案 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
属性,之前它不可用。但这是(在我看来)最好的方法。