Ich folge nicht. Wie wird ein Modell als Funktion definiert?
Ich bin gestern tatsächlich auf dieses Problem (oder etwas ähnliches) gestoßen.
Sie können eine Modellfunktion für eine Sammlung zur Erstellung polymorpher Modelle definieren.
Beim Aufrufen .add
für Ihre Sammlung versucht der Backbone-Code, .prototype.idAttribute
für das Attribut model
aufzurufen, aber wenn Sie die Funktion model
als ES2015-Klassenmethode, dann hat sie kein prototype
-Attribut.
Siehe hier: https://github.com/jashkenas/backbone/blob/75e6d0ce6394bd2b809823c7f7dc014ddb6ae287/backbone.js#L1102
Dies wird beispielsweise das Problem verursachen:
const Library = Backbone.Collection.extend({
model () {
// stuff goes here
}
});
Wenn Sie es so angeben, dann ist das Problem weg:
const Library = Backbone.Collection.extend({
model: function () {
// stuff goes here
}
});
Ich bin gestern tatsächlich auf dieses Problem (oder etwas ähnliches) gestoßen.
Sie können eine Modellfunktion für eine Sammlung zur Erstellung polymorpher Modelle definieren.
Beim Aufrufen
.add
für Ihre Sammlung versucht der Backbone-Code,.prototype.idAttribute
für das Attributmodel
aufzurufen, aber wenn Sie die Funktionmodel
als ES2015-Klassenmethode, dann hat sie keinprototype
-Attribut.Siehe hier:
Dies wird beispielsweise das Problem verursachen:
const Library = Backbone.Collection.extend({ model () { // stuff goes here } });
Wenn Sie es so angeben, dann ist das Problem weg:
const Library = Backbone.Collection.extend({ model: function () { // stuff goes here } });
Vielen Dank für die ausführliche Problembeschreibung!
Aber Ihre Antwort ist kein Problem für idAttribute.
Beim Hinzufügen neuer Modellreferenz nicht hinzugefügt. Daher können Sie kein neues Modell anhand der ID erhalten.
Workarond - model.prototype.idAttribute hinzugefügt, das gleiche wie auf dem Modell.
Ich denke, das Problem ist, dass model
auf einem Collection
definiert ist als: Override this property to specify the model class that the collection contains.
Diese API unterstützt kein Modell, das als Funktion definiert wird.
@paulfalgout Die Backbone-Dokumentation für Collection.model gibt an, dass Sie eine Funktion als model
festlegen können. Dass dies mit der model ()
Syntax (anstelle von model: function()
) nicht möglich ist, erscheint mir wie ein Bug oder zumindest extrem verwirrend.
Ja, ich habe in meiner ursprünglichen Nachricht auf den relevanten Teil der Dokumente verlinkt.
Siehe hier: https://backbonejs.org/#Collection -model
@PavelKoroteev : Sieht so aus, als wären unsere Probleme verwandt, aber nicht gleich.
Hier ist, wovon ich spreche (aus der Konsole eingefügt):
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
Ich denke, das Problem ist eigentlich das gleiche. Und auch das gleiche wie https://github.com/jashkenas/backbone/issues/4203
Die Verwendung model: function(attrs, options)
würde einen Prototyp erstellen, der kein idAttribute
hätte und auf id
zurückgreifen würde, damit es "funktionieren" würde
Sie haben Recht, das polymorphe Modell ist dokumentiert. _aber_... wegen dieser Zeile mit model.prototype hat es wegen dieser Zeile mit model.prototype
seit einiger Zeit keine Methoden vom Typ idAttribute
oder es6 unterstützt.
Es scheint, dass https://github.com/jashkenas/backbone/pull/3966 eine Art Fix ist :-/
Zu sehen, wie eine PR aus dem Jahr 2016 schmachtet und nicht zusammengeführt (oder zugunsten von etwas Besserem abgelehnt) wird, entmutigt mich im Grunde davon, überhaupt zu versuchen, eine PR zu erstellen, um dieses Problem zu beheben.
Soweit ich das beurteilen kann, ist Backbone so gut wie tot.
Wie andere es auch getan haben, habe ich einen Fork erstellt, meiner heißt Skeletor , den ich verwenden werde, um meinen Backbone-Code auf modernere APIs und Standards zu aktualisieren, und dann werde ich nach und nach zu etwas Besserem übergehen.
Ich habe gerade die alte https://github.com/jashkenas/backbone/pull/3966 PR zusammengeführt, nachdem ich Konflikte gelöst hatte. Sag Bescheid, wenn es dir Probleme bereitet...
Hilfreichster Kommentar
Ich habe gerade die alte https://github.com/jashkenas/backbone/pull/3966 PR zusammengeführt, nachdem ich Konflikte gelöst hatte. Sag Bescheid, wenn es dir Probleme bereitet...