javascript — Multiselect отменяет выбор последнего элемента после каждой отправки

Multiselect уменьшается после каждого $_POST отправить, но возвращаются все индексы ответа ajax. В этой форме у меня есть событие, которое вызывает изменение в Empresa который загружает все остальные поля и отмечает опции, которые есть в сеансе php, возвращенном ajax.

После каждой отправки у меня есть все элементы сеанса, но всегда последний элемент в каждом поле отменяется.

// This code triggers an action in Empresa ...
$(function($) {$('.dropdown-toggle').dropdown('toggle');});

$.ajax({
url: '/ajaxrequests/requestservicos',
type: 'POST', dataType: 'json',
data: {empresas:empresas},
success: function(retorno){
var servs = retorno.servicos; // [10, 12, 14, 20, 21, 23, 25, 29, 32, 33, 38]
var checks = retorno.check; // [10, 12, 14, 20, 21, 23, 25]
console.log(retorno);
$('#ajax_servico').html("");
$.each(servs, function(valor, chave){
$('#ajax_servico').append($('<option>', {
value: valor,
text : chave,
checked: checks[valor],
selected: checks[valor]
}));
});
$("#ajax_servico").multiselect('destroy');
MultiselectSet($("#ajax_servico"));
}
});

function MultiselectSet(input){
$(input).multiselect({
includeSelectAllOption: true,
nSelectedText: 'selecionados ..',
nonSelectedText:'Nenhum selecionado ..',
allSelectedText: 'Todos selecionados ..',
selectAllText: 'Selecionar todos ..',
numberDisplayed: 1,
});
}

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

0

Решение

Не уверен, что вы хотите сделать здесь, но если вы хотите, чтобы все элементы в серво, которые находятся в проверках, были выбраны, вы можете попробовать это:

$.ajax({
url: '/ajaxrequests/requestservicos',
type: 'POST', dataType: 'json',
data: {empresas:empresas},
})
.then(
function(retorno){
const servs = retorno.servicos, // [10, 12, 14, 20, 21, 23, 25, 29, 32, 33, 38]
checks = retorno.check, // [10, 12, 14, 20, 21, 23, 25]
$servico = $('#ajax_servico');
console.log(retorno);
$servico.html("");
servs.forEach(function(chave,index){
const isInChecks = checks.indexOf(chave)!==-1;
$servico.append($('<option>', {
value: index,
text : chave,
checked: isInChecks,
selected: isInChecks
}));
});
$("#ajax_servico").multiselect('destroy');
MultiselectSet($("#ajax_servico"));
}
,function(reject){console.error("something went wrong:",reject)}
);

Я не уверен, почему вы должны установить значение параметра в индекс массива, не лучше ли установить его в качестве идентификатора элемента в базе данных? Вы устанавливаете текст опции в число, это идентификатор? Если это так, вы, вероятно, должны установить значение идентификатора, а текст — текстовое значение, которое представляет этот идентификатор в базе данных.

1

Другие решения

Других решений пока нет …