web-dev-qa-db-ja.com

バックボーンコレクション内のすべてのモデルの属性を設定します

Pluckメソッドを使用すると、バックボーンコレクション内の各モデルの属性の配列を取得できることを理解しています

var idsInCollection = collection.pluck('id'); // outputs ["id1","id2"...]

コレクション内の各モデルに属性を設定するメソッドがある場合は、

var urlArray = ["https://url1", "https://url1" ...];
collection.WHAT_IS_THIS_METHOD({"urls": urlArray});
18
sublime

方法はありませんが、次のことを試すことができます。

collection.forEach(function(model, index) {
    model.set(url, urlArray[index]);
});
9
David Hellsing

正確に既存のメソッドはありませんが、invokeで同様のことを1行で実行できます。

collection.invoke('set', {"urls": urlArray});

すべてのコレクションで再利用可能なsetメソッドを作成する場合は、次のようにすることができます。

var YourCollection = Backbone.Collection.extend({
    set: function(attributes) {
        this.invoke('set', attributes);
        // NOTE: This would need to get a little more complex to support the
        //       set(key, value) syntax
    }
});

*編集*

その後、バックボーンは独自のsetメソッドを追加しました。これを上書きすると、Collectionが完全に破壊されます。したがって、上記の例は、実際にはsetModelAttributes、またはset以外の名前に変更する必要があります。

39
machineghost

Machineghostのバージョンに基づいて少し更新したメソッドを投稿すると思っただけです。これは、アンダースコアのinvokeの代わりにlodashinvokeMapメソッドを使用します。標準のmodel.setメソッドと同じオプションの構文をサポートしています...例: ( 'prop'、 'val')または({prop: 'val'、prop: 'val'})、およびオプションオブジェクトの受け入れと受け渡し。

var YourCollection = Backbone.Collection.extend({
    setModels: function(key, val, options) {
        var attrs;

        if (typeof key === 'object') {
            attrs = key;
            options = val;
        } else {
            (attrs = {})[key] = val;
        }

        if (attrs) {
            _.invokeMap(this, 'set', attrs, options);
        }

        return this;
    }
});
0
relic

Davidの答えを拡張すると、この機能をコレクションのカスタムメソッドに簡単に組み込むことができます。これが、coffeescriptを使用してそれを行う私の方法です。

class Collection extends Backbone.Collection
  setAll: () ->
    _args = arguments
    @models.forEach (model) -> model.set _args...

class SomeCollection extends Collection
  url: '/some-endpoint.json'

myLovelyCollection = new SomeCollection()
myLovelyCollection.fetch
  success: (collection, response) ->
    collection.setAll someVar: true
    collection.setAll anotherVar, 'test'

Vanilla JSでそれを実行したい場合、それはまったく同じですが、クラスやスプラットの力を利用していません。だからもっと好き:

var Collection = Backbone.Collection.extend({
  setAll: function () {
    var _args = arguments;
    this.models.forEach(function (model) {
      model.set.apply(model, _args);
    });
  }
});
0
Matt Fletcher