我正在尝试使用backbone / mvc3做我的第一个webapp,我想有一些建议来填充一个集合。
这是我收藏的一部分
window.TaskList = Backbone.Collection.extend({
model: Task,
url: "../../api/Tasks";
},.......
我可以使用crud方法来获取/更新模型,但我遇到了以下问题:
当我打开页面时,我的集合被填充(调用get方法服务器端)但我希望有这种行为:
第1页:put / delete / get methods =>像往常一样但是必须填充集合,调用getTasksByWorkshopId服务器端方法
第2页:put / delete / get methods =>像往常一样但是必须填充集合,调用另一个服务器端方法来过滤列表 ...
(即:由于数据量的原因,我无法过滤收集客户端)
所以,我的问题是:如何保留通用集合URL(作为api / Tasks)并使用其他方法填充集合(我是否必须覆盖smth?)
(抱歉这个新手问题)
提前致谢
答案 0 :(得分:0)
你可以这样做:
window.TaskList = Backbone.Collection.extend({
model: Task,
urlRoot: "../../api/Tasks",
url: function() {
if (/*page 1*/) { // you can access this.options where you can pass parameters to distinct the 2 services, when calling the fetch function
return this.urlRoot + // getTasksByWorkshopId URL ;
} else {
return this.urlRoot + // the other service URL ;
}
} ...
}
答案 1 :(得分:0)
在对另一个答案的评论中,你说“当加载集合时,调用的url是/ api / Tasks / Workshop / 1(好的)但是,当我想更新任务时,调用的url是/ api / Tasks / Workshop / 1/141而不是/ api / Tasks / 141。“
为了“更新任务”(我假设一个任务模型)到另一个URL,那么你的Collection&模型应该有不同的URL。如果在未指定model
属性的情况下定义集合,则保存/获取/删除模型时使用的URL将基于集合的URL。如果集合的模型没有定义的url属性,情况也是如此。见下文。
var WorkshopModel = Backbone.Model.extend({
urlRoot: "api/tasks/"
});
var WorkshopCollection = Backbone.Collection.extend({
model: WorkshopModel,
urlRoot: "api/tasks/workshop",
url: function() { return this.urlRoot + '/' + this.id; },
initialize: function(models, options) {
this.id = options.id;
}
});
var c = new WorkshopCollection(null, { id: 1 });
c.fetch(); // GET => api/tasks/workshop/1
var m = c.add({ id: 300, color: 'red' });
m.save(); // PUT => api/tasks/300
m.destroy(); // DELETE => api/tasks/300
m.fetch(); // GET => api/tasks/300
如果从WorkshopModel中删除urlRoot
属性,则模型使用的URL将为collection.url() + '/' + model.id
(api / tasks / workshop / 1/300)