Ответ 1
У меня нет метода для него, но вы можете попробовать:
collection.forEach(function(model, index) {
model.set(url, urlArray[index]);
});
Я понимаю, что используя метод 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
позволяет делать что-то подобное в одной строке:
collection.invoke('set', {"urls": urlArray});
Если вы хотите создать метод многократного использования во всех своих коллекциях, вы можете сделать следующее:
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
.
Развернувшись на ответе Дэвида, вы можете легко включить эту функциональность в пользовательский метод в коллекции. Здесь мой способ сделать это с помощью 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);
});
}
});
Просто подумал, что я напишу свой слегка обновленный метод, основанный на машинной версии. Это использует метод lodash invokeMap вместо вызова underscore. Он поддерживает тот же необязательный синтаксис, что и стандартный метод 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;
}
});
Если вы используете invoke, синтаксис в соответствии с подчеркиванием сайта должен быть _.invoke(list, methodName, * arguments) http://underscorejs.org/#invoke
Таким образом, указанная выше функция machineghost должна быть
collection.invoke({'url': someURL},'set');
Надеюсь, что помогает:)