我知道使用 pluck 方法我们可以在骨干集合中获取每个模型的属性数组
var idsInCollection = collection.pluck('id'); // outputs ["id1","id2"...]
我想如果有一种方法可以为集合中的每个模型设置一个属性,
var urlArray = ["https://url1", "https://url1" ...];
collection.WHAT_IS_THIS_METHOD({"urls": urlArray});
我知道使用 pluck 方法我们可以在骨干集合中获取每个模型的属性数组
var idsInCollection = collection.pluck('id'); // outputs ["id1","id2"...]
我想如果有一种方法可以为集合中的每个模型设置一个属性,
var urlArray = ["https://url1", "https://url1" ...];
collection.WHAT_IS_THIS_METHOD({"urls": urlArray});
不完全是预先存在的方法,但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
.
我没有办法,但你可以试试:
collection.forEach(function(model, index) {
model.set(url, urlArray[index]);
});
扩展大卫的答案,您可以轻松地将此功能放入集合的自定义方法中。这是我使用咖啡脚本的方法:
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);
});
}
});
只是想我会根据 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;
}
});
如果您使用根据下划线站点调用语法应该是 _.invoke(list, methodName, *arguments) http://underscorejs.org/#invoke
所以上面提到的machineghost函数应该是
collection.invoke({'url': someURL},'set');
希望有帮助:)