3

我想在 Backbone 的本机Model.save()方法中附加一个记录成功和错误的自定义日志记录方法。我知道在每个模型的基础上我可以调用类似的东西:

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

但是,我不想调整对各种模型的保存事件的每次调用,我想简单地监听任何模型上的保存事件。我想我想避免的一种方法实际上是修改Backbone.Model.prototype.save方法(尽管如果有人有一种优雅的方法来做到这一点,我愿意接受)。

关于如何创建这样一个事件监听器的任何想法?

4

3 回答 3

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,因此如果您使用默认同步,则此更改会处理它。

于 2013-01-25T23:44:10.237 回答
2
var GlobalModel = Backbone.Model.extend({
save: function() {

}
});

myModel = GlobalModel.extend({
//..your model
})
于 2013-01-25T21:29:29.243 回答
1

如果您只想记录 AJAX 成功/失败,那么实际上有一种更好的方法,它甚至根本不涉及 Backbone $.ajaxComplete:.

jQuery 有一个很棒的函数ajaxComplete,它接受一个函数参数,然后在每次$.ajax调用完成(失败或成功)时运行该函数。通过使用此方法(即“将事件处理程序绑定到 ajaxComplete 伪事件”),您:

A) 不必与 Backbone 内部构件混为一谈

B) 保证捕获每个 AJAX 请求(即使是那些没有 Backbone 的请求)

C) 将此日志记录代码与您的其他代码完全分开

我可能还缺少其他一些好处,但你明白了。

另一方面,如果您真的只关心save而不只是关心 AJAX 请求,那么......那么您仍然可以使用$.ajaxComplete并在其中进行一些过滤以忽略非保存。但是您也可以创建自己的模型基类(如@salexch 建议的那样),或者更糟糕的是,您可以使用 Backbone 的内部结构,例如。通过替换Backbone.Model.prototype.saveor Backbone.sync(正如@Paul Hoenecke 建议的那样),但是您正在为将来的 Backbone 升级或您可能想要使用的第 3 方 Backbone 库设置麻烦。

如果您有兴趣,这里是文档页面ajaxCompletehttp ://api.jquery.com/ajaxComplete/

哦,还有一些类似命名的$.ajaxSomething方法(例如ajaxError)仅针对失败/成功/请求启动/等。

于 2013-01-26T01:49:33.747 回答