Как предварительно заполнить элементы в TomSelect, когда параметры поступают удаленно (вызов API)

У меня есть 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.

Я бы хотел, чтобы оно было пустым до тех пор, пока не будет выполнен вызов выборки.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
106
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел решение.

Мне просто нужно было добавить опцию persist:false.

Как определено в официальной документации TomSelect:

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

Теперь я могу предварительно заполнить items[] и удалить их правильно, не загрязняя раскрывающийся список.

Другие вопросы по теме