我想覆盖backbone.sync我已经问过这个但问题是我不太明白。如果我要覆盖同步功能,我需要知道放置代码的位置。
如果我把它放在像这样的模型上
model = Backbone.Model.extend({ sync:"" });
那怎么称呼呢?如果我要使用保存方法。另外我需要将create的methodMap从POST更改为PUT。暂时我使用这个'create': 'PUT',
实际编辑了backbone.js文件(我知道它不好)。在我忘记之前我还需要添加这个
sendAuthentication = function (xhr) {
xhr.setRequestHeader('Authorization', auth)
};
作为beforeSend参数,因为我的服务器具有身份验证。我应该在哪里做呢?我应该去哪里放密码?在我的模特?在我的收藏?还是在我看来?有帮助吗?谢谢你。
我还可以覆盖我的收藏中的同步吗?我的意思是我可以拥有这样的东西吗?
collection = Backbone.Collection.extend({ sync:""});
答案 0 :(得分:20)
Backbone框架背后的策略是简化编辑,灵活满足各种需求。因此,如果您查找源代码,您会发现每个调用Backbone.sync的方法实际上都会先调用“this.sync”。
从Backbone手册中,您可以阅读:
同步功能可以作为Backbone.sync全局覆盖,或者在a 通过向Backbone添加同步功能来实现更细粒度的级别 收集或个人模型。
所以你有两个选择
如果覆盖全局Backbone.sync,您应该将代码放在全局应用程序文件中(实际上您想要的任何地方,但必须在初始javascript加载时评估(执行),以便按预期工作
// Anywhere you want
Backbone.sync = function(method, collection, options) {
console.log(method, collection options)
}
这将覆盖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;
因此,如果您调用Partners.fetch()或Users.fetch(),它们将不再调用Backbone.sync,但是您将使用Log.fetch()方法。