jqGrid, как заполнить список выбора из запроса

У меня есть базовый jqGrid, работающий в моем проекте coldfusion. Одно из моих полей в jqGrid — поле со списком. В настоящее время значения editoption жестко закодированы, как показано ниже.

colModel :
[
  {
   name:'seqnum',index:'seqnum', width:100,resizable:true,   
   align:"left",sorttype:"text",editable:true,edittype:"select",editoptions:   
   { value:"1:one;2:two"},editrules:{required:true}
  }
]

Я пытаюсь найти способ заполнить раскрывающийся список из запроса/URL.

Любая помощь будет принята с благодарностью.

заранее спасибо


person user103819    schedule 08.05.2009    source источник


Ответы (7)


Создайте функцию, которая использует json для запроса URL-адреса. Эта функция должна возвращать строку в формате «1:один;2:два».

Например:

    colModel :
    [
      {
       name:'seqnum',index:'seqnum', width:100,resizable:true,   
       align:"left",sorttype:"text",editable:true,edittype:"select",editoptions:
       { value:getSequenceNumbers()},editrules:{required:true}
      }
    ]

    function getSequenceNumbers(){
        $.getJSON("yourUrl", null, function(data) {
            if (data != null) {
                 //construct string.  
                 //(or the server could return a string directly)
            }
        });
    }

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

person sanbornc    schedule 18.05.2009

Ответ $.getJSON/getSequenceNumbers() не работает в представленном виде. Невозможно вернуть данные из обратного вызова в качестве возвращаемого значения для getSequenceNumbers(), поскольку обратный вызов является асинхронным. Вам нужно либо использовать метод dataURL, предложенный Мартином, либо настроить jqGrid внутри обратного вызова $.getJSON.

$(document).ready(function() {
 $.getJSON("GetURL", function(data) {
  setupGrid(data);
 });
});

function setupGrid(data) {
...
    colModel :
    [
      {
       name:'seqnum',index:'seqnum', width:100,resizable:true,   
       align:"left",sorttype:"text",editable:true,edittype:"select",editoptions:
       { value:data},editrules:{required:true}
      }
    ]

...
}
person JT.    schedule 26.04.2010

Используйте dataUrl... (см. вики здесь).

В настоящее время dataUrl генерирует GET, но если кто-то извлекает код из Github, GET может быть изменен на POST без видимых побочных эффектов.

person Martin    schedule 18.09.2009
comment
Этот вид работает, но только если вы не хотите декодировать первое значение, отображаемое как ajax, чтобы получить список, срабатывает только при редактировании ячейки, поэтому форматирование: «выбрать» несовместимо с этим. - person Cruachan; 27.07.2011
comment
Можно ли передать какие-то параметры в dataUrl-метод? В качестве параметра я хотел бы отправить некоторые значения из выбранной строки ($('#grid').getRowData(id)['colName']) - person Anatoliy; 22.08.2012

Стоит отметить, что вы можете полностью обойти эту проблему, если используете язык сценариев на стороне сервера. Например, с PHP вы можете использовать

{name:'myselectdata', index:'myselectdata', width:160, formatter:'select', editable:true, edittype:"select", cellsubmit:"clientArray", editoptions:{ <? echo getData() ?>}  },

Затем просто настройте функцию PHP getData() дальше по странице, чтобы вернуть подходящую строку, например

'value:"1:one;2:two"';

Может быть, не так элегантно или портативно, как обработка всего в jQuery, но я думаю, что концептуально проще.

person Cruachan    schedule 27.07.2011
comment
правильный формат данных будет {value:{1:'One',2:'Two'}} } в соответствии с этим trirand.com/jqgridwiki/doku.php?id=wiki:common_rules - person buzibuzi; 25.09.2013

Предположим, что в вашей ColModel у вас есть такой столбец:

{name:'id_UDM', index:'id_UDM', width:150, editable:true, edittype:"select", editoptions:{dataUrl:'filename.php'}}

Сначала вы должны объявить, что это элемент select следующим образом:

edittype:"select"

Затем в параметре editoptions добавьте dataUrl следующим образом:

editoptions:{dataUrl:'filename.php'}

Filename.php должен возвращать элемент "select" с его параметрами, вот пример:

<?php
    include("connectionToMyDatabase.php");
    $query1 = "SELECT * FROM table WHERE 
    $result1 = mysql_query($query1);
    $response ='<select>';
    while($row = mysql_fetch_array($result1)) {
         $response .= '<option value="'.$row['value'].'">'.$row['name'].'</option>';
    }
    $response .= '</select>';

    echo $response;

 mysql_close($db);  
?>

Надеюсь это поможет.

person Pepe Ramirez    schedule 10.10.2012

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

colModel:[
    //class_id
    $.extend(true,
    {
        name:'class_id'
        ,index:'class_id'
        ,edittype:'select'
        ,formatter:'select'
        ,editoptions: { dataUrl:"db.php?ajaxOp=getClassesOptions" } //to send dynamic parameter, combine with ajaxSelectOptions
    }
    ,{}
    )

Обратите внимание, что строка dataUrl ЯВЛЯЕТСЯ статической, это означает, что вы не можете отправлять разные параметры каждый раз, когда происходит добавление/редактирование. Код ниже НЕ РАБОТАЕТ!

,editoptions: { dataUrl:"db.php?ajaxOp=getClassesOptions" + "&id="+selected_id } 

Чтобы отправить такие параметры, как id, вы можете использовать ajaxSelectOptions.

ajaxSelectOptions:      //use this for combination with dataUrl for formatter:select
{       
    data: {
      id: function () {
          return selected_id;
      }
    }
},     

Функция, которая возвращает selected_id, будет выполняться каждый раз, когда происходит добавление/редактирование. Надеюсь это поможет !

person Hendry H.    schedule 28.11.2012

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

 $response ='<select>';
 $response .= '<option value=""></option>';
 while($row = $stmt->fetch(PDO::FETCH_NUM)) {
      $response .= '<option value="'.$row[0].'">'.$row[0].'</option>';
 }
 $response .= '</select>';

 echo $response;
person Jeff Bluemel    schedule 08.09.2014