Backbone: idAttribute n'est pas défini pour la méthode modelId si le modèle est défini comme fonction.

Créé le 9 déc. 2019  ·  10Commentaires  ·  Source: jashkenas/backbone

duplicate

Commentaire le plus utile

Je viens de fusionner l'ancien https://github.com/jashkenas/backbone/pull/3966 PR, après avoir résolu les conflits. Dis-moi si ça te pose problème...

Tous les 10 commentaires

Je ne suis pas. comment le modèle est-il défini comme une fonction ?

En fait, j'ai rencontré ce problème (ou quelque chose de similaire) hier.

Vous pouvez définir une fonction de modèle sur une collection pour la création de modèles polymorphes.

Lorsque vous appelez .add sur votre collection, le code Backbone essaie d'appeler .prototype.idAttribute sur l'attribut model , mais si vous avez défini la fonction model comme un Méthode de classe ES2015 alors elle n'a pas d'attribut prototype .

Voir ici : https://github.com/jashkenas/backbone/blob/75e6d0ce6394bd2b809823c7f7dc014ddb6ae287/backbone.js#L1102

Ainsi, par exemple, cela causera le problème :

const Library = Backbone.Collection.extend({
    model () {
       // stuff goes here
   }
});

Si vous le spécifiez comme ceci, le problème disparaît :

const Library = Backbone.Collection.extend({
    model: function () {
       // stuff goes here
   }
});

En fait, j'ai rencontré ce problème (ou quelque chose de similaire) hier.

Vous pouvez définir une fonction de modèle sur une collection pour la création de modèles polymorphes.

Lorsque vous appelez .add sur votre collection, le code Backbone essaie d'appeler .prototype.idAttribute sur l'attribut model , mais si vous avez défini la fonction model comme un Méthode de classe ES2015 alors elle n'a pas d'attribut prototype .

Vois ici:

https://github.com/jashkenas/backbone/blob/75e6d0ce6394bd2b809823c7f7dc014ddb6ae287/backbone.js#L1102

Ainsi, par exemple, cela causera le problème :

const Library = Backbone.Collection.extend({
    model () {
       // stuff goes here
   }
});

Si vous le spécifiez comme ceci, le problème disparaît :

const Library = Backbone.Collection.extend({
    model: function () {
       // stuff goes here
   }
});

Merci pour la description détaillée du problème !

Mais votre réponse n'est pas de résoudre le problème pour idAttribute.

Lors de l'ajout d'une nouvelle référence de modèle non ajoutée. Par conséquent, vous ne pouvez pas obtenir de nouveau modèle par identifiant.

image

Contournement - model.prototype.idAttribute ajouté identique à celui du modèle.

Je pense que le problème est que model sur un Collection est défini comme : Override this property to specify the model class that the collection contains. Cette API ne prend pas en charge le modèle défini comme une fonction.

@paulfalgout les documents de base pour Collection.model spécifient que vous pouvez définir une fonction comme model . Que ce ne soit pas possible avec la syntaxe model () (au lieu de model: function() ) me semble être un bogue ou du moins extrêmement déroutant.

Oui, j'ai lié à la partie pertinente de la documentation dans mon message d'origine.

Voir ici : https://backbonejs.org/#Collection-model

@PavelKoroteev : On dirait que nos problèmes sont liés, mais pas les mêmes.

Voici de quoi je parle (collé depuis la console):

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

Je pense que le problème est en fait le même. Et aussi le même que https://github.com/jashkenas/backbone/issues/4203

utiliser model: function(attrs, options) créerait un prototype qui n'aurait pas idAttribute et il reviendrait à id donc ça "fonctionnerait"

Vous avez raison, le modèle polymorphe est documenté. _mais_... il n'a pas pris en charge les méthodes de type idAttribute ou es6 à cause de cette ligne avec model.prototype depuis un bon moment.

Il semble que https://github.com/jashkenas/backbone/pull/3966 soit une sorte de correctif :-/

Voir un PR de 2016 languir et ne pas être fusionné (ou rejeté en faveur de quelque chose de mieux) me décourage fondamentalement même d'essayer de faire un PR pour résoudre ce problème.

D'après ce que je peux dire, Backbone est à peu près mort.

Comme d'autres l'ont fait également, j'ai créé un fork, le mien s'appelle Skeletor , que je vais utiliser pour mettre à jour mon code Backbone vers des API et des normes plus modernes, puis je passerai progressivement à quelque chose de mieux.

Je viens de fusionner l'ancien https://github.com/jashkenas/backbone/pull/3966 PR, après avoir résolu les conflits. Dis-moi si ça te pose problème...

Cette page vous a été utile?
0 / 5 - 0 notes