设置骨干集合中所有模型的属性

时间:2012-12-14 22:22:16

标签: javascript backbone.js underscore.js backbone-collections

据我所知,使用pluck方法我们可以在主干集合中获取每个模型的一系列属性

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

我想如果有一个方法为集合中的每个模型设置一个属性,

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

5 个答案:

答案 0 :(得分:39)

没有一个预先存在的方法,但是invoke让你在一行中做类似的事情:

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
    }
});

*编辑*

Backbone已经添加了自己的set方法,如果你覆盖它,你将完全破坏你的Collection。因此,上面的示例应该真正重命名为setModelAttributes或其他任何不是set的内容。

答案 1 :(得分:9)

我没有方法,但你可以尝试:

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

答案 2 :(得分:0)

扩展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'

如果你想在香草JS中做到这一点,它完全相同,但没有利用类或splats的力量。更像是:

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

答案 3 :(得分:0)

我想我会根据machineghost的版本发布稍微更新的方法。这使用lodash invokeMap方法而不是下划线的调用。它支持与标准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;
    }
});

答案 4 :(得分:-3)

如果您正在使用调用根据下划线网站的语法应该是 _.invoke(list,methodName,* arguments)http://underscorejs.org/#invoke

所以machineghost提到的上述功能应该是

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

希望有所帮助:)