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
.
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'attributmodel
, mais si vous avez défini la fonctionmodel
comme un Méthode de classe ES2015 alors elle n'a pas d'attributprototype
.Vois ici:
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.
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...
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...