14

私がここで見逃している単純なものがなければなりません。

http://jsfiddle.net/v9mdZ/

私はBackboneとUnderscore/loDashを学んでいて、に慣れようとしていchainます。

私は次のコードを持っていますが、これは期待どおりに機能します。

var ids = _.pluck(collection.where({'is_checked':true}), 'id');

chain次のように使用して、これをリファクタリングしようとしました。

var ids = collection.chain().where({'is_checked':true}).pluck('id').value();

リファクタリングされたコードが機能しないのはなぜですか?私はchain間違って使用していますか?

解決策(詳細は以下)

whereと一緒に使用しないでくださいchain

4

1 に答える 1

18

一部のアンダースコアメソッドをコレクションにマージするのは少し不完全です。あなたが言うとき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/

于 2012-10-26T18:09:45.943 に答える