У меня есть XmlListModel, который изначально запрашивает локальный файл XML, который имеет список городов общего мира, а также их широту и долготу. Если пользователь не может найти город в этом локальном списке, XML ListModel затем запрашивает онлайн-API для получения широты и долготы города.Как обновить QML ListView только после того, как XmlListModel готов?
Как показано в коде, по умолчанию он отображает список локальных городов, используя в качестве источника функцию 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 готов? Я уже пробовал использовать onStatusChanged в Xml ListModel.
Странная часть заключается в том, что она жалуется на изменение источника только при переходе от онлайн к локальному. Поэтому, когда пользователь впервые выполняет поиск в Интернете, он не отображает никаких ошибок. Но ошибка появляется только тогда, когда пользователь нажимает кнопку «Назад», где она переключается на локальный источник.
Где код для кнопки «Назад»? – Deadron
@Deadron Я обновил сообщение. Кнопка назад в основном просто выполняет поиск в SearchCityModel.source = localCityUrl(). Ничего больше. – Nik