2

バックボーン コレクションから、1 つの特定の属性のある種の配列を取得する方法を探しています。

var SomeModel = Backbone.Model.extend({
    defaults: function() {
        return {
            attr1: "something",
            attr2: "something",
            attr3: "darkside"
        };
    }
});

var SomeCollection = Backbone.Collection.extend({
    model: SomeModel,
    url: '/data.json',
});

ここで、上記のようなものがあり、属性「attr3」のみを持つコレクション/配列/類似物のみが必要であると仮定します。これを取得する良い方法はありますか (手動で SomeCollection を反復処理して新しいコレクションを作成するのではありません)。アンダースコア関数「filter」からの私の理解は、特定の前提に基づいて SomeModel 全体を返すということです。つまり、これは私が望むものではありません。アイデア?

ありがとう

4

4 に答える 4

4

属性が 1 つだけ必要な場合は、_.pluckを使用できます。

SomeCollection.pluck('attr3');

複数の属性の場合、コレクションの_.mapとモデルの_.pickを組み合わせることができます

SomeCollection.map(function (model) {
    return model.pick('attr2', 'attr3');
});

そしてデモhttp://jsfiddle.net/nikoshr/qpyXc/1/

または、より簡潔なバージョンを使用するには_.invoke

SomeCollection.invoke('pick', 'attr2', 'attr3');

http://jsfiddle.net/nikoshr/qpyXc/3/

于 2013-05-14T14:43:39.683 に答える
1

Underscore のpluckが必要だと思います:

map のおそらく最も一般的な使用例の便利なバージョン: プロパティ値のリストの抽出。

var attrs = _.pluck(someCollection.models, 'attr3');
于 2013-05-14T14:38:46.183 に答える
1

ここに誤解があると思います。投稿したコードでは、新しく作成されたモデルのデフォルト属性を設定します。以下を介して作成されたモデル:

var model = new SomeModel({});

また:

var collection = new SomeCollection();
// Add to collection
collection.add({});
// Add to collection AND sync with server
collection.create({});

上記の関数に渡されるハッシュでそれらを異なる方法で定義しない場合、これらの属性は特定の値に設定されます。

代わりに、あなたはこれを求めていると思います:

// Create some models
var model_a = new SomeModel({attr1: "Alpha"});
var model_b = new SomeModel({attr1: "Beta"});
var model_c = new SomeModel({attr1: "Gamma"});

// Push them in the collection
var collection = new SomeCollection([model_a, model_b, model_c]);

次に、要求されたモデル属性の値を含む文字列の配列を次のように取得できます。

collection.pluck(attributeName);

これ自体は、Backbone が依存する Underscore.js から継承された関数です。

これを指定して、 _.pluck(array, attributeName) がBackbone コンテキストの外部でも使用可能であり、 collectionsではなくarraysで機能することを明確にします。内部的に、collection.pluck は _.pluck(collection.models, fieldName) を呼び出します。

于 2013-05-14T14:44:55.257 に答える
0
someCollection.pluck.call({
    models: someCollection.where({
        attribute_name:attribute_value
    })
}, attribute_val_to_fetch);
于 2015-04-24T08:02:13.627 に答える