Использование начальной загрузки 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), это выглядит хорошо, но не может работать правильно:
- значение не может быть отправлено на сервер.
- выберите одну строку -> изменить, но 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. Я хочу, чтобы мой ответ помог другим людям