![U1db で「ReferenceError: コンテンツが定義されていません」](https://rvso.com/image/1126783/U1db%20%E3%81%A7%E3%80%8CReferenceError%3A%20%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%81%8C%E5%AE%9A%E7%BE%A9%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%9B%E3%82%93%E3%80%8D.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 が定義されていません」というエラーが発生します。なぜそれが定義されていると予想されるのでしょうか? 「name」という名前の変数を定義しておらず、OptionSelector には「name」プロパティがありません。
なぜデリゲートで「名前」を参照できるのでしょうか? モデル内の各要素のデリゲートから新しいオブジェクトが作成されます。このオブジェクトはそのリスト要素からプロパティを取得し、リスト要素には「名前」プロパティが含まれています。同様に、あなたの例では、U1db.Query は「コンテンツ」プロパティを持つリスト要素を生成しましたが、これは明らかに「名前」プロパティを持つオブジェクトでした。
デリゲートの外部でこれらのプロパティを参照する場合は、モデルにアクセスしてそれらを抽出する必要があります。
console.log(model.get(selectedIndex).name)
あなたの場合、モデルは ListModel ではなく U1db.Query なので、メソッドはありませんget()
。インデックスを作成できると思われるリストはありますresults
が、U1db について十分な知識がないため、これ以上は説明できません。これで正しい方向に進めることを願っています。