Я использую select2 в приложении Express, чтобы создать поле ввода, в котором пользователи могут выбирать предметы из списка, и могут обновлять этот список с помощью любых вновь добавленных опций . * 1005.*
С чем я борюсь, так это с тем, что select2
работает на стороне клиента, тогда как любые данные, которые я использую для заполнения моих тегов <option>
(к которым я хочу добавить новые опции), относятся к стороне сервера.
Я хочу, чтобы пользователи могли добавлять темы, которых нет в исходном списке, , чтобы будущие пользователи были представлены с новыми добавленными опциями (а также с оригинальными)
Вот варианты, которые я рассмотрел для достижения этой цели (повышения желательности):
- Добавление новых
<option>Subject</option>
html-тегов для каждого добавленного тега - Вставка новых теговв массив и заполнить
<option>
s из этого массива - Заполнить
<option>
из json
объекта и обновить этот объект при создании тега - Заполнить
<option>
из внешней базы данных (например, mongoose) и обновите ее при создании тега
Насколько я вижу, все эти опции требуют, чтобы мой клиентский код (select2-js
) общался с серверным кодом (где мой массив, .json
файл или mongoose
схема были бы) и Я понятия не имею, как это сделать .
В моем текущем подходе я пытаюсь указать "локальный" json
файл в качестве источника данных при моем вызове select2
( см. Здесь ).Однако это не заполняет базу данных какими-либо опциями, так что это не работает, как я ожидал.
Затем я проверяю, существует ли каждый новый тег в массиве (dataBase
), и добавляю его в базу данных, если нет:
// Data to seed initial tags:
var dataBase = [
{ id: 0, text: 'Maths'},
{ id: 1, text: 'English'},
{ id: 2, text: 'Biology'},
{ id: 3, text: 'Chemistry'},
{ id: 4, text: 'Geography'}
];
$(document).ready(function() {
$('.select2-container').select2({
ajax: {
url: '../../subjects.json',
dataType: 'json',
},
width: 'style',
multiple: true,
tags: true,
createTag: function (tag) {
var isNew = false;
tag.term = tag.term.toLowerCase();
console.log(tag.term);
if(!search(tag.term, dataBase)){
if(confirm("Are you sure you want to add this tag:" + tag.term)){
dataBase.push({id:dataBase.length+1, text: tag.term});
isNew = true;
}
}
return {
id: tag.term,
text: tag.term,
isNew : isNew
};
},
tokenSeparators: [',', '.']
})
});
// Is tag in database?
function search(nameKey, myArray){
for (var i=0; i < myArray.length; i++) {
if (myArray[i].text.toLowerCase() === nameKey.toLowerCase()) {
return true
}
}
return false
};
Однако этот подход добавляет новые тегив массив, который уничтожается при обновлении страницы, и новые теги не сохраняются.
Как я могу изменить это для загрузки данных на стороне сервера (json
, mongoose
документ или что-то ещееще, что считается наилучшей практикой), и обновить эти данные с помощью новых добавленных параметров (которые проходят мои тесты)?