11

コレクションで Underscore メソッド 'find' を使用しようとしていますが、期待した結果が得られません。

デフォルトのない基本モデルと、デフォルトのコレクションがあります。私のコレクションのモデルには、tranId (文字列としての GUID) と perform (実行する関数) の 2 つの属性しかありません。

渡したtranIdに一致するコレクション内のアイテムを見つけようとしています...

    var tranId = "1a2b3c";

    var found = _.find(myCollection, function(item){
        return item.tranId === tranId;
    });

デバッガーが私のコレクションにあることを示していても、Found は常に未定義です。実際には、tranId が私の変数と一致するアイテムが含まれています。return ステートメントにブレークポイントを設定して、item.tranId が何に等しいかを確認することができません。私もこれを試しました...

    var found = _.find(myCollection, function(item){
        return item.get('tranId') === tranId;
    });

でも、同じこと。「見つかった」は常に未定義です。ここで何が間違っていますか?

4

3 に答える 3

22

バックボーン コレクションはアンダースコア関数の多くを実装しているため、次のようにすることができます。

var found = myCollection.find(function(item){
        return Number(item.get('tranId')) === tranId;
});

また、値が期待どおりでない場合にデバッグするには、次を試してください。

var found = myCollection.find(function(item){
        console.log('Checking values', item, item.get('tranId'), tranId);   
        return Number(item.get('tranId')) === tranId;
});
于 2012-07-16T14:50:20.847 に答える
11

より単純なもの:

var found = myCollection.findWhere({'tranId': tranId})

詳しくはこちらをご覧ください。

Underscore メソッドを使用する必要がある場合:

var found = _.find(myCollection.models, function(item){
    return item.get('tranId') === tranId;
});

myCollection.models は配列であるため、myCollection はそうではありません。

私は前者の方が好きです。

于 2013-10-10T09:24:58.383 に答える
6

バックボーン (モデルのリストを管理するオブジェクト) とアンダースコア (オブジェクトのリスト) では、コレクションはまったく同じ意味ではありません。あなたが渡すべきもの_.findmyCollection.models

_.find(myCollection.models, function(model) {
    return model.get('tranId')===tranId;
});

@Daniel Arandaが説明したように、バックボーンプロキシはコレクションのメソッドをアンダースコアし、例を次のように書くことができます

myCollection.find(function(model) {
    return model.get('tranId')===tranId;
});

最後に、tranIdがモデル ID の場合、 id を idAttribute として設定し、次を使用して全体を簡素化できます。get

var M=Backbone.Model.extend({
   idAttribute: "tranId"
});
var C=Backbone.Collection.extend({
    model:M
});

var myCollection=new C([
    {tranId:'not this one'} ,
    {tranId:'another'} ,
    {tranId:'1a2b3c'}
]);

myCollection.get(tranId);

そしてフィドルhttp://jsfiddle.net/rYPLU/

于 2012-07-16T15:06:31.750 に答える