У меня есть следующее:
class Department {
constructor(data) {
this.id = data && data.id || null
this._name = data && data.name || null
}
get name() {
return this._name
}
set name(v) {
this._name = (v || "").trim() || null
}
}
// In a different module:
import Department from "./Department"
async function searchDepartments(request, response) {
let departments = []
let result = await getDepartmentsFromServer(request.term)
result.data.map((d) => {
departments.push(new Department(d))
})
response(departments)
}
$("#myAutocomplete").autocomplete({
minLength: 1,
delay: 500,
source: searchDepartments,
select: function (e, ui) {
e.preventDefault()
$(this).val(ui.item.name) // ui.item.name is undefined; why?
},
})
.each(function () {
$(this).autocomplete("instance")._renderItem = function (ul, item) {
let itemTemplate = "<div>" + item.name + "</div>" // item.name is undefined; why?
return $("<li>")
.append(itemTemplate)
.appendTo(ul)
}
})
Проблема в том, что автозаполнение внутренне использует различные объекты элементов;не оригинальные, снабженные ответом (отделы).Я обнаружил следующий код в источнике автозаполнения jquery:
// At line 2527
__response: function( content ) {
if ( content ) {
content = this._normalize( content );
}
...
},
...
// At line 2566
_normalize: function( items ) {
// assume all items have the right format when the first item is complete
if ( items.length && items[ 0 ].label && items[ 0 ].value ) {
return items;
}
return $.map( items, function( item ) {
if ( typeof item === "string" ) {
return {
label: item,
value: item
};
}
return $.extend( {}, item, {
label: item.label || item.value,
value: item.value || item.label
} );
} );
},
Похоже, что при $ .extend средства получения / установки моего объекта отдела теряются.Любые предложения по решению проблемы?
PS: Конечно, в этом случае я могу использовать item._name, но мне нужен более общий подход.