我实施了一个标记系统,您可以从中选择现有标记或添加新标记。选择新标签后,它将使用AJAX调用保持不变。
为实现此目的,我使用了回调createTag
和事件select2:select
。因为我只想在选择标签时创建标签,所以如果事件select2:select
被触发,我会对此进行AJAX调用。
问题是我需要使用从新标记持久保存到数据库的ID来更新已创建的select2选项。什么是最干净的解决方案?
以下是我所拥有的:
$('select.tags').select2({
tags: true,
ajax: {
url: '{{ path('tag_auto_complete') }}',
processResults: function (data) {
return {
results: data.items,
pagination: {
more: false
}
};
}
},
createTag: function (tag) {
return {
id: tag.term, // <-- this one should get exchanged after persisting the new tag
text: tag.term,
tag: true
};
}
}).on('select2:select', function (evt) {
if(evt.params.data.tag == false) {
return;
}
$.post('{{ path('tag_crrate_auto_complete') }}', { name: evt.params.data.text }, function( data ) {
// ----> Here I need to update the option created in "createTag" with the ID
option_to_update.value = data.id;
}, "json");
});
答案 0 :(得分:5)
我的问题是我没有将新标记作为<option>
标记添加到本机选择字段。
这是必要的,因为如果存在具有此值的select2.val(values)
标记,则select2会检查通过<option>
设置的值。如果不是,则select2以静默方式将值抛出数组,并设置在基础选择字段中具有相应选项标记的值数组。
这就是它现在正常工作的方式(对于select2 4.0.x):
$('select.tags').select2({
tags: true,
ajax: {
url: '{{ path('tag_auto_complete') }}',
processResults: function (data) {
return {
results: data.items,
pagination: {
more: false
}
};
}
},
createTag: function (tag) {
return {
id: tag.term,
text: tag.term,
tag: true
};
}
}).on('select2:select', function (evt) {
if(evt.params.data.tag == false) {
return;
}
var select2Element = $(this);
$.post('{{ path('tag_crrate_auto_complete') }}', { name: evt.params.data.text }, function( data ) {
// Add HTML option to select field
$('<option value="' + data.id + '">' + data.text + '</option>').appendTo(select2Element);
// Replace the tag name in the current selection with the new persisted ID
var selection = select2Element.val();
var index = selection.indexOf(data.text);
if (index !== -1) {
selection[index] = data.id.toString();
}
select2Element.val(selection).trigger('change');
}, 'json');
});
最小的AJAX响应(JSON格式)必须如下所示:
[
{'id': '1', 'text': 'foo'},
{'id': '2', 'text': 'bar'},
{'id': '3', 'text': 'baz'}
]
您可以为每个结果添加额外的数据,让我们自己渲染结果列表,并在其中添加其他数据。
答案 1 :(得分:0)
只是为了更新:
新语法是
e.params.args.data.id
不
e.params.data.id