TL:DR; 1) fetch() reset() の代わりに初期データをブートストラップします。2)必要に応じて、ビューの初期化でフェッチを実行できます。または、最初にデータをロードすることもできます。init でフェッチすると、非同期の性質により、レンダリング時にデータの準備ができていないことに注意してください。その同期/追加/などを待っているリスナーがいる場合は問題ありません。3) itemIndex オブジェクトの意味がわかりませんが、必要に応じてオブジェクトを作成し、それらにコレクションを追加できます。または、すべてのリストが最終的にコレクションを持つことがわかっている場合は、最初に焼き込むことができます。必要に応じてリセットできます (オプション {add:true} を指定しない限り、fetch は自動的にこれを行います)。人々が完全な fetch() で物事を行う一般的な方法。
見た目はかなりいいと思います。Backbone の良いところは、さまざまな方法で実行できることです。たとえば、番号 2 は、ビューから 2 番目の fetch() を接続することを示しています。遅延ロードが必要な場合は、それを行うことができます。または、何かが完了する前に、アプリの開始時にすべてのデータを取得することもできます。それは本当にあなた次第です。これは私がそれを行うかもしれない方法です。
これは、このようなアプリを作成する方法です(私の好みです。それがより良いか悪いか、またはあなたが説明したものと同じかどうかはわかりません。)
まず、ListModel というモデルを作成します。ID と名前の属性があります。このようにして、個別に取得できる独自の ID を持つ多数の個別のリストを作成できます。
各 ListModel には、その中に ItemsCollection があります。このコレクションには、その一部である ListModel に基づく URL があります。したがって、ListModel-1 のコレクション URL は /list/1 のようになります。
最後に、リソース ID とテキストである ItemModel があります。
ListCollection
ListModel // Monday Chores
ItemCollection
ItemModel // Mail
ItemModel // Laundry
ItemModel // Drycleaning
ListModel // Grocery
ItemCollection
ItemModel // Celery
ItemModel // Beef
したがって、この小さな表示では、まだビューに関係するものを何も入れていないことに気付くでしょう。それがより概念的なものかどうかはわかりませんが、これはデータ階層がどのように見えるかであり、ビューはそれから完全に独立している必要があります。上記のビューをどのように含めているのか正確にはわかりませんでしたが、これでより明確になると思いました。
これらの構造の定義に関して、私は 2 つのことを考えています。
まず、ListModel がコレクションで定義されていることを確認します。そうすれば、コレクション add(hash) を使用して、新しいモデルを作成/追加するときにインスタンス化できます。
次に、ListModel が作成されると、ItemCollection がその ListModel オブジェクトのプロパティとして (属性としてではなく) 自動的に作成されるように、ListModel を定義します。
理想的には、ListModels は次のようになります。
ListModel.ItemCollection
アプリが初期化される前に、fetch() ではなくデータをブートストラップします。(この種の対処ポイント 1) 理想的には、バックボーン アプリケーションの開始時に、最初から必要なすべてのデータが含まれている必要があります。次のようなデータを head に渡します。
var lists = [listModel-1-hash, listModel-2-hash];
アプリが起動すると、すぐにこれら 2 つのリストを作成できます。
var myLists = new ListCollection();
_.each(lists, function(hash) {
myLists.add(hash); // Assumes you have defined your model in the ListCollection
}
これで、リスト コレクションに必要なすべてのリスト モデルが含まれました。
ここでビューの出番です。どのビューにも何でも渡すことができます。しかし、ビューを 3 つに分類することができます。
AppView、ListModelView、ItemModelView、それだけです。
次のような構造を想像してください。
<body> // AppView
<ul class="List"> // ListModelView
<li class="Item"></li> // ItemModelView
</ul>
<ul class="List"> // ListModelView
</ul>
</body>
アプリを起動して AppView を作成すると、AppView 内で各 ListModelView が生成され、本体に追加されます。私たちのリストは空です。おそらく、クリックするとアイテムが遅延ロードされます。これがあなたがそれを接続する方法です。
// In ListModelView
events: {'click':'fetchItems'}
fetchItems: function() {
this.model.itemCollection.fetch(); // Assumes you passed in the ListModel into view
}
最初にデータをブートストラップしたので、この fetch() 呼び出しが「2 回目の」フェッチになります。(私はあなたが作ったポイント2に取り組んでいます。)初期化でそれを取得できます。これは非同期関数であるため、レンダリング時に必要な場合は機能しないことに注意してください。しかし、できることは、itemCollections への追加イベントをリッスンしているこのビューにイベント リスナーを追加することです。
this.model.itemCollection.on('add', this.addItemView, this);
addItemView()
itemViews の新しいインスタンスを生成し、それらを追加します。
ポイント 3 については、必要な時点でコレクションをインスタンス化し、それを ListModel にスローできます。または、私が行ったことを実行して、すべてのモデルに常に ItemCollection があることを確認することもできます。これは、好みや目標によって異なります。あなたはおそらくこれすべてを必要としませんでしたが、何らかの理由でそれを説明したいと思いました. わからない、多分それは役立つ。