一部のアンダースコアメソッドをコレクションにマージするのは少し不完全です。あなたが言うとき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作成しておらず、idsを取得するためにサーバーと通信していないため、モデルにはまだ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/