4

バックボーンでは、著者と書籍の間の関係を (ローカルストレージに) 保存する望ましい方法は何ですか。

コレクションを属性として持つことは可能ですか、それとも配列を使用する必要がありますか...?

var book = Backbone.Model.extend({ 
    defaults:{ 
        title: ''
    }
});

var books = Backbone.Collection.extend({
    model: book
});


var author = Backbone.Model.extend({
        defaults:{ 
        firstName: '',
        lastName: '', 
        books: new books()
        }
});

var authors = Backbone.Collection.extend({
    model: author,
    localStorage: new Backbone.LocalStorage("authors")
});
4

1 に答える 1

8

Backbone でネストされたコレクションを処理する唯一の方法はありません。Backbone FAQからの引用:

クライアント側で構造化データをモデル化するための適切なパターンが多数あり、バックボーンはそれらのいずれかを実装するための基盤を提供する必要があるため、バックボーンには、ネストされたモデルとコレクション、または「多くの」関連付けの直接サポートは含まれていません。

また、FAQ は 1 つのパターンを提案し、拡張機能、プラグイン、リソースページへのリンクを提供します。このページは、ネストされたモデルとモデルの関係を処理するために使用できる多くのライブラリにリンクしています。

そうは言っても、私は時々このような問題に取り組みました:

var Author = Backbone.Model.extend({

  initialize: function(attrs, options) {
    //convert the child array into a collection, even if parse was not called
    var books = attrs ? attrs.books : [];
    if(!(books instanceof Books)) {
        this.set('books', new Books(books), {silent:true});
    }
  },

  //the books property does not need to be declared in the defaults
  //because the initialize method will create it if not passed
  defaults: {
    firstName: '',
    lastName: ''    
  },

  //override parse so server-sent JSON is automatically
  //parsed from books array to Books collection
  parse: function(attrs) {
    attrs.books = new Books(attrs.books);
    return attrs;
  },

  //override toJSON so the Books collection is automatically
  //converted to an array 
  toJSON: function() {
    var json = Backbone.Model.prototype.toJSON.call(this);
    if(json.books instanceof Books) {
      json.books = json.books.toJSON();
    }
    return json;
  }
});

コメントはうまくいけばそれがどのように機能するかを説明しますが、ポイントは、通常どおりにモデルを使用できるということです。コレクション、配列、または何もない状態で子を初期化し、サーバーから取得し、それらをサーバーに送信します。透過的に動作します。かなりの定型コードを書く必要がありますが、同じコードを繰り返していることに気付いた場合、基本クラスに抽象化するのは比較的簡単です。

編集:小さな修正、コンストラクターが欠落している場合は作成するため、オブジェクトでbooks定義する必要はありません。defaults

/コードサンプルはテストされていません

于 2013-01-14T09:25:24.717 に答える