0

私は 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 を使用してみました。

奇妙な部分は、オンラインからローカルに変更した場合にのみ、ソースの変更について不平を言うことです。そのため、ユーザーが初めてオンラインで検索したときに、エラーは表示されません。ただし、エラーは、ユーザーがローカル ソースに切り替える [戻る] ボタンを押したときにのみ表示されます。

4

1 に答える 1

2

実際には ListModel でモデルを適切に使用しておらず、これが問題の原因となっている可能性があります。デリゲートは、基になるモデルによってデリゲートに公開された属性を使用する必要があります。searchCityModel.get(index) を呼び出すことで、ListView にバインドしたモデルを使用していません。デリゲートは次のようになります

ListView {
        id: worldList

        anchors { left: parent.left; right: parent.right }
        height: units.gu(50)
        model: searchCityModel    

        delegate: Rectangle {
            width: worldList.width
            height: 20 //This has to be hardcoded to avoid the binding loop with the MouseArea

            text: city + ", " + country
            MouseArea {
                anchors.fill: parent
                onClicked: {
                    worldList.currentIndex = index;
                }
            }
        }
    }
于 2013-06-20T21:37:45.157 に答える