!['ReferenceError: el contenido no está definido' con U1db](https://rvso.com/image/1126783/'ReferenceError%3A%20el%20contenido%20no%20est%C3%A1%20definido'%20con%20U1db.png)
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 results
lista 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.