![U1db 出現“ReferenceError:內容未定義”](https://rvso.com/image/1126783/U1db%20%E5%87%BA%E7%8F%BE%E2%80%9CReferenceError%EF%BC%9A%E5%85%A7%E5%AE%B9%E6%9C%AA%E5%AE%9A%E7%BE%A9%E2%80%9D.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」的變量,且 OptionSelector 沒有「name」屬性。
為什麼我們可以在委託中引用「名稱」?從委託中為模型中的每個元素建立一個新物件。該物件從該清單元素取得屬性,並且我們的清單元素包含「名稱」屬性。同樣,在您的範例中,U1db.Query 產生具有「contents」屬性的清單元素,這顯然是具有「name」屬性的物件。
如果我們想在委託之外引用這些屬性,我們需要進入模型並提取它們:
console.log(model.get(selectedIndex).name)
在您的情況下,模型是 U1db.Query,而不是 ListModel,因此它沒有get()
方法。它確實有一個results
我認為您可以索引的列表,但我對 U1db 的了解還不夠多,無法多說。希望這足以讓您走上正確的道路。