2013-06-17 1 views
0

У меня есть 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.

Странная часть заключается в том, что она жалуется на изменение источника только при переходе от онлайн к локальному. Поэтому, когда пользователь впервые выполняет поиск в Интернете, он не отображает никаких ошибок. Но ошибка появляется только тогда, когда пользователь нажимает кнопку «Назад», где она переключается на локальный источник.

+0

Где код для кнопки «Назад»? – Deadron

+0

@Deadron Я обновил сообщение. Кнопка назад в основном просто выполняет поиск в SearchCityModel.source = localCityUrl(). Ничего больше. – Nik

ответ

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; 
       } 
      } 
     } 
    } 
+0

Большое спасибо, что исправил проблему :-). Я прочитал документы XmlListModel, которые показывали, как получить доступ к его данным. Однако я не понимал, что через делегат ListView к нему нужно обращаться по-разному. Еще раз спасибо. – Nik

 Смежные вопросы

  • Нет связанных вопросов^_^