Подтвердить что ты не робот

Установить атрибут всех моделей в базовом наборе

Я понимаю, что используя метод pluck, мы можем получить массив атрибутов каждой модели внутри базовой сети

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

Я хочу, если есть метод, который устанавливает атрибут каждой модели в коллекции,

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

Ответ 1

У меня нет метода для него, но вы можете попробовать:

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

Ответ 2

Не существует уже существующего метода, но 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.

Ответ 3

Развернувшись на ответе Дэвида, вы можете легко включить эту функциональность в пользовательский метод в коллекции. Здесь мой способ сделать это с помощью 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);
    });
  }
});

Ответ 4

Просто подумал, что я напишу свой слегка обновленный метод, основанный на машинной версии. Это использует метод 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;
    }
});

Ответ 5

Если вы используете invoke, синтаксис в соответствии с подчеркиванием сайта должен быть _.invoke(list, methodName, * arguments) http://underscorejs.org/#invoke

Таким образом, указанная выше функция machineghost должна быть

collection.invoke({'url': someURL},'set');

Надеюсь, что помогает:)