'ReferenceError: o conteúdo não está definido' com U1db

'ReferenceError: o conteúdo não está definido' com U1db

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 resultslista 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.

informação relacionada