Как вернуть выбранные опции как объект из buildSelect
В соответствии с
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:search_config
Значение свойства может быть объектом:
If set as object it should be defined as pair value:name - editoptions:{value:{1:'One',2:'Two'}}
Json API возвращает объект JSON
{"total":2,"page":1,"rows":[
{"Id":"L-10020","Liik":"10020","Artlnimi":"C vesinikud","Grupp":"L"},
{"Id":"L-10072","Liik":"10072","Artlnimi":"C D-Perm","Grupp":"L"}
... ] }
Значения Artlnimi свойства должны использоваться в качестве выбора параметров в поиске. Я пытался использовать его для создания списка выбора, используя бесплатный jqgrid 4.13.6
$grid.jqGrid('setColProp', 'Artliik_artlnimi', {
searchoptions : {
dataUrl: 'API/ArtliikL',
buildSelect: function(response){
var tulem={ '':'All' }, res=JSON.parse(response);
$.each(res.rows, function(i, item) {
tulem[item.Artlnimi]=item.Artlnimi;
}
);
return tulem;
},
sopt: ['eq']
},
stype:"select"
});
После этой ошибки
Uncaught TypeError: Cannot read property 'multiple' of undefined
at Object.success (jquery.jqgrid.src.js:9680)
at fire (jquery-1.12.4.js:3232)
at Object.fireWith [as resolveWith] (jquery-1.12.4.js:3362)
at done (jquery-1.12.4.js:9840)
at XMLHttpRequest.callback (jquery-1.12.4.js:10311)
происходит в свободном исходном коде jqgrid 4.13.6 в строке 9680, которая содержит:
if ($select[0].multiple && $select.find("option[selected]").length === 0 && $select[0].selectedIndex !== -1) {
Как это исправить, чтобы элемент поиска отображал данные из объекта, возвращенного из buildSelect. Ifbild select возвращает строку, содержащую элемент select html, это работает.
1 ответ
URL dataUrl
должен вернуть HTML-фрагмент с <select>
и все варианты. Обратный звонок buildSelect
позволяет использовать dataUrl
, который возвращает информацию о параметрах в любом другом формате, но buildSelect
должны скрыть ответ dataUrl
в <select>
и все варианты. Вы можете найти следующее описание buildSelect
обратный вызов в старой документации editoptions.buildSelect
:
Эта опция актуальна, только если задан параметр dataUrl. Когда ответ сервера не может построить элемент выбора, вы можете использовать свою собственную функцию для создания выбора. Функция должна возвращать строку, содержащую значение (я) select и options, как описано в параметре dataUrl. Параметр, переданный этой функции, является ответом сервера.
Документация searchoptions.buildSelect
(см. здесь) предоставляет практически ту же информацию.
Другими словами, вы пытаетесь использовать buildSelect
неправильно Строка, которая возвращает buildSelect
должен содержать фрагмент HTML <select>
а не как объект. В качестве альтернативы бесплатный jqGrid позволяет buildSelect
возвращает элемент DOM <select>
со всеми опциями детей или jQuery-оберткой <select>
Вы можете исправить свой код на что-то вроде
buildSelect: function (response) {
var tulem = "<select><option value=''>All</option>";
$.each(JSON.parse(response).rows, function (i, item) {
var v = item.Artlnimi;
// the simplified form of the next statement would be
// tulem += "<option value='" + v + "'>" + v + "</option>";
// but one have to encode/escape the text in more common case.
tulem += "<option value='" +
String(v).replace(/\'/g, "'") + "'>" +
$.jgrid.htmlEncode(v) + "</option>";
});
return tulem + "</select>";
}
или как
buildSelect: function (response) {
var $tulem = $("<select><option value=''>All</option></select>");
$.each(JSON.parse(response).rows, function (i, item) {
$("<option></option>", { value: item.Artlnimi })
.text(item.Artlnimi)
.appendTo($tulem);
});
return $tulem;
}