web-dev-qa-db-ja.com

Backbone.jsコレクションオプション

Backbone.jsを使用してモデル/ビュー/コレクションを作成しました。私のコレクションはfetchメソッドを使用して、リモートサーバーからモデルをロードします。このコレクションに必要なURLには、messages/{id}のようなIDが必要です。しかし、オプションをコレクションに渡す明確な方法は見つかりませんでした。

Backbone.jsビューは、構築時にview([options])を渡すことでオプションを受け入れますが、コレクションは構築時にモデルのリストを必要とします:collection([models])。

このコレクションにパラメーター/オプションを渡す「最もクリーンな」方法は何ですか?

短縮コード:

var Messages = Backbone.Collection.extend({
 model: Message,
   url: 'http://url/messages/' + id
});
44
Jens

@Paulの答えは良いですが、url属性が関数になり得ることも注目に値します。私の意見では(そして最終結果は同じなので、単なる意見です)、initializeにidを設定し、それを関数で参照すると、コードは少し冗長になり、読みやすくなります:

var Messages = Backbone.Collection.extend({
  initialize: function(models, options) {
    this.id = options.id;
  },
  url: function() {
    return '/messages/' + this.id;
  },
  model: Message,
});

var collection = new Messages([], { id: 2 });
collection.fetch();

念のため、ここでidとModel idを混同していないのですか? @Paulの答えと上記の私のコードでは、それぞれが独自のIDを持つ複数のMessagesコレクションがあると仮定しています。 APIパス/messages/<id>が実際にメッセージのセットではなくmessageを参照している場合は、コレクションのurl/messages/に設定するだけで済みます。 、およびBackboneは各モデルに対して/messages/<id>を自動的に使用します。

108
nrabinowitz

Urlプロパティを宣言する方法では、ブラウザが最初にjavascriptファイルをロードするときに値が一度決定され、「id」は未定義になります。

Backbone.Collectionは、コンストラクターの2番目の引数としてオプションを受け入れるため、id値をオプションとして渡し、コレクションの初期化関数内でurl値を設定できます。

ここに例があります

var Messages = Backbone.Collection.extend({
  initialize: function(models, options) {
    this.url = 'http://url/messages/' + options.id;
  },
  model: Message,
});

var collection = new Messages([], { id: 2 });
collection.fetch();
23
Paul