Pluckメソッドを使用すると、バックボーンコレクション内の各モデルの属性の配列を取得できることを理解しています
var idsInCollection = collection.pluck('id'); // outputs ["id1","id2"...]
コレクション内の各モデルに属性を設定するメソッドがある場合は、
var urlArray = ["https://url1", "https://url1" ...];
collection.WHAT_IS_THIS_METHOD({"urls": urlArray});
方法はありませんが、次のことを試すことができます。
collection.forEach(function(model, index) {
model.set(url, urlArray[index]);
});
正確に既存のメソッドはありませんが、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
以外の名前に変更する必要があります。
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;
}
});
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);
});
}
});