18

我知道使用 pluck 方法我们可以在骨干集合中获取每个模型的属性数组

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

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

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

5 回答 5

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.

于 2012-12-14T22:30:37.647 回答
9

我没有办法,但你可以试试:

collection.forEach(function(model, index) {
    model.set(url, urlArray[index]);
});
于 2012-12-14T22:29:48.653 回答
0

扩展大卫的答案,您可以轻松地将此功能放入集合的自定义方法中。这是我使用咖啡脚本的方法:

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 中做到这一点,它完全一样,但没有利用类或 splats 的力量。所以更像:

var Collection = Backbone.Collection.extend({
  setAll: function () {
    var _args = arguments;
    this.models.forEach(function (model) {
      model.set.apply(model, _args);
    });
  }
});
于 2015-12-01T16:55:20.363 回答
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;
    }
});
于 2017-05-25T17:42:22.670 回答
-3

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

所以上面提到的machineghost函数应该是

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

希望有帮助:)

于 2014-02-12T20:28:16.743 回答