que nodos modificar manipular funciones elementos ejemplos development con javascript backbone.js underscore.js backbone-collections

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