1

だから私はいくつかの種類のデータを持っています:

Post Project Event

そして、これらのデータ モデルにはそれぞれ独自のコレクションと、それらを表示するためのルートがあります。

/posts    => app.postsCollection
/projects => app.projectsCollection
/events   => app.eventsCollection

次に、別のルートを追加します。

/ => app.everythingCollection

他の 3 つのコレクションの集計を表示するコレクションを作成するにはどうすればよいですか?ただし、すべてのポスト プロジェクトおよびイベント データを再度取得する必要はありません。

同様に、 を呼び出すと、everythingCollection.fetch()が満たされpostsCollection、独立projectsCollectioneventsCollectionてレンダリングされたときにデータが利用できるようになります。

ポイントは、同じデータを 2 回ダウンロードしないことです。

4

4 に答える 4

1

本当にバックボーン コレクションである必要はありませapp.everythingCollectionん。必要なのは、他のコレクションにアクセスして取得することだけです。

を継承しBackbone.Eventsて、すべてのイベント機能を取得することもできます。

var fetchedRecords = {posts: 0, projects: 0, events: 0};
var Everything = function () {}
_.extend(Everything.prototype, Backbone.Events, {
    fetch: function (option) {
      that = this;
      this.count = 0;
      option.success = function () {that.doneFetch(arguments)};
      if (fetchRecords.posts == 0) {
        option.fetchedName = "posts";
        app.postsCollection.fetch(option);
        this.count ++;
      }
      if (fetchRecords.projects == 0) {
        option.fetchedName = "projects";
        app.projectsCollection.fetch(option);
        this.count ++;
      }
      if (fetchRecords.events == 0) {
        option.fetchedName = "events";
        app.eventsCollection.fetch(option);
        this.count ++;
      }
    },
    donefetch: function (collection, response, options) {
      if (this.count <=0) return;
      this.count --;
      if (this.count == 0) {
        if (options.reset) this.trigger("reset");
      }
      fetchedRecords[options.fetchedName] ++;
    },
    posts: function () {return app.postsCollection},
    projects: function () {return app.projectsCollection},
    events: function () {return app.eventsCollection}
});

app.everythingCollection = new Everything;
everythingView.listenOn app.everythingCollection, "reset", everythingView.render;
app.everythingCollection.fetch({reset: true});

fetchedRecrodsフェッチが複数回行われないようにするには、countをインクリメントする必要があります。このようなもの。コードはテストされていません。でも考え方は同じです。

于 2013-11-11T07:18:12.457 に答える
0

アプリの起動時に必要なすべてのコレクションを配列またはオブジェクトに格納し、最初のリセット イベントをリッスンするイベント リスナーを各コレクションにアタッチし、フェッチしたコレクションを 2 番目の配列に記憶します。すべてのコレクションが必要なルートが使用されている場合は、既にフェッチされたコレクションの配列に見つからないものをフェッチできます。

(テストされていませんが、私がどのようにそれを行うべきかについてのアイデアを提供します)

var allCollections = [app.postsCollection, app.projectsCollection, app.eventsCollection];
var fetchedCollections = [];

$.each(allCollection, function(i, coll){
  coll.once("reset", function(){
    fetchedCollections.push(coll);
  })
});

var fetchAll = function(){
    $.each(allCollections, function(i, coll){
       if( $.inArray(coll, fetchedCollections ) == -1 ){
         coll.fetch();
       }
    });
}

everythingCollection でこれを行うと、必要な everythingCollection.fetchAll() 機能が得られます。また、最初に他のすべてのコレクションを取得するために、 everythingCollection の fetch 関数をオーバーライドすることもできます。

fetch(options){
  this.fetchAll();
  return Backbone.Collection.prototype.fetch.call(this, options);
}
于 2013-11-09T08:43:14.930 に答える
0

Braddunbar のスーパーモデルまたはbenvinegar の backbone.uniquemodelが問題に対処する可能性があるようです

次に、Soundcloud の構築に関する Soundcloud の記事(「ビュー間でモデルを共有する」を参照)もチェックする価値があります。この問題を解決するには、上記の 2 つのプラグインと同様のアプローチがあります。

于 2013-11-15T14:28:45.967 に答える