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 を上記のように定義する最良の方法は何ですか? 今、次のように作成者のクラス コンストラクターで設定します。

...
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 を確実に探して、著者の本の 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
  }
});

それを 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 の URL が表示されます。

Nested Models FAQをご覧ください。非常に興味深い内容です。

于 2012-10-03T21:10:44.013 に答える
0

それは機能しますか?

それなら「そうですね」。

良い限り - それは主観的です。ほとんどの場合、Backbone には「正しい」方法も「間違った」方法もありません。

注意したいのは、作成者 ID が変更された場合、URL を変更する必要があることですchange:idinitialize

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 に答える