使用唯一模型URL获取Backbone Collection的子集(内部代码和实例)

时间:2013-06-30 23:46:05

标签: backbone.js marionette

我正在寻找使用模型的URL获取骨干集合的子集。 与在以下位置找到的“嵌套集合”教程类似:

http://liquidmedia.org/blog/2011/01/backbone-js-part-1/

由于这需要数据api,模型,集合,视图,我已经包含了我想要创建的完整代码:

代码(在节点/ Mongoose / Express / Rest中)https://github.com/1manStartup/Backbone-URLRoot

直播示例(在我的ec2上): http://54.251.104.185/ 我相信我的问题在于渲染视图和获取模型数据。

我想做什么:渲染所有狗独有的文章。路线是: / API / makearticle /:ID

如果你不使用NodeJ,我的JSON Api看起来像这样:

{
    "articlename": "feed chocolate",
    "_dog": {
      "name": "pitbull",
      "_id": "51d0b9ad6fd59c5059000002"
    },
    "_id": "51d0c22a6fd59c5059000007",
    "__v": 0
  },
  {
    "articlename": "took to vet",
    "_dog": {
      "name": "chihuaha",
      "_id": "51d0b9af6fd59c5059000003"
    },
    "_id": "51d0c22e6fd59c5059000008",
    "__v": 0
  },

以下是我的模特和收藏品: 其余骨干代码见于: https://github.com/1manStartup/Backbone-URLRoot

https://github.com/1manStartup/Backbone-URLRoot/blob/master/public/javascripts/demo-routerurl.js

Dog = Backbone.Model.extend({
  idAttribute: '_id',
  urlRoot:'/api/makedog' ,
      initialize:function () {
        this.dogs = new Dogs();
        this.dogs.url = this.urlRoot + "/" + this.id ;
    }   
});

Dogs = Backbone.Collection.extend({
    model: Dog,
    url: '/api/makedog' 
});

Article = Backbone.Model.extend({
  idAttribute: '_id',
  urlRoot:'/api/makearticle' ,
      initialize:function () {
        this.merr = new Articles;
        this.merr.url = this.urlRoot + "/" + this.id ;
    } 
});

请帮助我好几天了。感谢。

1 个答案:

答案 0 :(得分:1)

你的API似乎并不是RESTful,所以你可能会给自己造成比必要更多麻烦:Backbone默认需要一个RESTful API。

无论如何,你需要做一些像

这样的事情
var Article = Backbone.Model.extend({
  idAttribute: '_id'
});

var ArticleCollection = Backbone.Collection.extend({
  model: Article
});

var Dog = Backbone.Model.extend({
  idAttribute: '_id',
  initialize:function () {
    this.articles = new ArticleCollection({
      url: "api/dogs/" + this.get('id');
    });
  }   
});

然后,你可以做(​​例如):

var doggy = new Dog({id: 51d0b9ad6fd59c5059000002});
doggy.articles.fetch();
var articlesForDoggy = doggy.articles;

作为一个侧面节点,为什么每次实例化一个新的狗模型实例时都会创建一个新的狗集合?

另外需要注意的是:我会认真对待您的API设计。如果您使用不同的路径来创建模型(这似乎是由'make ...'路由表示),那么您将不得不编写一大堆代码来使Backbone持久层与您的API。

此外,此API并不真正遵循约定:api/dogs/XXX不应返回文章列表:它应返回标识为XXX的dog实例。使用像api/dogs/XXX/articles这样的网址对于与狗相关的文章列表会更有意义。

友情提示:虽然上面的代码可以帮助您解决问题,但您真的应该重新考虑如何设计API。使用带有Backbone的非RESTful API,结合非标准命名约定,基本上可以保证您将进入项目的痛苦世界。