select2 运行在客户端,而我要使用来自服务器端的数据作为我的 <option> 标签的种子数据(我想将新的选项附加到这些标签上)。我希望用户能够添加原始列表中不存在的主题,以便将来的用户将展示新添加的选项(以及原始的选项)。我考虑了以下几个选项(按优先级递增):
- 对于每个添加的标签,添加一个新的 <option>Subject</option> HTML 标签。
- 将新标签添加到数组中,并从该数组生成 <option> 标签。
- 从 JSON 对象中生成 <option> 标签,并在标签创建时更新此对象。
- 从外部数据库(例如 mongoose)生成 <option> 标签,并在标签创建时更新此数据库。
就我所看到的,所有这些选项都需要我的客户端代码(select2-js)与服务器端代码交互(其中我的数组、.json 文件或 mongoose schema 存在)。但是我不知道如何去做。目前的方法是在我的 select2 调用中指定一个“本地”json 文件作为数据来源(参见这里),然后检查每个新标签是否存在于数组中(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 文档或其他被认为是最佳实践的内容),并使用新添加的选项(通过我的测试)来更新这些数据?