在哪里编码以覆盖backbone.sync

jon*_*aag 7 javascript backbone.js underscore.js

我想覆盖backbone.sync我已经问过这个,但问题是我不太明白.如果我要覆盖同步功能,我需要知道放置代码的位置.

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

model = Backbone.Model.extend({ sync:"" });
Run Code Online (Sandbox Code Playgroud)

那怎么称呼呢?如果我要使用保存方法.另外我需要将create的methodMap从POST更改为PUT.我暂时使用了这个'create': 'PUT',实际编辑backbone.js文件(我知道它并不好).在我忘记之前我还需要添加这个

sendAuthentication = function (xhr) {
          xhr.setRequestHeader('Authorization', auth)
}; 
Run Code Online (Sandbox Code Playgroud)

作为beforeSend参数,因为我的服务器具有身份验证.我应该在哪里做呢?我应该去哪里放密码?在我的模特?在我的收藏?还是在我看来?有帮助吗?谢谢.

更新

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

collection = Backbone.Collection.extend({ sync:""});
Run Code Online (Sandbox Code Playgroud)

dri*_*hev 20

Backbone框架背后的策略是简化编辑,灵活满足各种需求.因此,如果您查找源代码,您会发现每个调用Backbone.sync的方法实际上都会先调用"this.sync".

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

同步功能可以作为Backbone.sync全局覆盖,或者通过向Backbone集合或单个模型添加同步功能,以更精细的级别覆盖.

所以你有两个选择

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

如果你覆盖全局Backbone.sync,你应该将你的代码放在你的全局应用程序文件中(实际上你想要的任何地方,但必须在你的初始javascript加载时评估(执行),以按预期工作

// Anywhere you want

Backbone.sync = function(method, collection, options) {
        console.log(method, collection options)
}
Run Code Online (Sandbox Code Playgroud)

这将覆盖Backbone.sync并且实际上将在您的控制台上显示每次调用collection.fetch,save,delete等时调用的内容.

在这里你没有默认的Methodmap,事实上除了参数你没有别的东西:

  • 方法 - 这是一个字符串 - '读','创建','删除','更新'
  • 集合 - 这是调用方法的集合实例
  • 选项 - 有一些成功,错误功能,您可能会或可能不会保留.

在浏览器中调试它,在阅读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;
Run Code Online (Sandbox Code Playgroud)

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

  • 或者选项3.创建自己的模型和集合,使用新的同步扩展Backbone的模型/集合,然后让所有以前制作的模型和集合从它们扩展. (5认同)