![«ReferenceError: содержимое не определено» с U1db](https://rvso.com/image/1126783/%C2%ABReferenceError%3A%20%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%BC%D0%BE%D0%B5%20%D0%BD%D0%B5%20%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BE%C2%BB%20%D1%81%20U1db.png)
Я пытаюсь прочитать информацию из базы данных 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, чтобы сказать больше. Надеюсь, этого достаточно, чтобы направить вас на правильный путь.