Использование начальной загрузки select2 с формой JqGrid

Я пытаюсь реализовать bootstrap select2 с формой jqgrid, но может показаться, что это правильно.

на colmodel декларации jqgrid у меня есть:

 {name: 'staff', index: 'staff', width: 31, formoptions: {elmprefix: '(*) '}, editable: true, editrules: {required: true}, edittype: 'select',
                    editoptions: {value: staff,
                        dataInit: function(element) {
                            $(element).width(260).select2();
                        }
                    }
                },

Варианты есть, и классы начальной загрузки вставляются в элемент,

 <select id="staff" class="select2-offscreen FormElement" role="select"

но все, что я получаю, это пустое место для избранных.

Смотрите изображение ниже.

Может кто-нибудь сказать мне, почему это происходит, или сказать, что я делаю неправильно?

Благодарю.

2 ответа

Решение

Я не знал плагин select2 раньше. Я попробовал это и не нашел никаких проблем. Я предполагаю, что у вас есть проблемы с шириной только потому, что используется слишком большой параметр width функция в $(element).width(260).select2();,

Демоверсии: одна без Bootstrap, а другая с Bootstrap 3.0.0 работает без проблем. Выбор выглядит как на картинке ниже

введите описание изображения здесь

Я использовал в демо

formatter: "select", edittype: "select",
editoptions: {
    value: "FE:FedEx;TN:TNT;IN:Intim",
    defaultValue: "Intime",
    dataInit: function(element) {
        $(element).width(122).select2({
            // add "ui-widget" class to have the same font-family like in
            //     jQuery UI Theme
            // add "ui-jqdialog" class to have font-size:11px like in other
            //     items of jqGrid form
            dropdownCssClass: "ui-widget ui-jqdialog"
        });
    }
},
stype: "select",
searchoptions: {
    value: "FE:FedEx;TN:TNT;IN:Intim",
    defaultValue: "Intime",
    dataInit: function(element) {
        $(element).width(122).select2({
            // add "ui-widget" class to have the same font-family like in
            //     jQuery UI Theme
            // add "ui-jqdialog" class to have font-size:11px like in other
            //     items of jqGrid form
            dropdownCssClass: "ui-widget ui-jqdialog"
        });
    }
}

и добавил следующий CSS для улучшения видимости (на мой личный вкус)

.ui-jqdialog .select2-container .select2-choice {
    height: auto;
    padding-top: 1px;
    padding-left: 0.2em;
    padding-bottom: 2px;
    line-height: 15px;
}
.ui-jqdialog .select2-container .select2-choice .select2-arrow b {
    background-position: 0 -4px;
}
.ui-jqdialog.select2-drop { padding: 0px; }
.ui-jqdialog .select2-results .select2-result-label {
    padding: 2px;
}

Кроме того, я добавил еще несколько CSS в демо, которое использовало Bootstrap CSS:

.ui-jqgrid table {border-collapse: separate}
.ui-jqgrid .ui-pg-input, .ui-jqgrid .ui-pg-selbox {height: 17px}
.ui-jqgrid .ui-pg-table {padding-bottom: 0}

Я пытаюсь использовать select2 в dataInit работать напрямую, как вы (различие в том, что я использую источник данных ajax), это выглядит хорошо, но не может работать правильно:

  1. значение не может быть отправлено на сервер.
  2. выберите одну строку -> изменить, но select2 не инициализировать со старым значением.

Наконец-то я отказался от этого метода и попробую использовать edittype:'custom'

colModel:[
    {name:'model_id',label:'mID',
        hidden: true,
        hidedlg: true, // the hidden model_id column 
        search: false, // used for offer id info to select2
    },
    {name:'model',label:'model',width:150,
        editable:true,
        edittype:'custom',
        editoptions:{
          custom_element: myselect2elem,
          custom_value: myselect2value,
          dataInit: myselect2init('180','chose model','search/servermodel','model_id','model'),
        },
        editrules:{
          edithidden: true,
          required: true,
        },
},

Я определил три функции:

  • myselect2elem (value, options) // инициализировать общий элемент
  • myselect2value(elem, operation, value) // get|set value of element
  • myselect2init (width, holder, url, opt, cel_name_id, cel_name) // элемент init использует select2

подробности

function myselect2elem(value, options) {
    var el = document.createElement("select");
    el.value = value;
    return el;
}

function myselect2value(elem, operation, value) {
      if(operation === 'get') {
        return $(elem).val();
      } else if(operation === 'set') { // this doesn't work,
        $(elem).value=value;  // I don't know whether have side effect
      }
}

function myselect2init(width,holder,url,cel_name_id,cel_name){
    var option = {
        width: width,
        placeholder: holder,
        ajax: {
            url: url,
            /*
            the other ajax configuration option that only selet2 used
            */
        },
    }
    return function(element) {
      $(element).children(".customelement").select2(option)
      // do the init 'set' operation that previous function should do
      selRowId = $(this).jqGrid ('getGridParam', 'selrow'),
      celId = $(this).jqGrid ('getCell', selRowId, cel_name_id);
      celValue = $(this).jqGrid ('getCell', selRowId, cel_name);
      if (celValue){
        var newOption = new Option(celValue, celId, true, true);
        $(element).children(".customelement").append(newOption).trigger('change');
      }
    }
  }

Спасибо за ваш вопрос по этому поводу, спасибо ответ @Oleg. Я хочу, чтобы мой ответ помог другим людям

Другие вопросы по тегам