У меня есть страница, где пользователь сначала видит большой список элементов, а затем нажимает кнопку, чтобы заменить список деталями для одного элемента. (То есть выберите элемент для редактирования, а затем отредактируйте этот элемент.) В деталях у меня есть несколько применений элемента управления Bootstrap multiselect. В одном случае мне нужно перестроить список элементов в элементе управления на пути к детализации (поскольку пользователь мог добавить элемент в этот список при редактировании предыдущего элемента детализации).
Внутри вызова Ajax для получения и отображения подробной информации у меня есть этот код:
$('#topic').multiselect('deselectAll',false);
updateListOfTopics();
$('#topic').multiselect('select', obj.TopicDesc);
$('#topic').multiselect('refresh');
Вот код для функции updateListOfTopics:
function updateListOfTopics(){
var fnargs = "GetTopics|''";
$.ajax({
url: 'retrievedata.php',
type: "POST",
async:true,
data: {"functionname":"gettopics", "arguments":fnargs},
dataType: "JSON",
success: function (obj) {
var topicList = $('#topic');
topicList.empty();
for (line=0;line<obj.length;line++) {
topicList.append($("<option></option>").attr("value", obj[line].Description).attr("id", obj[line].iID).text(obj[line].Description));
}
topicList.multiselect('rebuild');
},
error: function(xhr, textStatus, errorThrown) {
success = false;
console.log(xhr);
alert("Unable to get list of issues.");
}
});
}
Когда я устанавливаю точку останова и шаг за шагом, я вижу, что элемент управления имеет правильное значение после вызова множественного выбора («обновить») и фактически имеет правильное значение в конце всего вызова Ajax, который включает в себя первый блок кода. Однако раскрывающийся список теряет свое значение до того, как пользователь получает контроль.
Если я закомментирую вызов updateListofTopics, он будет работать как нужно, за исключением, конечно, что данные в раскрывающемся списке не обновляются.
Я подозреваю, что есть тонкость Ajax, которую я пропускаю, в том, что один Ajax-вызов делает другой Ajax-вызов.