私は XmlListModel を持っています。これは最初に、緯度と経度とともに一般的な世界の都市のリストを持つローカル XML ファイルを照会します。ユーザーがそのローカル リストで都市を見つけられない場合、XML ListModel はオンライン API にクエリを実行して、都市の緯度と経度を取得します。
コードに示されているように、デフォルトでは localCityUrl() 関数をソースとして使用して地方都市のリストを表示します。
XmlListModel {
id: searchCityModel;
source: localCityUrl()
query: "/geonames/geoname"
XmlRole { name: "city"; query: "toponymName/string()"; isKey: true }
XmlRole { name: "country"; query: "countryName/string()"; isKey: true }
XmlRole { name: "lat"; query: "lat/string()"; isKey: true }
XmlRole { name: "lng"; query: "lng/string()"; isKey: true }
onSourceChanged: reload();
}
ListView {
id: worldList
anchors { left: parent.left; right: parent.right }
height: units.gu(50)
model: searchCityModel
currentIndex: -1
delegate: Column {
text: searchCityModel.status == XmlListModel.Ready ? searchCityModel.get(index).city + ", " + searchCityModel.get(index).country : console.log("Loading..")
selected: worldList.currentIndex == index;
}
}
この時点で、すべて問題ありません。ただし、ユーザーが都市をオンラインで検索すると (ローカル リストで利用できないため)、ソースを変更してオンライン API を照会します。これは、デフォルトで常に 5 つの結果 (ユーザーの検索用語に最もよく一致するもの) を返します。
戻るボタンを含めました。クリックすると、次のコードを使用して XML ListModel ソースがローカル ファイルに戻ります。
searchCityModel.source = localCityUrl();
ただし、それを行うと、次のエラーメッセージが表示されます。
TypeError: Cannot read property 'city' of undefined
基本的に、Xml ListModel の値を読み取ってテキスト デリゲートに割り当てようとしている行について不平を言っています。
Xml ListModel の準備ができたときにのみそれを実行しようとするようにするにはどうすればよいですか? Xml ListModel で onStatusChanged を使用してみました。
奇妙な部分は、オンラインからローカルに変更した場合にのみ、ソースの変更について不平を言うことです。そのため、ユーザーが初めてオンラインで検索したときに、エラーは表示されません。ただし、エラーは、ユーザーがローカル ソースに切り替える [戻る] ボタンを押したときにのみ表示されます。