Загрузка JSON в таблицу, иногда таблица загружается без данных - PullRequest
0 голосов
/ 27 июня 2010

Итак, у меня есть приложение, в котором у меня есть пустая таблица в DOM, и я загружаю таблицу JSON в таблицу динамически с помощью функции jgetu .getJSON. Это работает ... большую часть времени.

Иногда моя таблица появляется на странице без каких-либо данных, хотя firebug говорит, что моя таблица и JSON были загружены.

У кого-нибудь есть идеи, почему это может произойти?

Возможно ли, что JSON загружается перед таблицей (не должно быть)?

Будет ли полезен setTimeout, чтобы убедиться, что таблица загружается до того, как я попытаюсь загрузить JSON?

Код:

if (currentProdSelectValue === "Candy" && currentAppSelectValue === "Candy Store") {
 $('#page_content').children().fadeOut('slow'); 
 $('#page_content').load('page_eleven_new.html').hide().fadeIn('slow');

 $.getJSON('js/page_eleven.js',
    function(data){

          $('table#table_first_row tr:first td:first').html(data.candy.dataDaily.timeScope);
          $('table#table_first_row tr:first td:nth-child(2)').html(data.candy.dataDaily.lemonHmarsBarss);
          $('table#table_first_row tr:first td:nth-child(3)').html(data.candy.dataDaily.snickers);
          $('table#table_first_row tr:first td:nth-child(4)').html(data.candy.dataDaily.cottonCandy);
          $('table#table_first_row tr:first td:nth-child(5)').html(data.candy.dataDaily.marsBars);
          $('table#table_first_row tr:first td:nth-child(6)').html(data.candy.dataDaily.babyRuth);
          $('table#table_first_row tr:first td:nth-child(7)').html(data.candy.dataDaily.nerds);
          $('table#table_first_row tr:first td:nth-child(8)').html(data.candy.dataDaily.atomicFireBalls);
          $('table#table_first_row tr:first td:nth-child(9)').html(data.candy.dataDaily.fruitStripeGum);


          $('table#table_first_row tr:nth-child(2) td:first').html(data.candy.dataMonthToDate.timeScope);
          $('table#table_first_row tr:nth-child(2) td:nth-child(2)').html(data.candy.dataMonthToDate.lemonHmarsBarss);
          $('table#table_first_row tr:nth-child(2) td:nth-child(3)').html(data.candy.dataMonthToDate.snickers);
          $('table#table_first_row tr:nth-child(2) td:nth-child(4)').html(data.candy.dataMonthToDate.cottonCandy);
          $('table#table_first_row tr:nth-child(2) td:nth-child(5)').html(data.candy.dataMonthToDate.marsBars);
          $('table#table_first_row tr:nth-child(2) td:nth-child(6)').html(data.candy.dataMonthToDate.babyRuth);
          $('table#table_first_row tr:nth-child(2) td:nth-child(7)').html(data.candy.dataMonthToDate.nerds);
          $('table#table_first_row tr:nth-child(2) td:nth-child(8)').html(data.candy.dataMonthToDate.atomicFireBalls);
          $('table#table_first_row tr:nth-child(2) td:nth-child(9)').html(data.candy.dataMonthToDate.fruitStripeGum);

          //table row three

          $('table#table_first_row tr:last td:first').html(data.candy.dataYearToDate.timeScope);
          $('table#table_first_row tr:last td:nth-child(2)').html(data.candy.dataYearToDate.lemonHmarsBarss);
          $('table#table_first_row tr:last td:nth-child(3)').html(data.candy.dataYearToDate.snickers);
          $('table#table_first_row tr:last td:nth-child(4)').html(data.candy.dataYearToDate.cottonCandy);
          $('table#table_first_row tr:last td:nth-child(5)').html(data.candy.dataYearToDate.marsBars);
          $('table#table_first_row tr:last td:nth-child(6)').html(data.candy.dataYearToDate.babyRuth);
          $('table#table_first_row tr:last td:nth-child(7)').html(data.candy.dataYearToDate.nerds);
          $('table#table_first_row tr:last td:nth-child(8)').html(data.candy.dataYearToDate.atomicFireBalls);
          $('table#table_first_row tr:last td:nth-child(9)').html(data.candy.dataYearToDate.fruitStripeGum);

      });

    }  

Ответы [ 2 ]

3 голосов
/ 27 июня 2010

Вместо этого попробуйте этот подход, загружая JSON после таблицы на месте ... также я немного очистил общую структуру:

if (currentProdSelectValue === "Candy" && currentAppSelectValue === "Candy Store") {
  $('#page_content').children().fadeOut('slow'); 
  $('#page_content').load('page_eleven_new.html', function() {
    $.getJSON('js/page_eleven.js', function(data){
        var cat = ['dataDaily', 'dataMonthToDate', 'dataYearToDate'];
        var fields = ['timeScope', 'lemonHmarsBarss', 'snickers', 
                      'cottonCandy', 'marsBars', 'babyRuth', 'nerds', 
                      'atomicFireBalls', 'fruitStripeGum'];

        for(var c = 0; i < cat.length; c++) {
          $('table#table_first_row tr').eq(c).children().each(function(j, td) {
            $(this).html(data.candy[cat[i]][fields[j]]);
          });
        }
    });
  }).hide().fadeIn('slow');
}

Этот подход циклически повторяется, хотясвойства, в JavaScript data.candy.dataDaily.timeScope могут быть записаны как data.candy['dataDaily']['timeScope'], которые вы можете использовать здесь в своих интересах, указав эти имена один раз и просто просматривая эти свойства ... как вы можете видеть выше, это экономит лишь немного кода;)

Важной частью является то, что $.getJSON() работает как обратный вызов к .load(), гарантируя, что таблица есть, и эти селекторы находят что-то длязаселить ... что не так в настоящее время.Теперь вы видите пустую таблицу, потому что они иногда загружаются не по порядку ... это предотвращает это.

В качестве альтернативы, вы все равно можете загрузить оба, установить data в глобальную переменную, использовать событие .ajaxStop() и выполнить заполнение таблицы там (оно будет запущено после оба завершены).

0 голосов
/ 27 июня 2010

Ник встал передо мной, однако, чтобы доказать свою точку зрения относительно кэширования селекторов, я бы немного изменил его код

if (currentProdSelectValue === "Candy" && currentAppSelectValue === "Candy Store") {
  $('#page_content').children().fadeOut('slow'); 
  $('#page_content').load('page_eleven_new.html', function() {
    $.getJSON('js/page_eleven.js', function(data){
        var cat = ['dataDaily', 'dataMonthToDate', 'dataYearToDate'];
        var fields = ['timeScope', 'lemonHmarsBarss', 'snickers', 
                      'cottonCandy', 'marsBars', 'babyRuth', 'nerds', 
                      'atomicFireBalls', 'fruitStripeGum'];

        //cache tables rows
        var $trs = $('#table_first_row tr');

        for(var c = 0; i < cat.length; c++) {
          $trs.eq(c).children().each(function(j, td) {
            $(this).html(data.candy[cat[i]][fields[j]]);
          });
        }
    });
  }).hide().fadeIn('slow');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...