9

私は Backbone.js コレクションを持っていて、それを設定したいモデル ID の配列を持っています。これらのオブジェクトを 1 つずつ取得し、オブジェクトの配列を作成して、コレクションのコンストラクターに配列として渡すことができることはわかっています。

私ができるようにしたいのは、オブジェクト ID の配列を初期データとしてコンストラクターに渡し、コレクションを取得して、おそらくバッチとして、thisに従ってそれらを取得することです。

実行可能ですか?

4

3 に答える 3

10

Backbone.Collectionで'fetch'を呼び出すと、Backbone.syncが呼び出されます。これは、デフォルトでは、使用するURLをコレクションに要求するだけです。

したがって、サーバーが次のように応答する場合:

/models/batch/?ids=1,2,3,4

あなたは次のようなことをすることができます:

var MyCollection = Backbone.Collection.extend({

    model: Model,

    url: '/models',

    initialize: function(models, options) {
        ids = options.ids || [];
        if (ids.length > 0) { 
            this.fetchByIds(ids);
        }
    },

    fetchByIds: function(ids) {
        // Save a reference to the existing url
        var baseUrl = this.url;

        // Assign our batch url to the 'url' property and call the server
        this.url += '/?ids=' + ids.join(',');
        this.fetch();

        // Restore the 'url' property
        this.url = baseUrl;
    }
});

そしてそれを次のように使用します:

var coll = new MyCollection({}, {ids: [1, 2, 3, 4]});

Backbone.Collectionコンストラクター関数は、「initialize」関数を呼び出す前に最初のパラメーターで渡されたモデルを設定するため、optionsパラメーターでIDを渡す必要があります。

理論的には、これは機能するはずです(読んでください:完全に未試行)。

于 2011-08-03T19:54:59.470 に答える
7

最初のページの読み込みでは、フェッチを使用しないでください。http: //documentcloud.github.com/backbone/#FAQ-bootstrapresetで説明されているようにブートストラップする必要があります。

リンクから:

ブートストラップモデルのロード

アプリを最初に読み込むときは、ページをレンダリングするために、必要になることがわかっている初期モデルのセットを用意するのが一般的です。それらをフェッチするために追加のAJAXリクエストを起動する代わりに、より良いパターンは、それらのデータをすでにページにブートストラップすることです。次に、resetを使用して、コレクションに初期データを入力できます。DocumentCloudでは、ワークスペースのERBテンプレートで、次のように実行します。

<script>
  Accounts.reset(<%= @accounts.to_json %>);
  Projects.reset(<%= @projects.to_json(:collaborators => true) %>);
</script>
于 2012-03-01T14:57:47.163 に答える
3

実際に url を関数に設定することもできます。fetchByIds の代わりに fetch をオーバーライドするだけです。また、baseUrl はコレクションではなくモデル専用だと思います。rulfzid の考えは正しいと思いますが、私なら次のようにすると思います。

var MyCollection = Backbone.Collection.extend({
  model: Model,

  initialize: function(models, opts) {
    if (options.ids) {
      this.fetch(options.ids);
    }  
  },

  url: function() {
    var url = '';
    if (this.fetch_ids) {
      // pass ids as you would a multi-select so the server will parse them into
      // a list for you.  if it's rails you'd do: id[]=
      url = '/models?id=' + ids.join('&id=');
      // clear out send_ids
      this.fetch_ids = undefined;
    } else {
      url = '/models';
    }
    return url;
  },

  fetch: function(args) {
    if (args.ids) {
      this.fetch_ids = args.ids;
    }
    return Backbone.Model.prototype.fetch.call(this, args);
  }
});

機能が適切な「場所」に保持され、再利用性が向上すると思います (つまり、いつでも fetch(list_of_ids) を実行できます...新しいオブジェクトは必要ありません)。

于 2011-08-04T21:37:14.513 に答える