!['ReferenceError: o conteúdo não está definido' com U1db](https://rvso.com/image/1126783/'ReferenceError%3A%20o%20conte%C3%BAdo%20n%C3%A3o%20est%C3%A1%20definido'%20com%20U1db.png)
Estou tentando ler informações de um banco de dados U1db.
Encontrei este erro
'ReferenceError: contents is not defined'
. Aqui está meu 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!
}
}
isso faz parte de um código grande que cortei a parte que causa o problema.
O que estou fazendo de errado? obrigado!
Responder1
Seu problema não é com o U1DB, mas com o OptionSelector. Vamos considerar um exemplo mais simples:
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)
}
}
}
Quando o índice é alterado, obtemos o erro "ReferenceError: o nome não está definido". E por que esperaríamos que fosse definido? Não definimos nenhuma variável chamada "nome" e o OptionSelector não possui uma propriedade "nome".
Por que podemos fazer referência a “nome” no delegado? Um novo objeto é criado a partir do delegado para cada elemento do modelo. Este objeto obtém as propriedades desse elemento da lista, e nossos elementos da lista contêm uma propriedade "nome". Da mesma forma, no seu exemplo, o U1db.Query produziu elementos de lista com uma propriedade "conteúdo", que evidentemente era um objeto com uma propriedade "nome".
Se quisermos fazer referência a essas propriedades fora do delegado, precisamos acessar o modelo e extraí-las:
console.log(model.get(selectedIndex).name)
No seu caso, o modelo é um U1db.Query, não um ListModel, portanto não possui um get()
método. Ele tem uma results
lista que presumo que você possa indexar, mas não sei o suficiente sobre o U1db para dizer mais. Esperamos que isso seja suficiente para colocá-lo no caminho certo.