【发布时间】:2019-08-06 20:36:14
【问题描述】:
我在一个快速应用程序中使用select2 来创建一个输入框,用户可以在其中从列表中选择主题,并且可以使用任何新添加的选项更新此列表。
我正在努力解决的问题是 select2 在客户端运行,而我用来播种 <option> 标记(我想附加新选项)的任何数据都是在服务器端。
我希望用户能够添加原始列表中不存在的主题,以便将来的用户可以看到新添加的选项(以及原始选项)
这些是我为实现这一目标而考虑过的选项(增加可取性):
- 为每个添加的标签添加新的
<option>Subject</option>html 标签 - 将新标签推送到数组,并从该数组中播种
<option>s - 从
json对象中播种<option>,并在创建标签时更新此对象 - 从外部数据库(例如猫鼬)中播种
<option>,并在创建标签时更新它
据我所见,所有这些选项都要求我的客户端代码 (select2-js) 与服务器端代码(我的数组、.json 文件或 mongoose 架构所在的位置)对话, 我不知道该怎么做。
在我目前的方法中,我试图在我的select2 调用 (see here) 中指定一个“本地”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 文档或其他任何被认为是最佳实践的内容),并使用新添加的选项更新此数据(通过我的测试)?
【问题讨论】:
-
使用 ajax 填充页面上的 json。然后像您当前所做的那样使用 json 填充 select2 。将 json 附加到 document.ready 和数据库更新以获取结果
-
@LelioFaieta - 感谢您的指点。你有机会把这个作为答案吗?
标签: javascript jquery ajax express jquery-select2