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

0

Estou tentando ler informações de um banco de dados do U1db.
Eu encontrei esse erro em 'ReferenceError: contents is not defined'
Aqui está o 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 do código grande que eu corto a parte que causa o problema.
O que estou fazendo de errado? obrigado!

    
por avi software 27.05.2015 / 11:14

1 resposta

1

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: name is not defined". E por que esperamos que seja definido? Não definimos nenhuma variável chamada "name" e o OptionSelector não tem uma propriedade "name".

Por que podemos referenciar "nome" no delegado? Um novo objeto é criado a partir do delegado para cada elemento no modelo. Esse objeto obtém as propriedades desse elemento de lista e nossos elementos de lista contêm uma propriedade "name". Da mesma forma, no seu exemplo, o U1db.Query produziu elementos de lista com uma propriedade "contents", que evidentemente era um objeto com uma propriedade "name".

Se quisermos referenciar essas propriedades fora do delegado, precisamos entrar no modelo e extraí-lo:

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

No seu caso, o modelo é um U1db.Query, não um ListModel, portanto, ele não possui o método get() . Ele tem uma lista results que eu presumo que você possa indexar, mas eu não sei o suficiente sobre o U1db para dizer mais. Espero que isso seja o suficiente para você entrar no caminho certo.

    
por Robert Schroll 28.05.2015 / 00:06