Backbone: idAttribute ist für die modelId-Methode nicht definiert, wenn das Modell als Funktion definiert ist.

Erstellt am 9. Dez. 2019  ·  10Kommentare  ·  Quelle: jashkenas/backbone

duplicate

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

Alle 10 Kommentare

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

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.

image

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

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

zowers picture zowers  ·  11Kommentare

rubiii picture rubiii  ·  12Kommentare

etler picture etler  ·  13Kommentare

rafde picture rafde  ·  9Kommentare

jashkenas picture jashkenas  ·  7Kommentare