no sigo ¿Cómo se define el modelo como una función?
De hecho, me encontré con este problema (o algo similar) ayer.
Puede definir una función de modelo en una colección para la creación de modelos polimórficos.
Al llamar a .add
en su colección, el código de Backbone intenta llamar a .prototype.idAttribute
en el atributo model
, pero si ha definido la función model
como método de clase ES2015, entonces no tiene un atributo prototype
.
Consulte aquí: https://github.com/jashkenas/backbone/blob/75e6d0ce6394bd2b809823c7f7dc014ddb6ae287/backbone.js#L1102
Entonces, por ejemplo, esto causará el problema:
const Library = Backbone.Collection.extend({
model () {
// stuff goes here
}
});
Si lo especificas así, entonces el problema desaparece:
const Library = Backbone.Collection.extend({
model: function () {
// stuff goes here
}
});
De hecho, me encontré con este problema (o algo similar) ayer.
Puede definir una función de modelo en una colección para la creación de modelos polimórficos.
Al llamar a
.add
en su colección, el código de Backbone intenta llamar a.prototype.idAttribute
en el atributomodel
, pero si ha definido la funciónmodel
como método de clase ES2015, entonces no tiene un atributoprototype
.Mira aquí:
Entonces, por ejemplo, esto causará el problema:
const Library = Backbone.Collection.extend({ model () { // stuff goes here } });
Si lo especificas así, entonces el problema desaparece:
const Library = Backbone.Collection.extend({ model: function () { // stuff goes here } });
¡Gracias por la descripción detallada del problema!
Pero su respuesta no es resolver el problema de idAttribute.
Al añadir nueva referencia de modelo no añadida. Por lo tanto, no puede obtener un nuevo modelo por id.
Workarond: se agregó model.prototype.idAttribute igual que en el modelo.
Creo que el problema es que model
en un Collection
se define como: Override this property to specify the model class that the collection contains.
Esta API no admite que el modelo se defina como una función.
@paulfalgout los documentos de la columna vertebral para Collection.model especifican que puede establecer una función como model
. Que esto no sea posible con la sintaxis model ()
(en lugar de model: function()
) me parece un error o al menos extremadamente confuso.
Sí, vinculé a la parte relevante de los documentos en mi mensaje original.
@PavelKoroteev : Parece que nuestros problemas están relacionados, pero no son lo mismo.
Esto es de lo que estoy hablando (pegado desde la consola):
collection = new (Backbone.Collection.extend({ model (attrs, options) { return new (Backbone.Model.extend({ idAttribute: 'customId' }))(attrs, options)}}));
child {length: 0, models: Array(0), _byId: {…}}
collection.add({ customId: 'id.1' });
backbone.js:1102 Uncaught TypeError: Cannot read property 'idAttribute' of undefined
at child.modelId (backbone.js:1102)
at child.get (backbone.js:997)
at child.set (backbone.js:872)
at child.add (backbone.js:814)
at <anonymous>:1:12
Creo que el problema es en realidad el mismo. Y también lo mismo que https://github.com/jashkenas/backbone/issues/4203
usar model: function(attrs, options)
crearía un prototipo que no tendría idAttribute
y volvería a id
para que "funcionara"
Tienes razón, el modelo polimórfico está documentado. _pero_... no ha soportado métodos de tipo idAttribute
o es6 debido a esta línea con model.prototype
durante bastante tiempo.
Parece que https://github.com/jashkenas/backbone/pull/3966 es una especie de solución :-/
Ver un PR de 2016 languidecer y no fusionarse (o rechazarse a favor de algo mejor) básicamente me desalienta a intentar hacer un PR para solucionar este problema.
Por lo que puedo decir, Backbone está prácticamente muerto.
Al igual que otros también lo han hecho, creé una bifurcación, la mía se llama Skeletor , que usaré para actualizar mi código Backbone a API y estándares más modernos y luego gradualmente me iré alejando hacia algo mejor.
Acabo de fusionar el antiguo https://github.com/jashkenas/backbone/pull/3966 PR, después de resolver los conflictos. Avisame si te da algun problema...
Comentario más útil
Acabo de fusionar el antiguo https://github.com/jashkenas/backbone/pull/3966 PR, después de resolver los conflictos. Avisame si te da algun problema...