我想使用自定义日志记录方法追加Backbone的本地Model.save()
方法,该方法记录成功和错误。我知道在每个型号的基础上我可以称之为:
myModel.save().success(function() {
// do something cool
});
但是我不想调整对各种模型的保存事件的每次调用,而是只想在任何模型上监听保存事件。我认为我想避免的一种方法实际上是修改Backbone.Model.prototype.save
方法(尽管如果某人有一种优雅的方式来做到这一点,我会对它开放)。
有关如何创建此类事件侦听器的任何想法?
答案 0 :(得分:6)
如果您的所有模型/集合都使用默认的Backbone.sync方法,您可以创建一个新的同步方法来进行日志记录。
var originalSync = Backbone.sync;
var loggingSync = function(method, model, options) {
// call original Backbone.sync
var promise = originalSync(method, model, options);
promise.done(function() {
// if method is 'update' or 'create', log success
});
promise.fail(function() {
// if method is 'update' or 'create', log failure
});
return promise;
};
Backbone.sync = loggingSync;
默认情况下,Model.sync和Collection.sync都代理到Backbone.sync,因此如果您使用默认同步,则此更改将处理它。
答案 1 :(得分:2)
var GlobalModel = Backbone.Model.extend({
save: function() {
}
});
myModel = GlobalModel.extend({
//..your model
})
答案 2 :(得分:1)
如果您只想记录AJAX成功/失败,实际上有一种更好的方法,甚至根本不涉及Backbone:$.ajaxComplete
。
jQuery有一个名为ajaxComplete
的奇妙函数,它接受一个函数参数,然后每次$.ajax
调用完成(失败或成功)时运行该函数。通过使用此方法(即“将事件处理程序绑定到ajaxComplete伪事件”),您:
A)不必使用Backbone internals
B)保证能够捕获每个AJAX请求(即使是没有Backbone的那些)
C)将此日志记录代码与代码的其余部分完全分开
我可能还缺少其他一些优势,但你明白了。
另一方面,如果你真的只关心save
而不仅仅关心AJAX请求,那么......你仍然可以使用$.ajaxComplete
并在其中做一些过滤以忽略非-saves。但你也可以制作你自己的Model基类(如@salexch建议的那样),或者更糟糕的是你可以使用Backbone的内部组件,例如。通过替换Backbone.Model.prototype.save
或Backbone.sync
(如@Paul Hoenecke所建议的那样),但是您可能会为将来的Backbone升级或您可能想要使用的第三方Backbone库而遇到麻烦。
如果您有兴趣,请点击此处ajaxComplete
的文档页面:
http://api.jquery.com/ajaxComplete/
哦,并且还有一些类似命名的$.ajaxSomething
方法(例如。ajaxError
)仅用于定位失败/成功/请求开始/等。