0

我有一个包含模型task_list的Backbone on Rails 应用程序。project任务列表有一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 中所做的是实例化任务列表,task_lists#create在 Rails 中设置路由的 url,然后将其保存到服务器:

taskList = new App.Models.TaskLists(data);  
taskList.url = "/projects/" + current_project_id + "/task_lists";  
taskList.save();

当我需要更新或删除任务列表时,我会在上面执行相同的操作,只是将 url 设置为"task_lists/" + this.id.

我如何models/taskList.js在 Backbone 中设置我的文件,而无需在每次需要 CRUD 任务列表时指定 URL?我知道我必须使用自定义函数,url: function () {...}但 Backbone 似乎使用model.url而不是model.url()在将数据传递回 Rails 服务器时使用。

4

2 回答 2

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);
}
于 2013-09-19T23:37:00.993 回答
0

当您将集合初始化为“选项”对象(第二个参数。

第一个参数是模型,在下面的示例中为空(如 [ ])。

当对象“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

于 2013-09-19T21:52:19.810 回答