2017-02-11 5 views
1

Я попытался использовать форматировщик jqGrid: «действия» для удаленного json-url, но он сдвигает строки, потому что количество имен столбцов и фактических возвращенных данных не совпадает (столбец действия является дополнительным в именах столбцов). Я выполнял поиск в Интернете и выглядел так, как все примеры для локальных данных (на странице), где json используется как ключ/значение, а url: somepage.php возвращает тип столбцов csv типа (без ключей, только значения) , Также я использую id как скрытое поле, а все примеры показывают id. Я использую еще одну скрытую колонку. вот мой colmodel:jqGrid: formatter: «действия» не работают для удаленного json url

url: "manager_json", 
       editurl: "manager_edit", 
       datatype: "json", 
       //data: mydata, 
       width:1000, 
       //jsonReader: { 
       //    repeatitems : false, 
       //   }, 
       colNames: ["","Id","Uid","Custom Id","Image Name","Coord. X","Coord. Y","Gender","Progress","Status","Created","Updated"], 
       colModel: [{"name":"act","template":"actions","formatoptions":{"editformbutton":true}},{"name":"id","align":"center","width":33,"editable":false,"hidden":true},{"name":"uid","align":"center","width":33,"editable":true,"hidden":true,"editrules":{"edithidden":false,"required":false}},{"name":"ta_id","align":"center","width":100,"editrules":{"required":true}},{"name":"image","width":150,"template":"text","editrules":{"required":true}},{"name":"x","width":100,"align":"center","template":"integer","editrules":{"required":true}},{"name":"y","width":100,"align":"center","template":"integer","editrules":{"required":true}},{"name":"gender","width":100,"align":"center","formatter":"select","stype":"select","editrules":{"required":true},"edittype":"select","editoptions":{"value":"f:Female;m:Male","defaultValue":"m"},"searchoptions":{"sopt":["eq","ne"],"value":":Any;f:Female;m:Male"}},{"name":"progress","width":120,"align":"center","formatter":"select","stype":"select","editrules":{"required":true},"editable":false,"edittype":"select","editoptions":{"value":"-:New;pf:Process Failed;ps:Process Scheduled;pss:Process Success;p:Processing...;s:Staging;tf:Test Failed;ts:Test Scheduled;tss:Test Success;t:Testing...","defaultValue":"m"},"searchoptions":{"sopt":["eq","ne"],"value":":Any;-:New;pf:Process Failed;ps:Process Scheduled;pss:Process Success;p:Processing...;s:Staging;tf:Test Failed;ts:Test Scheduled;tss:Test Success;t:Testing..."}},{"name":"status","width":100,"align":"center","formatter":"select","stype":"select","edittype":"select","editoptions":{"value":"a:Active;n:New","defaultValue":"m"},"searchoptions":{"sopt":["eq","ne"],"value":":Any;a:Active;n:New"}},{"name":"date_created","width":150,"template":"text","editable":false},{"name":"last_updated","width":150,"template":"text","editable":false}] 

А вот мои фактические данные с моего сервера (БД) по спецификации jqgrid:

{"page":1,"total":1,"records":7,"rows":[{"id":32,"cell":[32,"889daf31ff3e49544f52850258439600","2uu","2ok",2,2,"m","-","a","2017-02-10 18:57:05","2017-02-10 23:37:12"]},{"id":30,"cell":[30,"","11","11",1,1,"m","-","a","2017-02-10 18:01:52","2017-02-10 18:01:52"]},{"id":29,"cell":[29,"aaa","ww222111uu","11",1,1,"m","-","a","2017-02-10 18:00:36","2017-02-10 23:37:08"]},{"id":27,"cell":[27,"","11","1",1,1,"m","-","a","2017-02-10 17:57:41","2017-02-10 17:57:41"]},{"id":25,"cell":[25,"","4tt","4img",4,4,"f","-","n","2017-02-10 17:50:21","2017-02-11 00:26:03"]},{"id":24,"cell":[24,"","1","1",1,1,"m","-","a","2017-02-10 17:49:38","2017-02-10 17:49:38"]},{"id":22,"cell":[22,"","bbb","imam 222",2,22,"f","p","n","2017-02-08 20:14:55","2017-02-10 13:27:57"]}]} 

Как вы можете видеть ячейки строка имеет меньше столбцов, чем colNames и colModel , Также скрыты id и uid. Я добавил на дополнительной колонке поддельной из БД, но это не помогло

я использую jqGrid 4.13.7-предварительно

ответ

1

Я бы рекомендовал вам возвращать объекты, как

{ 
    "id": 32, 
    "uid": "889daf31ff3e49544f52850258439600", 
    "ta_id": "2uu", 
    "image": "2ok", 
    "x": 2, 
    "y": 2, 
    "gender": "m", 
    "progress": "-", 
    "status": "a", 
    "date_created": "2017-02-10 18:57:05", 
    "last_updated": "2017-02-10 23:37:12" 
} 

вместо

{ 
    "id": 32, 
    "cell": [ 
     32, "889daf31ff3e49544f52850258439600", "2uu", "2ok", 2, 2, "m", "-", "a", 
     "2017-02-10 18:57:05", "2017-02-10 23:37:12" 
    ] 
} 

как ответ сервера. Это упростит ваш код.

Если вам нужно обработать текущий формат данных, то вам придется заставить режим repeatitems: false путем использования опции

jsonReader: { 
    repeatitems: false 
} 

и использовать jsonmap свойства colModel сообщить jqGrid, из которого элемента элемент должен прочитать данные столбца. jsonmap может быть либо в виде строки, как

jsonmap: "cell.1" 

или в виде функции:

jsonmap: function (item) { 
    return item.cell[1]; 
} 

Чтобы сделать код более ремонтопригодны вы можете определить объект как

var columnOrder = { 
     id: 0, 
     uid: 1, 
     ta_id: 2, 
     image: 3, 
     x: 4, 
     y: 5, 
     gender: 6, 
     progress: 7, 
     status: 8, 
     date_created: 9, 
     last_updated: 10 
    }; 

который предоставляет индекс в массиве cell по имени столбца и использовать jsonmap, как

jsonmap: function (item) { 
    return item.cell[columnOrder.uid]; 
} 

Демонстрация https://jsfiddle.net/OlegKi/ozzgnaeh/2/ демонстрирует подход.

+0

Причина: Я собирался использовать формат массива (не формат словаря), потому что я ожидал иметь около 5000 строк на странице и, следовательно, чтобы минимизировать время и размер загрузки. Предлагаемый формат данных помог. Работает сейчас. Спасибо, Олег. – LSP

+0

@LSP: Добро пожаловать! Вы должны ["принять"] (http://meta.stackexchange.com/a/5235/147495) ответ, если он решает вашу проблему. Я бы рекомендовал вам использовать размер страницы, соответствующий количеству строк, которые могут отображаться на мониторе, например, 'rowNum: 25' или' rowNum: 20'. Использование 'rowNum: 5000' делает страницу намного медленнее и не имеет преимущества для пользователя. Попробуйте [demo] (http://www.ok-soft-gmbh.com/jqGrid/OK/performane-15-60000-25-free-jqgrid.htm) с 60000 строк и 10 строк на страницу.Это быстрее, чем 1000 строк со всеми 1000 строк на странице. – Oleg

+0

Я не вижу ни одной кнопки, которая говорит: «Примите этот ответ» ... где это? – LSP

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