0

我的骨干模型定义如下:

models.Author = Backbone.Model.extend({
    defaults: {
        id: null,
        name: null,
        books: null     // <-- This is another backbone collection with books of the author
    }    
});

返回作者书籍集合的 URL 是: http ://example.com/books?author_id=123

所以问题是将 Author.books 的 URL 定义为上述的最佳方法是什么?现在我在Author的类构造函数中设置如下:

...
initialize: function(attributes) {
    var bc = new collections.Books();
    bc.url = '/books?author_id' + this.get('id');
    this.set({books: bc});
}
...

我想知道是否有更好或更正确的方法来做到这一点?

4

2 回答 2

4

这对我来说似乎很奇怪。我肯定会寻找像/authors/{authorId}/books这样的 url 来查找作者的 Books url。

所以我会创建一个 Books 的 Backbone.Collection 模型:

var AuthorCollection = Backbone.Collection.extend({
  model: Book,
  url : function(){
     return this.author.url()+"/books"; // this mean that the AuthorCollection must reference an Author
  }
});

将其添加到您的作者:

initialize: function() {
    this.books = new AuthorCollection();
    this.books.author = this; // setting the author to the collection
    //this.set({books: bc}); nested models are not recommended in attributes
}

现在调用 author24.books.fetch() 应该拍摄 /authors/24/books 网址。

看看Nested Models FAQ,非常有趣。

于 2012-10-03T21:10:44.013 回答
0

它有效吗?

然后它是“正确的”。

就更好的情况而言 - 这是主观的。在大多数情况下,Backbone 没有“正确”或“错误”的方式,所以如果它有效,嘿,去吧。

您可能需要注意的是,如果该作者 ID 更改,您希望更改您的 URL,因此请change:id在您的initialize

this.on('change:id', function(){
    this.set('books', this.get('books').url = '/books?author_id'+this.get('id');
}, this);

或者那种程度的东西。此外,如果您要从服务器中取回附有书籍列表的作者对象,则应定义一个自定义解析方法,该方法使书籍集合并将书籍对象附加到其中。

parse: function(resp){
    var books = new collections.Books();
    if(!_.isEmpty(resp.books)){
        _.each(resp.books, function(book){
            var b = new Book();
            b.set(b.parse(book));
            books.add(b, {silent:true});
        });
    }
    resp.books = books;
    return resp;
}
于 2012-10-03T20:37:45.860 回答