«ReferenceError: содержимое не определено» с U1db

«ReferenceError: содержимое не определено» с U1db

Я пытаюсь прочитать информацию из базы данных U1db.
Я столкнулся с этой ошибкой
'ReferenceError: contents is not defined'
Вот мой код:

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

это часть большого кода, из которого я вырезал ту часть, которая вызывала проблему.
что я делаю не так? спасибо!

решение1

Ваша проблема не с U1DB, а с OptionSelector. Давайте рассмотрим более простой пример:

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

При изменении индекса мы получаем ошибку "ReferenceError: name is not defined". И почему мы должны ожидать, что она будет определена? Мы не определили переменную с именем "name", а у OptionSelector нет свойства "name".

Почему мы можем ссылаться на "name" в делегате? Новый объект создается из делегата для каждого элемента в модели. Этот объект получает свойства из этого элемента списка, и наши элементы списка содержат свойство "name". Аналогично, в вашем примере U1db.Query создал элементы списка со свойством "contents", который, очевидно, был объектом со свойством "name".

Если мы хотим ссылаться на эти свойства за пределами делегата, нам нужно обратиться к модели и извлечь их:

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

В вашем случае модель — это U1db.Query, а не ListModel, поэтому у нее нет метода get(). У нее есть resultsсписок, который, как я предполагаю, вы можете индексировать, но я недостаточно хорошо знаю U1db, чтобы сказать больше. Надеюсь, этого достаточно, чтобы направить вас на правильный путь.

Связанный контент