Select2:选择新标签后更新选项

Posted

技术标签:

【中文标题】Select2:选择新标签后更新选项【英文标题】:Select2: Update option after selecting new tag 【发布时间】:2016-03-14 00:26:55 【问题描述】:

我实现了一个标签系统,您可以在其中选择现有标签或添加新标签。选择新标签后,它将使用 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");
 );

【问题讨论】:

您是否尝试过在标签创建后触发更改事件? @BuddhistBeast 这对我有帮助吗?如果我听这个事件,我的 ID 已经没了?还是我应该听 change 事件而不是 select 事件? 相关***.com/questions/23295168/… 【参考方案1】:

我的问题是我没有将新标签作为&lt;option&gt; 标签添加到本机选择字段。

这是必要的,因为如果确实存在具有此值的 &lt;option&gt; 标记,则 select2 会检查通过 select2.val(values) 设置的值。如果不是,则 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'
]

您可以为每个结果添加额外的数据,比如自己渲染带有额外数据的结果列表。

【讨论】:

【参考方案2】:

只是为了更新:

新语法是

e.params.args.data.id

不是

e.params.data.id

【讨论】:

以上是关于Select2:选择新标签后更新选项的主要内容,如果未能解决你的问题,请参考以下文章

提交更新后 select2 的选择选项丢失以及如何从数据库中设置选定的值

键入新标签时 Select2 失去焦点

单击某些按钮后select2中的动态选项

javascript select2 允许的标签

select2 添加带有确认框的新标签

更新 select2 组件的选项 - vue js