2013年8月9日金曜日

Collection の initialize() で要素を追加する

Backbone.js の Collection を初期化するときには、第1引数にモデルのリストを渡すことになっています。
constructor / initialize - Backbone.js

このとき渡したリストが Collection 内のモデルリストの初期値になります。
重要なのは initialize() 内でモデルを追加しても、引数として渡された値が優先されて、
結果的にモデルリストが変化しないことです。
var Model = Backbone.Model.extend({
    defaults: {
        name: ''
    }
});

var Collection = Backbone.Collection.extend({
    model: Model,
    initialize: function() {
        this.add({name: 'taro'});
    }
});

var collection = new Collection([]);
console.log(collection.toJSON());  // []

上の例では Collection 内の initialize() 内で {name: 'taro'} を追加しようとしていますが、
実際には引数として最初に渡された [] が優先されます。

initialize() 内で Collection のモデルを操作したい場合には、
引数として null を渡せば OK です。
var Model = Backbone.Model.extend({
 defaults: {
  name: ''
 }
});

var Collection = Backbone.Collection.extend({
 model: Model,
 initialize: function() {
  this.add({name: 'taro'});
 }
});

var collection = new Collection(null);
console.log(collection.toJSON());  // [{name: 'taro'}]


0 件のコメント:

コメントを投稿