7

我想覆盖backbone.sync 我已经问过了,但问题是我不太明白。如果我要覆盖同步功能,我需要知道将代码放在哪里。

如果我把它放在这样的模型上

model = Backbone.Model.extend({ sync:"" });

那我该怎么称呼它?如果我要使用保存方法。我还需要将创建的方法映射从 POST 更改为 PUT。暂时我求助于'create': 'PUT',实际编辑backbone.js文件(知道它不好)。在我忘记之前我还需要添加这个

sendAuthentication = function (xhr) {
          xhr.setRequestHeader('Authorization', auth)
}; 

作为 beforeSend 参数,因为我的服务器具有身份验证。我应该在哪里做呢?我应该去哪里放置代码?在我的模型中?在我的收藏中?还是在我看来?有什么帮助吗?谢谢你。

更新

我也可以覆盖我收藏的同步吗?我的意思是我可以有这样的东西吗?

collection = Backbone.Collection.extend({ sync:""});
4

1 回答 1

20

Backbone 框架背后的策略是使其易于编辑并灵活地满足各种需求。因此,如果您查看源代码,您会发现调用 Backbone.sync 的每个方法实际上都首先调用“this.sync”。

从 Backbone 手册中,您可以阅读:

通过将同步函数添加到 Backbone 集合或单个模型,可以将同步函数作为 Backbone.sync 全局覆盖,或者在更细粒度的级别上覆盖。

所以你有两个选择

选项一 - 替换全局 Backbone.sync 函数

如果您覆盖全局 Backbone.sync 您应该将代码放在全局应用程序文件中(实际上是您想要的任何位置,但必须在初始 javascript 加载时对其进行评估(执行),才能按预期工作

// Anywhere you want

Backbone.sync = function(method, collection, options) {
        console.log(method, collection options)
}

这将覆盖 Backbone.sync 并且实际上将在您的控制台上显示每次调用 collection.fetch、保存、删除等时调用的内容。

在这里你没有默认的 Methodmap,事实上你除了参数之外什么都没有:

  • 方法 - 这是一个字符串 - 'read', 'create', 'delete', 'update'
  • 集合 - 这是您调用该方法的集合实例
  • 选项 - 具有一些成功、错误功能,您可能会保留也可能不会保留。

在你的浏览器中调试这个,在阅读 Backbone 源代码的同时,它很容易理解。

选项二 - 添加到您的模型/集合同步方法

如果您希望对所有其他模型/集合使用默认 Backbone.sync 方法,则使用此方法,除了您专门定义的模型/集合:

mySocketModel = Backbone.Model.extend({ 
     sync : function(method, collection, options) {
            console.log('socket collection '+this.name+' sync called');
     }
});

Partners = new mySocketModel({ name : 'partners' });
Users = new mySocketModel({ name : 'users' });
Log = new Backbone.Collection;

因此,如果您调用 Partners.fetch() 或 Users.fetch(),它们将不再调用 Backbone.sync,但您的 Log.fetch() 方法会。

于 2012-04-10T11:47:03.830 回答