Select2 与 Formsets 一起工作不正确

Posted

技术标签:

【中文标题】Select2 与 Formsets 一起工作不正确【英文标题】:Select2 working incorrectly with Formsets 【发布时间】:2021-10-09 11:16:49 【问题描述】:

我有这样的脚本,而且这个脚本只使用第一种形式,其他的被冻结并且根本不起作用。

$(document).ready(function() 
    $('#id_membership-0-company').select2();
);

我无法将 # 更改为 .因为每个新表单都有新的 id,比如id_membership-0-companyid_membership-1-company 等等,而且我所有的表单都有相同的类(这个字段没有单独的类)

我无法在此函数中添加所有 id,因为它仅在页面加载时有效,因此只有 id 0 会以这种方式工作

我试图做这样的事情:在“添加表单”按钮 html 标记中添加onclick="addRow()",并在脚本中添加此代码。如果没有 Timeout 功能,它不起作用,因为脚本执行速度太快。 它适用于两个表单(如果我按“添加表单”按钮),但如果我添加更多 id 则不起作用(在这种情况下,在第二个表单之后为此字段创建了更多不正确的表单)

function addRow() 
    function activateForms()
        $('#id_membership-0-company').select2();
        $('#id_membership-1-company').select2();
        
        setTimeout(activateForms, 1000);
    

如何解决这个问题?每个表单的第一个字段都需要 select2 小部件吗?

【问题讨论】:

你可以使用简单的$('select').select2(); @SimoneRossaini,我试过了,只有第一个表单适用于此代码 您能告诉我们单击“添加表单”时会发生什么吗? (这会触发 ajax 调用等)所以我可以最好地格式化你的答案 如果我这样做:$(document).ready(function() $('select').select2(); ); 只有第一种形式可以工作,其他形式只是冻结,我无法选择某些内容。如果我在添加按钮添加表单后创建超时或触发功能,它的行为会很奇怪并创建许多多余的表单,有些正在工作,有些被冻结 【参考方案1】:

我为你创建了一个小例子,所以你可以适应你的代码。

$(document).ready(function() 
  $('select').select2();
);

$('.addSelect').on('click', function() 
  const arr = [
      val: 1,
      text: 'One'
    ,
    
      val: 2,
      text: 'Two'
    ,
    
      val: 3,
      text: 'Three'
    
  ];

  const sel = $('<select>').appendTo('.container');
  $(arr).each(function() 
    sel.append($("<option>").attr('value', this.val).text(this.text));
  );  
  $(sel).select2();
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
<div class='container'>
  <select>
    <option>One</option>
    <option>Two</option>
    <option>Three</option>
  </select>
</div>
<button class='addSelect'>Add Select2</button>

【讨论】:

我能否将对象传递给const arr,因为我的&lt;select&gt;&lt;option&gt; 标签是自动生成的? 这只是一个示例,您可以在使用脚本将选择附加到页面后添加$('select').select2(); 我用 django formset 附加我的表单,所以如果我每次添加表单时都触发$('select').select2();,那么会生成许多表单,其中一些正在工作,有些则没有 您可以像我的更新示例一样使用sel 如果我只创建 $('select').select2(); 第一个激活的表单,但其他的很混乱,其中一些作为 select2 工作,其中一些冻结,一些只是没有 select2 我发现如果我激活表单使用$('select').select2(); 添加所有表单后它可以工作,但我不知道如何让它适用于每个单独的表单

以上是关于Select2 与 Formsets 一起工作不正确的主要内容,如果未能解决你的问题,请参考以下文章

如何将 select2 与 Meteor 一起使用?

将 Select2 与烧瓶 wtforms 一起使用

如何使 select2 与 Angular 7 一起使用

Django-dynamic-formsets 不工作

select2 和 Pjax 在 yii2 中不能一起工作

select2 和sheepit jquery 插件不能一起工作