一部のアンダースコアメソッドをコレクションにマージするのは少し不完全です。あなたが言うときcollection.some_mixed_in_underscore_method()
、コレクションはあなたの後ろのバックボーンのもののいくつかをアンラップして、アンダースコアメソッドがコレクションのモデル内の属性に適用されるようにします。これは次のように機能します。
var ary = _(this.models).map(function(m) { return m.attributes });
return _(ary).some_mixed_in_underscore_method();
しかしcollection.chain()
、そのようには機能しません。コレクションを直接chain
ラップするだけなので、これを行うと次のようになります。models
console.log(collection.chain());
chain
これにより、モデルの配列をラップするオブジェクトが提供されていることがわかります。モデルにはis_checked
プロパティがありません(つまり、ありませんmodel.is_checked
)が、is_checked
属性はあります(つまり、ありますmodel.get('is_checked')
)model.attributes.is_checked
。
これで、すべてがうまくいかない場所を確認できます。
collection.chain().where({'is_checked':true})
is_checked
モデルにはプロパティがありません。is_checked
特に、 isがtrue
あり、その後のすべてwhere
が空の配列で動作しているモデルはありません。
物事が横向きに進む場所がわかったので、どうすれば修正できますか?filter
代わりにを使用where
して、モデルを簡単に解凍できます。
collection.chain()
.filter(function(m) { return m.get('is_checked') })
.pluck('id')
.value();
ただし、sを使用してモデルをid
作成しておらず、id
sを取得するためにサーバーと通信していないため、モデルにはまだsがありませid
ん。そのため、sの配列を取得しますundefined
。いくつかを追加する場合id
:
var collection = new App.OptionCollection([
{id: 1, 'is_checked': true},
{id: 2, 'is_checked': true},
{id: 3, 'is_checked': false}
]);
その後、あなたは[1,2]
あなたが探しているものを手に入れるでしょう。
デモ: http: //jsfiddle.net/ambiguous/kRmaD/