2

バックボーンを使用してアプリケーションを作成しようとしていますが、かなり慣れていません。私のアプリケーションは基本的に、ユーザーにすべての写真とアルバムを表示しています。そのデザインについていくつか質問があります。

写真から始めるのは、モデルの明らかな候補です。それで

var Photo = Backbone.Model.extend({})

それから私は写真のコレクションを作成しました。

var PhotoCollection = Backbone.Collection.extend({})

これは、ユーザーに「すべての写真」、「特定の日付にアップロードされた写真」などを表示するためのものです (アルバムとは異なることに注意してください)。

アルバムについて質問ですが、アルバムはモデルですか、それともコレクションですか?

アルバム ビューと同様に、ユーザーのすべてのアルバムをグリッド レイアウトで表示し、写真の数、アルバム名、その他のプロパティを表示します。したがって、アルバムをバックボーン モデルとして、アルバムのコレクションをバックボーン コレクションとして持つことは理にかなっています。

しかし、ユーザーがアルバムをクリックすると、そのアルバム内のすべての写真をリクエストする必要があります。だから、アルバムはコレクションになります。しかし、アルバムをコレクションとして書く場合、アルバムのセットをどのように表現すればよいでしょうか? コレクションのコレクションでしょうか?

紛らわしく聞こえないことを願っています。

4

1 に答える 1

5

経験則として、 はBackbone.Collection1 つの REST コレクション リソースにマップし、Modelはそのコレクション内の 1 つのアイテムにマップする必要があります。厳密に必要というわけではありませんが、Backbone の大部分はこの考え方に基づいて構築されています。次に例を示します。

/photos    -> PhotoCollection
/photos/id -> Photo
/albums    -> AlbumCollection
/albums/id -> Album

このような明確な RESTful 構造がある場合は、それを反映するモデル構造を構築することをお勧めします。

異なるモデル間の関係を構築し始めると、Backbone はそれほど独断的ではなく、自由に設定できます。多くの場合、異なるモデル間の関係を と の関係で考えるのが最も簡単isですhas。あなたの場合、それは少しトリッキーAlbum is a collection of photosですAlbum has photos

主におそらく写真のコレクション以上のものであるため、私はhasここで関係に傾倒します-それはタイトルやその他の独自のプロパティを持ちます. AlbumRESTful 用語では、コレクションは独自のプロパティを持つことはできません。だから私たちはそう言いAlbum has a PhotoCollectionます。

Photoこれらがあなたのand であるとしましょうPhotoCollection:

var Photo = Backbone.Model.extend({});

var PhotoCollection = Backbone.Collection.extend({
  model: Photo,
  filterByDate: function(date) {
    //just some method
    return this.filter(function(photo) { return photo.get('date') === date; });
  }
});

同様にAlbumand AlbumCollection.

var Album = Backbone.Model.extend({
  initialize: function(attributes) {
    //make model.photos a PhotoCollection and initialize it with passed photos
    this.set('photos', new PhotoCollection(attributes.photos || []);
  }
});

var AlbumCollection = Backbone.Collection.extend({
  model: Album
});

次に、他の写真のコレクションと同じように、アルバムの写真にアクセスできます。

album.get('photos').filterByDate('2012-12-24');

アルバムPhotoCollectionが通常の とは異なる動作をする必要がある場合PhotoCollectionは、単純に基本コレクションから拡張して代わりに使用できます。

var AlbumPhotoCollection = PhotoCollection.extend({ ... });

アプリケーションがどのように見えるかを詳しく知らずにこれ以上推測することは困難ですが、いずれにせよ、これは自然な方法のように感じられます。

于 2013-01-07T20:32:45.357 に答える