45

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

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

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

短縮されたコード:

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

2 に答える 2

109

@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ここでモデルと混同していませidんか?@Paulの答えと上記の私のコードはMessages、それぞれが独自のIDを持つ複数のコレクションがあることを前提としています。APIパス/messages/<id>が実際にメッセージのセットではなくメッセージurlを参照している場合は、コレクションでにを設定するだけで、Backboneはモデルごと/messages/に自動的に使用します。/messages/<id>

于 2011-12-11T16:51:58.893 に答える
24

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();
于 2011-12-11T14:01:36.327 に答える