骨干,休息,填充集合

时间:2014-01-28 08:30:48

标签: asp.net-mvc-3 rest backbone.js

我正在尝试使用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?)

(抱歉这个新手问题)

提前致谢

2 个答案:

答案 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属性,情况也是如此。见下文。

另外,JSFiddle example here

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)