我的后端有两个单独的页面,一个用于处理模型保存请求,另一个用于模型提取.
调用save()和fetch()以使用不同的URL的最佳方法是什么?谢谢.
编辑:
在研究了带注释的源代码后,我发现实际上可以提供一个options哈希来获取和保存
//taken from backbone source:
save : function(attrs, options) {
options || (options = {});
if (attrs && !this.set(attrs, options)) return false;
var model = this;
var success = options.success;
options.success = function(resp, status, xhr) {
if (!model.set(model.parse(resp, xhr), options)) return false;
if (success) success(model, resp, xhr);
};
options.error = wrapError(options.error, model, options);
var method = this.isNew() ? 'create' : 'update';
return (this.sync || Backbone.sync).call(this, method, this, options);
},
Run Code Online (Sandbox Code Playgroud)
在保存中,attrs服务的目的是什么?我刚刚调用myModel.save()而没有传入任何内容,而且它总是正确地散列我的模型的属性.但现在我想提供一个"保存网址",我很想打电话
myModel.save(undefined, {
url: 'myPath'
})
Run Code Online (Sandbox Code Playgroud)
使用undefined需要"跳过"第一个attrs参数.
小智 72
如果您正在阅读源代码,那么您可能已经有了可行的解决方案.你基本上有两个选择(可能更多) -
save()接受两个参数attr和options attr - 是模型属性的散列,用于在保存之前更新模型.例如.
myModel.save(attrs)
Run Code Online (Sandbox Code Playgroud)
相当于
myModel.set(attrs)
myModel.save()
Run Code Online (Sandbox Code Playgroud)
第二个参数是一个选项哈希,它传递给this.sync()(然后是Backbone.sync,然后是$ .ajax) - 设置此哈希中的url将按预期工作.您可以传递false,undefined或{}作为跳过更新的第一个参数.
每次调用save()或fetch()编写自己的同步函数来为你计算url时,不要让url分散在你的代码中,而是委托原始的Backbone.sync来完成繁重的工作.
例如.(此同步功能在CREATE,UPDATE和DELETE操作上添加/保存到url)
function mySyncFunction(method, model, options){
if(method=='GET'){
options.url = model.url;
}else{
options.url = model.url + '/save';
}
return Backbone.sync(method, model, options);
}
Run Code Online (Sandbox Code Playgroud)
要使用自定义同步方法,只需将其声明为模型的一部分即可
var myModel = Backbone.Model.extend({
...
"sync": mySyncFunction,
...
});
Run Code Online (Sandbox Code Playgroud)
Ted*_*eid 24
Gingerhendrix的答案涵盖了基础,但我认为值得详细说明传递save/ delete/ 的选项值的方法fetch.
您可以在模型上覆盖方法,而不是Backbone.Model像以下那样委托回原始方法,而不是在每个地方使用网址乱丢您的代码.
var MyModel = Backbone.Model.extend({
save: function(attributes, options) {
options = _.defaults((options || {}), {url: "http://your.save.url.com/"});
return Backbone.Model.prototype.save.call(this, attributes, options);
},
// same thing for fetch and delete to give them different urls...
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以在代码中调用该方法,而无需担心记住url在选项中设置.
我想澄清@gingerhendrix的答案:你可以将url传递给save中的选项,它将直接转到xhr请求(从文档或源代码或答案中不明显,所以我发布ot作为单独的答案):
model.save({}, {url: '/custom-url'});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
45851 次 |
| 最近记录: |