我想用 select2(4.0.0) 和 jquery(2.1.4) 实现以下场景:
- 我有一个从外部源获取数据的选择框(Java 应用程序服务器上的端点)
- 用户可以选择返回的值之一或提出自己的值
- 现在,当用户提交表单并且服务器端的验证失败时,我想显示用户之前提供的所有值的表单,因此选择框应该将值发送到服务器。
为了实现这一点
- 我使用ajax from select 从服务器查询数据
- 我使用createTag允许用户创建自己的值
- 我想使用initSelection用用户先前添加的值预填充选择框。
我的代码如下所示:
$("select[name='serie']").select2({
ajax: {
url: "http://javaendpoit/serie/filter",
dataType: 'json',
delay: 250,
data: function (params) {
return {
name: params.term,
page: params.page
};
},
processResults: function (data, page) {
return {
results: $.map(data, function (item) {
return {
text: item.name,
name: item.name,
id: item.name
}
})
};
},
cache: true
},
escapeMarkup: function (markup) { return markup; },
minimumInputLength: 2,
templateResult: formatRepo,
templateSelection: formatRepoSelection,
tags: true,
createTag: function (tag) {
return {
id: tag.term,
text: tag.term,
name: tag.term,
isNew : true
};
},
/* below part is rendered by jsp so that it has the value from previous form submission; if it is initial form render the below part is not included */
initSelection : function (element, callback) {
callback({id:"Name",name:"Name","text":"Name"});
}
});
function formatRepo (serie) {
if (serie.loading) return serie.text;
var markup = '<div class="clearfix">' +
'<div clas="col-sm-10">' +
'<div class="clearfix">' +
'<div class="col-xs-12">' + serie.name + '</div>' +
'</div>';
markup += '</div></div>';
return markup;
}
function formatRepoSelection (serie) {
return serie.name;
}
这工作得很好。这意味着提交后我可以在选择框中看到值名称,它是选定的值。不过,如果我再次尝试提交此表单,请求中将缺少该值。
正如这里的主题数量所建议的那样,我添加了以下行(见最后一行)。
/* [...] */
initSelection : function (element, callback) {
callback({id:"Name",name:"Name","text":"Name"});
}
}).select2("val","Name");
但是在添加这个之后,值Name在 select2 框中甚至不可见。
我已经尝试修复它几个小时了,但不知何故找不到正确的解决方案。我敢打赌我错过了一些基本的东西。请帮忙!
- - [编辑]
添加数据后,即使使用val设置值,我也可以看到值 Name,但如果我重新提交表单,请求中仍然不存在该值。
.select2('data',{id:"Name",name:"Name","text":"Name"})
.select2('val', "Name")
--- [编辑 2]
在 html 中,我使用select来创建这个元素。
<select class="form-control" name="serie"></select>