1

私は最近backbone.jsを学ぼうとしています。私が持っているのはモデルとコレクションです。モデルには、コレクション内でフェッチしたいデフォルトのプロパティがいくつか定義されています。これは私のコードです:

var model = Backbone.Model.extend({
    defaults : {
        done : true
    }
});

var collection = Backbone.Collection.extend({
    model : model,  

    pickMe : function () {
        log(this.model.get('done')); //return undefined
    }   
});

var col = new collection();
col.pickMe();

モデルで定義されたメソッドをコレクションから呼び出すにはどうすればよいですか?私はここで間違っていますか?

4

3 に答える 3

2

バックボーンの基本的な設定は次のとおりです。

コレクションの一部であるモデルがあります。したがって、ここでのセットアップにはモデルコンストラクターmodelとコレクションコンストラクターcollectionがありますが、コレクションにはモデルがなく、モデルがある場合はそれらは配列になるため、コードは次のようになります。

var model = Backbone.Model.extend({
    defaults : {
        done : true
    }
});

var collection = Backbone.Collection.extend({
    model : model,  

    pickMe : function () {
        for ( i = 0; i < this.models.length; i++ ) {
            log(this.models[i].get('done')); // this prints 'true'
        }
    }   
});

// Here we are actually creating a new model for the collection
var col = new collection([{ name : 'jack' }]); 

col.pickMe();

ここで動作中のjsFiddleを確認できます:http://jsfiddle.net/S8tHk/1/

于 2012-05-02T08:56:44.847 に答える
2

@erturneは正しいです。モデルインスタンスではなく、モデルコンストラクターでメソッドを呼び出そうとしています。それは意味がありません。

コレクションのメソッドを本当に定義したい場合は、@ drinchevが、コレクション内のモデルを反復処理してそれらのメソッドを呼び出す方法の例を提供します。ただし、この例はかなり不格好です。組み込みのイテレータメソッドを使用する方がエレガントです。

達成しようとしていることによっては、コレクションでメソッドを定義する代わりに、組み込みのコレクションイテレーターメソッドを使用して各モデルでメソッドを呼び出すことができます。例えば:

var Model = Backbone.Model.extend({
    defaults : {
      done : true
    }
});

var Collection = Backbone.Collection.extend({
    model : Model
});

var col = new Collection([{}, {done : false}, {}]);

col.each(function (model) {
  log(model.get('done'));
});
于 2012-05-02T12:48:17.873 に答える
0

コレクションではなく、モデル自体にモデルメソッドをアタッチする方がよいと思います。したがって、次のようなものが必要です。

var model = Backbone.Model.extend({
    defaults : {
        done : true
    },
    pickMe : function () {
        log(this.get('done'));
    }
});

var collection = Backbone.Collection.extend({
    model : model,  
});


var model = collection.get(id)
model.pickMe()
于 2012-05-02T10:05:19.313 に答える