I have a kendoDropdownList that has virtualization. The list is created from a flat array such as ["a", "b", "c", "d"]. When I click on a value the list closes but it is not selected. Can you help? Here is my code.
var attributeValues = {
age: ["1", "2", "3", "4", "5"],
name: ["John", "Jenny", "Suzie", "Lee", "Robert"]
};
createDropdownLists("name", "#myList");
var
shouldPreventOpen = [];
var
menuIsOpen = [];
function
createDropdownLists(key, selector) {
shouldPreventOpen = [];
let values = attributeValues[key];
if
(values.length < 1) {
$(selector).prop(
"disabled"
,
true
);
}
else
{
$(selector).prop(
"disabled"
,
false
);
}
$.each($(selector),
function
(index, element) {
let value = $(element).val();
let valueIndex = values.findIndex((element) => element.toString() === value);
$(element).kendoDropDownList({
height: 300,
optionLabel:
"Select Value"
,
filter:
"contains"
,
//filterFields: ["itemName", "itemID"],
template:
"<div title='#: data #'><span class='listItemName' >#: data #</span></div>"
,
//valueTemplate: "#: data #",
virtual: {
itemHeight: 44,
valueMapper:
function
(options) {
console.log(options, valueIndex);
options.success([!isNaN(valueIndex) ? valueIndex : -1]);
}
},
dataSource: values,
value: value,
open: onOpen,
close: onClose
});
let id = $(element).attr(
"id"
);
shouldPreventOpen[id] =
false
;
menuIsOpen[id] =
false
;
let list = $(element).getKendoDropDownList();
list.wrapper.on(
"focus"
,
function
(e) {
let id = $(e.currentTarget).find(
".js-k-item-dropdown"
).attr(
"id"
);
if
(shouldPreventOpen[id] && menuIsOpen[id]) {
list.close();
shouldPreventOpen[id] =
false
;
}
else
{
list.open();
}
});
});
$(
".k-list-container"
).on(
"click"
,
".k-list-optionlabel, li"
,
function
(e) {
let clickedId = $(e.currentTarget).closest(
".k-list-container"
).attr(
"id"
);
clickedId = clickedId.substring(0, clickedId.indexOf(
"-"
));
let list = $(`
#${clickedId}`).getKendoDropDownList();
list.close();
});
}
function
onOpen(e) {
let id = $(e.sender.element).attr(
"id"
);
if
(shouldPreventOpen[id] && menuIsOpen[id]) {
shouldPreventOpen[id] =
false
;
e.preventDefault();
}
else
{
shouldPreventOpen[id] =
true
;
menuIsOpen[id] =
true
;
}
}
function
onClose(e) {
let id = $(e.sender.element).attr(
"id"
);
if
(shouldPreventOpen[id] && menuIsOpen[id]) {
e.preventDefault();
}
menuIsOpen[id] =
false
;
$.each(shouldPreventOpen,
function
(element, index) {
shouldPreventOpen[index] =
false
;
});
}