我正在尝试从 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”的变量,并且 OptionSelector 没有“name”属性。
为什么我们可以在委托中引用“name”?委托会为模型中的每个元素创建一个新对象。此对象从该列表元素获取属性,而我们的列表元素包含“name”属性。类似地,在您的示例中,U1db.Query 生成了具有“contents”属性的列表元素,这显然是一个具有“name”属性的对象。
如果我们想在委托之外引用这些属性,我们需要进入模型并提取它们:
console.log(model.get(selectedIndex).name)
在您的例子中,模型是 U1db.Query,而不是 ListModel,因此它没有方法get()
。它确实有一个results
列表,我猜您可以对其进行索引,但我对 U1db 了解不多,无法多说。希望这足以让您走上正确的道路。