2011-08-03 6 views
9

私はBackbone.jsコレクションを持っており、モデルIDの配列を設定しています。私は、これらのオブジェクトを1つずつフェッチし、オブジェクトの配列を作成し、コレクションのコンストラクタに配列として渡すことができることを知っています。オブジェクトではなくオブジェクトIDでバックボーンコレクションを初期化することはできますか?

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

Doable?

答えて

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コンストラクタ関数は、前に最初のパラメータで渡されたモデルを設定するため、optionsパラメータのidそれは '初期化'機能を呼び出します。

理論的には、これはうまくいくはずです(完全に試してはいません)。

+0

ありがとう – Joe

3

実際に関数にurlを設定することもできます。私はfetchByIdsの代わりにフェッチをオーバーライドするだけです: また、私は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); 
    } 
}); 

(つまり、あなたが取得することができ、私はそれが適切な「場所」内の機能性を保ちと思うし、それはより多くの再利用を可能に最初のページロードで(list_of_ids)いつでも...あなたは、新しいオブジェクトを必要としない)

7

は、あなたがフェッチ使用してはならない - それは、ここで説明reset使用してブートストラップする必要がありますhttp://documentcloud.github.com/backbone/#FAQ-bootstrapを。リンクから

読み込んでブートストラップモデル

アプリの最初の負荷は、それがレンダリングするために、あなたが必要になるだろう知っている初期モデルのセットを持っているのが一般的ですページ。それらを取得するために余分なAJAX要求を発砲する代わりに、そのデータをページに既にブートストラップしておくのが良い方法です。その後、リセットを使用して、コレクションに初期データを設定することができます。 DocumentCloudでは、ワークスペースのERBテンプレート内で、次の行に沿って何かを実行します。

<script> 
    Accounts.reset(<%= @accounts.to_json %>); 
    Projects.reset(<%= @projects.to_json(:collaborators => true) %>); 
</script> 
関連する問題