'ReferenceError: el contenido no está definido' con U1db

'ReferenceError: el contenido no está definido' con U1db

Estoy intentando leer información de una base de datos de U1db.
Encontré este error
'ReferenceError: contents is not defined'
. Aquí está mi código:

    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!
                }
   }

Esto es parte de un código grande que corté y que causa el problema.
¿Qué estoy haciendo mal? ¡gracias!

Respuesta1

Su problema no es con U1DB, sino con OptionSelector. Consideremos un ejemplo más simple:

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

Cuando se cambia el índice, aparece el error "ReferenceError: el nombre no está definido". ¿Y por qué esperaríamos que se defina? No hemos definido ninguna variable llamada "nombre" y OptionSelector no tiene una propiedad de "nombre".

¿Por qué podemos hacer referencia a "nombre" en el delegado? Se crea un nuevo objeto a partir del delegado para cada elemento del modelo. Este objeto obtiene las propiedades de ese elemento de la lista y nuestros elementos de la lista contienen una propiedad de "nombre". De manera similar, en su ejemplo, U1db.Query produjo elementos de lista con una propiedad de "contenido", que evidentemente era un objeto con una propiedad de "nombre".

Si queremos hacer referencia a esas propiedades fuera del delegado, debemos acceder al modelo y extraerlas:

            console.log(model.get(selectedIndex).name)

En su caso, el modelo es U1db.Query, no ListModel, por lo que no tiene método get(). Tiene una resultslista que supongo que puedes indexar, pero no sé lo suficiente sobre U1db para decir más. Esperemos que esto sea suficiente para llevarlo por el camino correcto.

información relacionada