0

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

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

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

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

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

我正在尝试做的事情:呈现狗独有的所有文章。路线是:/api/makearticle/:id

如果您不使用 NodeJs,我的 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 ;
    } 
});

请帮助我这几天。谢谢。

4

1 回答 1

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不应该返回文章列表:它应该返回带有 id 的 dog 实例XXX。对于与狗相关的文章列表,使用类似的 URLapi/dogs/XXX/articles会更有意义。

友好的建议:虽然上面的代码应该能让你上路,但你真的应该重新考虑如何设计你的 API。将非 RESTful API 与 Backbone 结合使用,再加上非标准的命名约定,基本上可以保证您的项目将进入一个痛苦的世界。

于 2013-07-01T19:02:14.733 回答