backbone.js使用不同的URL进行模型保存和获取

我的后端有两个单独的页面,一个用于处理模型保存请求,另一个用于模型提取。

调用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); }, 

在保存中, attrs服务的目的是什么? 我只是调用myModel.save()而不传递任何东西,它总是正确地散列我的模型的属性。 但现在,我想提供一个“保存url”,我很想打电话

 myModel.save(undefined, { url: 'myPath' }) 

与未定义的要求“跳过”第一attrs参数。

如果你正在阅读源代码,你可能已经有了一个可行的解决scheme。 你基本上有两个select(可能更多) –

  1. 在save()/ fetch()中传递URL

save()接受两个参数attr和options attr – 是模型属性的散列,用于在保存之前更新模型。 例如。

 myModel.save(attrs) 

相当于

 myModel.set(attrs) myModel.save() 

第二个参数是一个选项哈希,它传递给this.sync()(然后Backbone.sync,然后$ .ajax) – 在这个哈希设置URL将按预期工作。 您可以传递false,undefined或{}作为跳过更新的第一个参数。

  1. 覆盖Backbone.sync

每次调用save()或fetch()编写自己的同步函数来为您计算url时,代替原来的Backbone.sync来完成繁重的工作

例如。 (此同步function添加/保存到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); } 

要使用自定义同步方法,只需将其声明为模型的一部分即可

 var myModel = Backbone.Model.extend({ ... "sync": mySyncFunction, ... }); 

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... } 

然后,你可以调用你的代码中的方法,而不必担心记得在选项中设置url

我想清除@gingerhendrix的答案:你可以传递URL到保存选项,它会直接到xhr请求(这是不明显的从文档或源代码或从答案,所以我张贴ot作为单独的答案):

 model.save({}, {url: '/custom-url'}); 

如果你有一个模型和一个集合,如:

 MyModel = Backbone.Model.extend({ url: function(){ "API/" return "API/MyModel/" +this.get("id"); } }); MyCollection = Backbone.Collection.extend({ model: MyModel , url: "API/MyModels" }); 

取得集合只是打电话

 MyCollection.fetch({ success: function(){ //do something here }, error: function(){ //Handle your error } }); 

为了保存你的模型,假设你有模型的id,并且你已经实例化你的集合(称之为myCollection)。

 var model = myCollection .get(id); model.save( model.attributes, { success: function (model, response) { //do something on success }, error: function (model, response) { //handle the error } } );