我有一个包含task_list
和project
模型的Backbone on Rails应用。任务列表有一个project_id
列,引用它所属的项目。
在Rails中,我设置任务列表的路由如下:
POST /projects/:project_id/task_lists task_lists#create
PUT /task_lists/:id(.:format) task_lists#update
DELETE /task_lists/:id(.:format) task_lists#destroy
创建任务列表后,我在Backbone中所做的是实例化任务列表,在Rails中设置task_lists#create
路由的URL,然后将其保存到服务器:
taskList = new App.Models.TaskLists(data);
taskList.url = "/projects/" + current_project_id + "/task_lists";
taskList.save();
当我需要更新或删除任务列表时,我也会这样做,只是将网址设置为"task_lists/" + this.id
。
如何在Backbone中设置models/taskList.js
文件,而不必在每次需要CRUD任务列表时指定URL?我知道我必须使用自定义函数url: function () {...}
,但在将数据传递回Rails服务器时,Backbone似乎使用model.url
而不是model.url()
。
答案 0 :(得分:0)
您可以在初始化集合时传递ID,作为"选项的一部分"对象(第二个参数。
第一个参数是模型,在下面的示例中为空(如[]中所示)。
当对象" c"如果已创建,则立即调用initialize方法,您可以使用如下所示的选项执行操作:
var MyCollection = Backbone.Collection.extend({
initialize: function(models, options) {
this.current_project_id = options.current_project_id;
},
url: function() {
return "/projects/" + this.current_project_id + "/task_lists";
}
});
var c = new MyCollection([ ], { current_project_id: 2 } );
请参阅jsfiddle
答案 1 :(得分:0)
Model.url()
是一个函数http://backbonejs.org/docs/backbone.html#section-65,因此请从@redconservatory回答:
initialize: function(attrs, options){
// pass in the actual project model instead
this.project = options.project;
},
url: function () {
// keep the backbone default stuffs so specifying urlRoot will still work
var base = _.result(this, 'urlRoot') || _.result(this.collection, 'url') || urlError();
// you only need project url when the object is new so this is enough
if (this.isNew()) return project.url + base;
return base + (base.charAt(base.length - 1) === '/' ? '' : '/') + encodeURIComponent(this.id);
}