2012-04-04 4 views
2

я собирался через документацию и исходный код jqGrid 4.3.1, когда речь идет для функции tableToGrid() и я обнаружил, что ColModel и ColNames игнорируются при включении в options объект, поскольку они построены из макета таблицы HTML.jQgrid tableToGrid() игнорирует colModel и COLNAMES в вариантах

Мой вопрос: есть ли способ заставить tableToGrid() принять эти два массива (ColModel,ColNames), а не конструировать их из таблицы HTML, особенно если столбцы таблицы известны заранее.

Когда я прошел через код, я нашел эту часть в коде для TableToGrid

function tableToGrid(selector, options) { 
... 
... 
// Build up the columnModel and the data 
var colModel = []; 
var colNames = []; 
jQuery('th', jQuery(this)).each(function() { 
    if (colModel.length === 0 && selectable) { 
     colModel.push({ 
      name: '__selection__', 
      index: '__selection__', 
      width: 0, 
      hidden: true 
     }); 
     colNames.push('__selection__'); 
    } else { 
     colModel.push({ 
      name: jQuery(this).attr("id") || jQuery.trim(jQuery.jgrid.stripHtml(jQuery(this).html())).split(' ').join('_'), 
      index: jQuery(this).attr("id") || jQuery.trim(jQuery.jgrid.stripHtml(jQuery(this).html())).split(' ').join('_'), 
      width: jQuery(this).width() || 150 
     }); 
     colNames.push(jQuery(this).html()); 
    } 
}); 

Однако мой хак будет рассматривать эти изменения

function tableToGrid(selector, options) { 
... 
... 
// Build up the columnModel and the data 
if(options.hasOwnProperty("colModel") && options.hasOwnProperty("colNames")) { 
    var colModel = options.colModel; 
    var colNames = options.colNames; 
} else { 
    var colModel = []; 
    var colNames = []; 
    jQuery('th', jQuery(this)).each(function() { 
        if (colModel.length === 0 && selectable) { 
        colModel.push({ 
        name: '__selection__', 
        index: '__selection__', 
        width: 0, 
        hidden: true 
        }); 
        colNames.push('__selection__'); 
        } else { 
        colModel.push({ 
        name: jQuery(this).attr("id") || jQuery.trim(jQuery.jgrid.stripHtml(jQuery(this).html())).split(' ').join('_'), 
        index: jQuery(this).attr("id") || jQuery.trim(jQuery.jgrid.stripHtml(jQuery(this).html())).split(' ').join('_'), 
        width: jQuery(this).width() || 150 
        }); 
        colNames.push(jQuery(this).html()); 
        } 
    }); 
} 

Я просто хотел бы знать, если есть более простой способ (может быть, вариант, который я пропустил), который обеспечит такое поведение без необходимости корректировки исходного кода.

Причина, по которой я делаю это, заключается в том, чтобы принудительно установить параметр datefmt для некоторых полей, поскольку они игнорируются jQgrid, вызывая проблемы с функцией поиска. Если @Oleg может дать некоторое представление об этом, он будет высоко оценен.

Приветствия, Н.

+0

[Что вы имеете в виду именно с 'colModel' и' colNames' игнорируются?] (Http://jsfiddle.net/darkajax/4esFf/) – DarkAjax

+0

Они не учитываются при построении jqGrid из существующей таблицы HTML , – nawar

ответ

0

Я думаю, что главная ваша проблема в том, что вы используете tableToGrid вообще. Я задаю вопрос об общем использовании или архитектуре как технический вопрос.

Если у вас есть , набрав данные, такие как числа, даты, валюта и т. Д., Вы, вероятно, хотите, чтобы данные были правильно отсортированы, например, с помощью jqGrid. Разбор локализованных данных из таблицы HTML и неформатирование данных - это не лучший способ. Вы экономите свое время, если бы вы создали jqGrid напрямую. Вы должны указать входные данные в параметре data. В способе, которым данные будут легко и безопасно читать, сортироваться и выгружаться. Вы можете легко включить фильтрацию панели инструментов или расширенный поиск или другой поиск фильтрации. Все будет хорошей работой, только если вы предоставите jqGrid чистые данные.

Для получения дополнительной информации см. the answer.

+0

Спасибо @Oleg. Поэтому я считаю, что у меня есть два варианта: либо я должен извлечь данные из таблицы и передать их в параметр 'data', скажем в форме функции, которая читает таблицу' ', поэтому у меня есть свобода изменять форматирование заранее или второй вариант - игнорировать 'tableToGrid()' и просто использовать 'jQgrid' с информацией с другим' dataType', кроме 'local || clientide' как 'JSON', переносящий задачу форматирования данных на сервер, правильно ли я понял? – nawar

+0

@nawar: Даже если вы будете использовать 'datatype: 'json'', вам не следует форматировать данные на сервере. Вы должны отправлять чистые номера, даты на языке независимо ISO 8601 и так далее. Вы должны использовать либо [предопределенный] (http://www.trirand.com/jqgridwiki/doku.php?id=wiki:predefined_formatter#predefined_format_types), либо [настраиваемые форматы] (http://www.trirand.com/jqgridwiki/ doku.php? id = wiki: custom_formatter) и форматировать данные на стороне клиента. Я рекомендую использовать 'tableToGrid' только с чистыми текстовыми данными внутри или вообще не использовать его. – Oleg

+0

@nawar: код [tableToGrid] (https://github.com/tonytomov/jqGrid/blob/master/js/grid.tbltogrid.js) не очень сложный. Вы можете отладить его, чтобы увидеть все возможности, которые у вас есть. В практике он будет использоваться только людьми, которые начнут работать с jqGrid и попытаться сохранить существующую схему. Чем больше функций jqGrid вам понадобится, тем более ясным будет изменение ввода, который вы используете для * чистых данных *, либо как локальные данные JavaScript, либо данные, загруженные с сервера на Ajax. – Oleg

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