![„ReferenceError: Inhalt ist nicht definiert“ mit U1db](https://rvso.com/image/1126783/%E2%80%9EReferenceError%3A%20Inhalt%20ist%20nicht%20definiert%E2%80%9C%20mit%20U1db.png)
Ich versuche, Informationen aus einer U1db-Datenbank zu lesen. Dabei
ist mir dieser Fehler begegnet
'ReferenceError: contents is not defined'
. Hier ist mein Code:
import U1db 1.0 as U1db
U1db.Database {
id: db
path: "lU1DbDatabase"
}
U1db.Document {
id: doc
database: db
docId: 'doc1'
create: true
defaults: { "name":["Jerusalem"]}
}
U1db.Index{
database: db
id: index1
expression: [["name"]]
}
U1db.Query{
id: query1
index: index1
}
OptionSelector {
id:selector1
model:query1
delegate: OptionSelectorDelegate {
text: i18n.tr(contents.name)//this work perfect
}
onSelectedIndexChanged: {
console.log(contents.name);//this get the error!
}
}
das ist Teil eines großen Codes, bei dem ich den Teil herausgeschnitten habe, der das Problem verursacht.
Was mache ich falsch? Danke!
Antwort1
Ihr Problem liegt nicht bei U1DB, sondern beim OptionSelector. Betrachten wir ein einfacheres Beispiel:
import QtQuick 2.0
import Ubuntu.Components 1.0
MainView {
OptionSelector {
model: ListModel {
ListElement { name: "Item 1" }
ListElement { name: "Item 2" }
}
delegate: OptionSelectorDelegate {
text: i18n.tr(name)
}
onSelectedIndexChanged: {
console.log(name)
}
}
}
Wenn der Index geändert wird, erhalten wir den Fehler „ReferenceError: Name ist nicht definiert“. Und warum sollten wir erwarten, dass er definiert ist? Wir haben keine Variable mit dem Namen „Name“ definiert und der OptionSelector hat keine „Name“-Eigenschaft.
Warum können wir im Delegaten auf „Name“ verweisen? Für jedes Element im Modell wird vom Delegaten ein neues Objekt erstellt. Dieses Objekt erhält die Eigenschaften von diesem Listenelement, und unsere Listenelemente enthalten eine „Name“-Eigenschaft. In ähnlicher Weise hat die U1db.Query in Ihrem Beispiel Listenelemente mit einer „Inhalt“-Eigenschaft erzeugt, bei denen es sich offensichtlich um ein Objekt mit einer „Name“-Eigenschaft handelte.
Wenn wir außerhalb des Delegaten auf diese Eigenschaften verweisen möchten, müssen wir in das Modell eingreifen und sie extrahieren:
console.log(model.get(selectedIndex).name)
In Ihrem Fall ist das Modell eine U1db.Query, kein ListModel, es hat also keine get()
Methode. Es hat eine results
Liste, die Sie vermutlich indizieren können, aber ich weiß nicht genug über U1db, um mehr zu sagen. Hoffentlich reicht das aus, um Sie auf den richtigen Weg zu bringen.