Backbone: idAttribute no está definido para el método modelId si el modelo se define como función.

Creado en 9 dic. 2019  ·  10Comentarios  ·  Fuente: jashkenas/backbone

duplicate

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...

Todos 10 comentarios

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 atributo model , pero si ha definido la función model como método de clase ES2015, entonces no tiene un atributo prototype .

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

¡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.

image

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.

Ver aquí: https://backbonejs.org/#Collection-modelo

@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...

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

rafde picture rafde  ·  9Comentarios

jashkenas picture jashkenas  ·  7Comentarios

inf3rno picture inf3rno  ·  17Comentarios

etler picture etler  ·  13Comentarios

azizZaben picture azizZaben  ·  5Comentarios