У меня есть PHP-приложение с раскрывающимся списком TomSelect, которое позволяет мне выбирать людей, которые работают на сайте.
Поскольку этот список большой, я заполняю эти параметры стандартным fetch
звонком.
Вот мой пример кода (который работает):
<select id = "persons" placeholder = "Pick an person..." multiple></select>
<script>
var persons = new TomSelect("#persons", {
maxOptions: 10,
create: false,
onItemAdd: function () {
this.setTextboxValue('');
this.refreshOptions();
},
valueField: 'id',
labelField: 'completename',
searchField: 'completename',
items: [34276,2],
// fetch remote data
load: function(query, callback) {
var url = 'http://host/api/staff?q=' + encodeURIComponent(query);
fetch(url)
.then((response) => response.json())
.then(json => {
callback(json);
}).catch(()=>{
callback();
});
},
// custom rendering functions for options and items
render: {
option: function (data, escape) {
return '<div class = "d-flex"><span>' + escape(data.completename) + '</span></div>';
},
item: function (data, escape) {
return '<span class = "tag is-info mb-1 mr-1">' + escape(data.completename) + '</span>';
}
}
});
</script>
Все правильно сохраняется в базе данных через PHP при публикации формы.
Мой вопрос касается редактирования сайта (когда я возвращаюсь к редактированию людей, назначенных на сайт).
Как я могу предварительно выбрать/заполнить уже назначенных людей (34276
и 2
в образце) и правильно разместить их в исходных вариантах. Я пробовал использовать исходный массив items[]
, но этот массив принимает только идентификаторы selectedValues
, но, очевидно, не полные имена людей.
Очевидно, у меня есть объекты PHP, такие как $site->getPersons()
, по которым я могу получить идентификаторы и полные имена.
Если я сделаю это с помощью addOption
и addItem
после этого (или если я добавлю назначенных людей в HTML с помощью <option value = "1" selected = "selected">Roberta</option>
), это сработает, но поведение будет ужасным, потому что эти предварительно назначенные люди постоянно останутся в начале раскрывающегося списка, даже когда я отмените их выбор, и пока вызов API выборки пуст. Как показано на картинке.
persons.addOption({
id: 4,
completename: 'Something New',
});
persons.addOption({
id: 2,
completename: 'Hans',
});
persons.addOption({
id: 1,
completename: 'Roberta',
});
persons.addItem(1);
persons.addItem(4);
persons.addItem(2);
Другой более короткий способ задать мой вопрос:
Как предотвратить открытие раскрывающегося списка TomSelect (предназначенного для получения параметров через удаленную выборку) с уже видимыми «статическими» параметрами, добавленными через addOption.
Я бы хотел, чтобы оно было пустым до тех пор, пока не будет выполнен вызов выборки.
Я нашел решение.
Мне просто нужно было добавить опцию persist:false
.
Как определено в официальной документации TomSelect:
persist: Если установлено значение false, элементы, созданные пользователем, не будут отображаться как доступные параметры, если они не выбраны.
Теперь я могу предварительно заполнить items[]
и удалить их правильно, не загрязняя раскрывающийся список.