Как настроить средства форматирования в SlickGrid?

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

JQuery включает в себя:

    <script type="text/javascript" src="jquery-1.7.2.min.js"></script>


    <script type="text/javascript" src="jquery.event.drag-2.2.js"></script>
    <script type="text/javascript" src="slick.core.js"></script>
    <script type="text/javascript" src="slick.editors.js"></script>
    <script type="text/javascript" src="slick.formatters.js"></script>
    <script type="text/javascript" src="slick.grid.js"></script>

Выше все не отредактировано. Код, реализующий сетку:

                        var grid; var cols; var rows; var options = {
                            enableCellNavigation: true,
                            enableColumnReorder: false,
                            forceFitColumns: true
                        };
*rows and cols come from server side via JSON.parse*
grid = new Slick.Grid("#results", rows, cols, options);

Код, который приходит с сервера и заполняет переменные rows и cols, в основном таков:

            cols:
            echo json_encode('[
                    {"id":"price",      "name":"Ár",                "field":"price"},
                    {"id":"location",   "name":"Elhelyezkedés",     "field":"location"},
                    {"id":"egyeb",      "name":"Lófasz",            "field":"egyeb"},
                    {"id":"pic",        "name":"Képek",             "field":"pic", "formatter":"Slick.Formatters.PercentComplete"}
                ]');
            rows:
            echo json_encode('[
                    {"price": "5", "location":"AlsóBélaCsecselény",     "egyeb":"lófasz",   "pic":"1",  "link":"ezittahelye"},
                    {"price": "6", "location":"qrsóBéqrcselény",        "egyeb":"lófasz",   "pic":"2",  "link":"ezittahelye"},
                    {"price": "7", "location":"AlsóBélaqwqwrelény",     "egyeb":"lófasz",   "pic":"3",  "link":"ezittahelye"},
                    {"price": "8", "location":"qwrCsecselény",          "egyeb":"lófasz",   "pic":"4",  "link":"ezittahelye"}
                ]');

Все работает нормально, когда столбец pic не имеет средства форматирования, а сетка также работает с дополнительными свойствами для столбцов, такими как опечатка тега «formatter» (например, «fformatter» или что-то еще),

но Javascript дает мне следующую ошибку каждый раз, когда код JSON имеет свойство «formatter»:

Неперехваченное исключение: TypeError: 'getFormatter (row, m)' не является функцией

каждый блин когда пытаюсь загрузить таблицу форматтеры все портят и я не знаю что делать дальше! Я попытался отследить ошибку, и она привела меня к строке 1124. исходного кода slick.grid.js, эта функция как-то ломает все оператором return..

function getFormatter(row, column) {
  var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);

  // look up by id, then index
  var columnOverrides = rowMetadata &&
      rowMetadata.columns &&
      (rowMetadata.columns[column.id] || rowMetadata.columns[getColumnIndex(column.id)]);

  return (columnOverrides && columnOverrides.formatter) ||
      (rowMetadata && rowMetadata.formatter) ||
      column.formatter ||
      (options.formatterFactory && options.formatterFactory.getFormatter(column)) ||
      options.defaultFormatter;
}

Любая помощь будет оценена по достоинству!

Изменить: вот как я получаю код с сервера:

                            $.post( "queries.php?event=search&&phase=columns", $("#full_search").serialize(), function(data){
                                    cols = JSON.parse(data);
                                    alert(cols[1].id);
                                    $.post( "queries.php?event=search&&phase=rows", $("#full_search").serialize(), function(data){
                                        rows = JSON.parse(data);
                                        alert(rows[1].link);
                                        grid = new Slick.Grid("#results", rows, cols, options);
                                        alert(grid.getData().length);
                                        return false;
                                    },"json");
                                return false;
                            },"json");
                            },"json");

person David Tóth    schedule 19.06.2012    source источник


Ответы (3)


Slick.Formatters.PercentComplete не должно быть строкой. Это функция (конструктор класса), определенная в slick.formatters.js.

person Tin    schedule 19.06.2012
comment
отредактировал сообщение, чтобы показать, как я получаю JSON через почтовый вызов. Есть ли способ обойти это? Если я отброшу апострофы из Slick.Formatters.PercentComplete, то сценарий дыры сломается в строке JSON.parse. - person David Tóth; 20.06.2012
comment
Измените средство форматирования: Slick.Formatters.PercentComplete на средство форматирования: Slick.Formatters.PercentComplete. - person Tin; 20.06.2012
comment
тогда сценарий дыры сломается в строке JSON.parse.. есть ли способ обойти это? Я не уверен, как еще я должен отправлять код JSON через почтовый запрос - person David Tóth; 20.06.2012
comment
да, это не json. это объект javascript. не знаю, что вам нужно сделать с php там. - person Tin; 20.06.2012
comment
может быть, если я изменю значение тега форматирования последнего столбца со строки на объект Javascript? - person David Tóth; 20.06.2012
comment
Хорошо, я решил это! Я проанализировал данные, а затем установил строку форматирования в объект: cols = JSON.parse(data); cols[3].formatter = Slick.Formatters.PercentComplete; и это делает это! Спасибо за помощь! - person David Tóth; 20.06.2012

Хорошо, я решил это! Я проанализировал данные, а затем установил строку форматирования в объект: cols = JSON.parse(data); cols[3].formatter = Slick.Formatters.PercentComplete; и это делает это! Спасибо за помощь!

Я бы предложил что-то вроде этого.

Slick.Formatters.PercentComplete — это функция, а в json нет функций, как показано на http://json.org. Кроме того, проверка не выполняется в JSON, у которого есть функция. Вы можете попробовать проверить здесь: http://jsonlint.com/.

У вас не может быть функций в JSON. Затем, после получения данных «почти JSON», вам нужно проанализировать их на клиенте с помощью javascript, как вы это сделали.

Спасибо за образец! У меня такая же проблема, помогло.

В моем случае я получаю метаданные с помощью jQuery Ajax:

req = $.ajax({type: 'GET',
              url: url,
              dataType: 'json',
              async: false}).done(function(meta) { metadata = meta; });

Возвращаемые метаданные выглядят примерно так:

{"errors":{}, 
 "columns":[{"formatter":"TaskNameFormatter",
             "field":"1",
             "id":"1","width":220,"name":"Hierarchy1","cssClass":"cell-title"},
             OTHERS_COLUMNS]}

Поймите, что средство форматирования по-прежнему является строкой. Затем я просматриваю все столбцы, меняя средство форматирования со строки на функцию с помощью этого кода:

  $.each(metadata.columns, function(index, value) {
                              if(typeof value.formatter != "undefined") {
                                 value.formatter = eval(value.formatter);
                              } 
  });
person Roberto    schedule 15.01.2013

Для пользователей с данными, поступающими через JSON, вызов объекта должен быть заключен в кавычки; тем не менее, я смог найти в файле slick.grid.js ту часть, в которой он не работал:

if (d) {
  if(m.formatter){m.formatter=eval(m.formatter)} // make it an object call instead of string
  stringArray.push(getFormatter(row, m)(row, cell, value, m, d));
}
person Steve Fazekas    schedule 15.08.2012