javascript - nodos - Establecer atributo de todos los modelos en la colección troncal
modificar elementos html con javascript (5)
Ampliando la respuesta de David, puede poner fácilmente esta funcionalidad en un método personalizado en la colección. Aquí está mi manera de hacerlo usando 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''
Si quisieras hacerlo en JS de vainilla es exactamente lo mismo pero no aprovechar el poder de las clases o los símbolos. Así que más como
var Collection = Backbone.Collection.extend({
setAll: function () {
var _args = arguments;
this.models.forEach(function (model) {
model.set.apply(model, _args);
});
}
});
Entiendo que al usar el método Pluck podemos obtener una variedad de atributos de cada modelo dentro de una colección de backbone.
var idsInCollection = collection.pluck(''id''); // outputs ["id1","id2"...]
Quiero que si hay un método que configura un atributo para cada modelo en la colección,
var urlArray = ["https://url1", "https://url1" ...];
collection.WHAT_IS_THIS_METHOD({"urls": urlArray});
No hay exactamente un método preexistente, pero invoke
permite hacer algo similar en una sola línea:
collection.invoke(''set'', {"urls": urlArray});
Si quisiera hacer un método de conjunto reutilizable en todas sus colecciones, podría hacer lo siguiente:
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
}
});
* EDITAR *
Backbone ha agregado su propio método de set
, y si lo sobreescribe, romperá completamente su Collection
. Por lo tanto, el ejemplo anterior realmente debería cambiarse de nombre a setModelAttributes
, o cualquier otra cosa que no esté set
.
No hay un método para ello, pero puedes probar:
collection.forEach(function(model, index) {
model.set(url, urlArray[index]);
});
Si está utilizando invocar la sintaxis según el sitio de subrayado, debe ser _.invoke (list, methodName, * argumentos) http://underscorejs.org/#invoke
Así que la función mencionada anteriormente por debería ser
collection.invoke({''url'': someURL},''set'');
Espero que ayude :)
Solo pensé en publicar un método ligeramente actualizado basado en la versión de machineghost. Esto utiliza el método lodash invokeMap en lugar de la invocación del guión bajo. Admite la misma sintaxis opcional que el método model.set estándar ... por ejemplo, (''prop'', ''val'') o ({prop: ''val'', prop: ''val''}), así como aceptar y pasar un objeto de opciones .
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;
}
});