在全球范围内收听Backbone.js Model.save

时间:2013-01-25 21:14:16

标签: javascript events backbone.js

我想使用自定义日志记录方法追加Backbone的本地Model.save()方法,该方法记录成功和错误。我知道在每个型号的基础上我可以称之为:

myModel.save().success(function() {
    // do something cool
});

但是我不想调整对各种模型的保存事件的每次调用,而是只想在任何模型上监听保存事件。我认为我想避免的一种方法实际上是修改Backbone.Model.prototype.save方法(尽管如果某人有一种优雅的方式来做到这一点,我会对它开放)。

有关如何创建此类事件侦听器的任何想法?

3 个答案:

答案 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.saveBackbone.sync(如@Paul Hoenecke所建议的那样),但是您可能会为将来的Backbone升级或您可能想要使用的第三方Backbone库而遇到麻烦。

如果您有兴趣,请点击此处ajaxComplete的文档页面: http://api.jquery.com/ajaxComplete/

哦,并且还有一些类似命名的$.ajaxSomething方法(例如。ajaxError)仅用于定位失败/成功/请求开始/等。