U1db 出现“ReferenceError:内容未定义”

U1db 出现“ReferenceError:内容未定义”

我正在尝试从 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 了解不多,无法多说。希望这足以让您走上正确的道路。

相关内容