„ReferenceError: Inhalt ist nicht definiert“ mit U1db

„ReferenceError: Inhalt ist nicht definiert“ mit U1db

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

verwandte Informationen