Использование $.each() в $.getJSON

Это для мобильного приложения jQuery, использующего версию 1.0.1.

Я пытаюсь получить данные из моего файла getmovies.php, который выводит JSON, для использования в функции jQuery, которая добавляет данные в неупорядоченный список на моей HTML-странице.

Моя HTML-страница отображается правильно, но функция getMoviesList() не добавляет элементы списка, поэтому область содержимого остается пустой.

Я предполагаю, что с моей функцией $.each() что-то не так. Мне удобнее работать с PHP, но я пытаюсь лучше познакомиться с jQuery и JSON для перемещения данных в мобильных приложениях jQuery.

getmovies.php выводит JSON следующим образом:

{"items":[
{"movieID":"65086","title":"The Woman in Black","poster":"\/kArMj2qsOnpxBCpSa3RQ0XemUiX.jpg"},
{"movieID":"76726","title":"Chronicle","poster":"\/853mMoSc5d6CH8uAV9Yq0iHfjor.jpg"}
]}

Мой Javascript выглядит следующим образом:

var serviceURL = "http://mydomain.com/app3/services/";

var movies;

$('#moviesPage').bind('pageinit', function(event) {
  getMoviesList();
});

function getMoviesList() {
  $.getJSON(serviceURL + 'getmovies.php', function(data) {
    $('#moviesList li').remove();
    movies = data.items;
    $.each(movies, function(index, movie) {
      $('#moviesList').append('<li><a href="movie-details.html?movieID=' + movie.movieID + '">' +
      '<img src="posters/' + movie.poster + '"/>' +
      '<h4>' + movie.title + '</h4>' +
      '<p>Other details...</p>' +
      '</a></li>');
    });
    $('#movieList').listview('refresh');
  });
}

Мой HTML выглядит так:

<div id="moviesPage" data-role="page">

  <div data-role="content">

    <ul id="moviesList" data-role="listview" data-filter="true"></ul>

  </div><!-- /content -->

</div><!-- /page -->

Я пытаюсь изменить следующий пример приложения в соответствии со своими потребностями: http://coenraets.org/blog/2011/10/sample-application-with-jquery-mobile-and-phonegap/.

Спасибо за любую помощь, которую вы можете предложить.


person Mark Rummel    schedule 26.02.2012    source источник
comment
Получаете ли вы данные, когда запускаете console.log(movie) в первой строке каждого?   -  person Adam Merrifield    schedule 26.02.2012
comment
@ Адам Спасибо за ваш комментарий. На самом деле я не знаю, как использовать console.log(). Я работаю со своими файлами в редакторе кода и загружаю их на свой сервер для тестирования.   -  person Mark Rummel    schedule 26.02.2012
comment
Добавьте эту строку, а затем при запуске страницы используйте getfirebug.com для просмотра данных и ошибок javascript или отправьте мне ссылку   -  person Adam Merrifield    schedule 26.02.2012
comment
@ Адам Спасибо за помощь! Ссылка: stay4credits.com/app3, затем нажмите "Должен ли я остаться ради кредитов?" ссылка на сайт. Я не заметил никаких ошибок в firebug.   -  person Mark Rummel    schedule 26.02.2012
comment
В firebug вы можете видеть, что getJson не работает, а это означает, что функция не срабатывает, поэтому строки $('#moviesPage').bind('pageinit', function(event) { getMoviesList(); }); не привязывают эту страницу к правильному запуску этой функции.   -  person Adam Merrifield    schedule 26.02.2012
comment
@Адам Спасибо, что помогли мне отследить проблему. Пример приложения, который я использовал, был основан на более старой версии мобильного jQuery. Я изменил код, на который вы ссылались в своем последнем комментарии, на $( document ).delegate("#moviesPage", "pageinit", function() {..., и теперь он извлекает данные. Мне просто нужно исправить listview('refresh'), для которого у меня уже есть решение. В очередной раз благодарим за помощь!   -  person Mark Rummel    schedule 26.02.2012


Ответы (2)


Проверьте правильность выходных данных JSON: проверьте здесь jsonlint.com

Измените событие привязки на это и посмотрите, работает ли оно.

$('#moviesPage').bind('pageinit', function(event) {
    getMoviesList();
});

к этому

$('#moviesPage').live('pageshow', function(event) { //or 'pagecreate'
    getMoviesList();
});

Как я вижу, остальной код JS в порядке! Попробуйте это и посмотрите, работает ли это. Насколько я знаю, так и должно быть! Это метод, который я использую в своем мобильном приложении, и он работает очень хорошо.

person aki    schedule 26.02.2012
comment
Спасибо! Это работает. Знаете ли вы, как заставить список заполняться данными перед загрузкой страницы? В настоящее время я использую pagebeforecreate, но на странице есть анимация загрузки по умолчанию до изменения страницы, но затем страница пуста до тех пор, пока не будут получены данные списка. Я хотел бы, чтобы список был заполнен, как только анимация загрузки по умолчанию для изменения страницы будет завершена. - person Mark Rummel; 27.02.2012
comment
Вы можете попробовать поставить символ загрузки в начале живого события. $.mobile.showPageLoadingMsg(); а затем скройте его после вызова json с помощью $.mobile.hidePageLoadingMsg();. Таким образом, по крайней мере, когда ваши данные загружаются, отображается символ загрузки. - person aki; 27.02.2012

С помощью Адама я смог сузить круг вопросов.

Если вы используете «Пример приложения с использованием jQuery Mobile и PhoneGap» Кристофа Коэнраэтса (http://coenraets.org/blog/2011/10/sample-application-with-jquery-mobile-and-phonegap/) и используете jQuery Mobile выше 1.0rc1, вам, вероятно, потребуется заменить следующий код в вашем javascript:

$('#employeeListPage').bind('pageinit', function(event) { getEmployeeList(); });

to:

$( document ).delegate("#employeeListPage", "pageinit", function() { getEmployeeList(); });

Причина этого объясняется в документации jQuery Mobile по следующей ссылке в разделе pageCreate = DOM ready: http://jquerymobile.com/demos/1.0.1/docs/pages/page-scripting. HTML.

Я надеюсь, что это поможет всем, кто сталкивается с той же проблемой, пытаясь использовать этот замечательный образец приложения.

person Mark Rummel    schedule 26.02.2012