Проблема с отображением расширенного массива JSON с таблицами данных jQuery - PullRequest
2 голосов
/ 27 мая 2011

У меня проблема с отображением определенных частей массива JSON в виде данных.

Вот 1 секция массива.

[
    {
        "description": "Testing",
        "lineStatus": "OK",
        "persistent": true,
        "pkgLineId": 102,
        "pkgLineTree": {
            "class": "models.PkgLineTree",
            "entityId": 1,
            "persistent": true,
            "pkgLineTreeId": 1,
            "treeId": {
                "class": "models.Tree",
                "entityId": 61,
                "name": "Test",
                "parentId": {
                    "class": "models.Tree",
                    "entityId": 57,
                    "name": "East",
                    "parentId": {
                        "class": "models.Tree",
                        "entityId": 52,
                        "name": "Test3",
                        "parentId": null,
                        "persistent": true,
                        "treeId": 52,
                        "webname": "coke"
                    },
                    "persistent": true,
                    "treeId": 57,
                    "webname": "east"
                },
                "persistent": true,
                "treeId": 61,
                "webname": "collegepark"
            }
        },
        "shortname": "Line 1A",
        "statusStamp": 1305726508000,
        "timezone": "US/Eastern",
        "webname": "line1a"
    },

Вот мой датируемый JavaScript.

 $(window).load(function() {       

    var insertedTable =  $('#pkgLineTable').dataTable({
        "bJQueryUI": true,
        "sPaginationType": "full_numbers",
        "bPaginate": true,
        "bLengthChange": true,
        "bFilter": true,
        "bSort": false,
        "bInfo": true,
        "bAutoWidth": false,       
        "bProcessing": true,
        "bServerSide": false,
        "sAjaxSource": 'json/pkglinelist',
        "fnServerData": fnServerObjectToArray(['shortname', 'description', 'lineStatus', 'statusStamp'])          
    });       
});   

Вот моя функция обратного вызова.

fnServerObjectToArray = function (aElements) {     

    return function (sSource, aaData, fnCallback) {
        $.ajax({
            "dataType": 'json',
            "type": "GET",
            "url": sSource,
            "data": aaData,
            "success": function (json) {
                var a = [];
                $.each(json, function(index, item) {     
                    var inner = [];
                    for (var i = 0, iLen = aElements.length; i < iLen; i++) {
                        inner.push(item[aElements[i]]);
                    }
                    a.push(inner);
                });
                json.aaData = a;               
                fnCallback(json);
            }
        });
    }
}

Я могу изобразить некоторые части массива JSON. Как видите, такие вещи, как description, lineStatus и statusStamp работают нормально. Если я копаюсь в этом, это не работает. Это то, что я пробовал.

  "fnServerData": fnServerObjectToArray(['pkgLineTree.class', 'pkgLineTree.entityId', 'lineStatus', 'statusStamp']) 

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

Если я попробую эти значения, я получу это обратно.

Предупреждение Datatables: запрошенный неизвестный параметр '0' для источника данных в строке '0'.

Просто интересно, что здесь происходит. Большое спасибо.

1 Ответ

1 голос
/ 28 мая 2011

Проблема в обратном вызове состоит в том, что он не повторяется вправо, чтобы идти глубже, чем на один уровень.Это потому, что item ['pkgLineTree.class'], очевидно, не определен (вы должны получить доступ ко мне как этот: item ['pkgLineTree'] ['class']), и поэтому вы передаете неопределенные значения в таблицы данных.Так что вам нужно немного поработать, что-то вроде этого должно работать:

$.each(json, function(index, item) {     
       var inner = [];
       for (var i = 0, iLen = aElements.length; i < iLen; i++) {
          var str = aElements[i];
          var array = str.split('.');//this splits the Element if it has a dot
          var subObject = null;
          for (l = 0; l < array.length; l++){
               if (subObject){//if subObject has a value (this means it's not the firs iteration of the cycle, go one level deeper
                    subObject = subObject[array[l]];
               }else{//else go one level deep into item
                    subObject = item[array[l]];
               }
            }
            inner.push(subObject);
        }
        a.push(inner);
});

Если это не сработает, я попробую лучше, когда буду дома, я создал эту упрощенную скрипку иэто работает. http://jsfiddle.net/njsYh/1/

РЕДАКТИРОВАТЬ - я пробовал, и это работает для меня.Конечно, вы можете перейти на более глубокий уровень, разделив каждый уровень точкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...