手动添加 select 选项并不是每次都能正常工作,即使成功了,第二次尝试总是失败

Manually adding select options does not work correctly every time, and even if it did, the second atempt is always a failure

我想创建一个包含三个 text_fields 的模式,提交时,我需要在浏览器上防止默认(不重新加载页面,以防任何数据放在模式旁边),然后发送数据通过 AJAX 到后端,然后使用提交的选项手动更新 select_2。

更改变量类型,将 .trigger("change") 拆分为新行,或在附加选项对象后将其归零,似乎没有任何改变。

<div class="sampling-register">
  <div class="ibox">
    <div class="ibox-content">
      <form>
        <div class="section">
          <div>
            <%= select_tag :client, grouped_options_for_select(@clients),
                           :include_blank => 'Wybierz klienta', class: 'select2_demo_2', required: true %>
            <button type="button" data-toggle="modal" data-target="#client_modal">
              <%= image_tag 'laboratory/add_circle_blue' %>
            </button>
          </div>
        </div>
      </form>
    </div>
  </div>
<div class="modal inmodal" id="client_modal" tabindex="-1" role="dialog" aria-hidden="true">
    <div class="modal-dialog">
      <div class="modal-content animated fadeIn">
        <div class="modal-header">Dodaj klienta</div>
        <%= form_for :client, url: clients_path, :html => {:id => "form_add_client"} do |f| %>
          <div class="modal-body">
            <%= f.hidden_field :laboratory_id, value: current_user.company.laboratory.id %>
            <%= f.text_field :name, class: 'form-control', placeholder: 'Nazwa', required: true %>
            <%= f.text_field :address, class: 'form-control', placeholder: 'Adres' %>
          </div>
          <div class="modal-footer">
            <button class="discard" data-dismiss="modal">Anuluj</button>
            <button class="submit">Dodaj</button>
          </div>
        <% end %>
      </div>
    </div>
  </div>
<script>
    let form = $("#form_add_client");
    let submitBtn = form.find(".submit");
    let client_select_tag = $("#client");

    form.on("submit", function (event) {
        event.preventDefault();
        let name = $('#client_name').val();
        let client_address = $('#client_address').val();
        let laboratory_id = $('#client_laboratory_id').val();

        $.ajax({
            url: '/clients',
            method: 'POST',
            dataType: "json",
            data: {
                client: {
                    name: name,
                    address: client_address,
                    laboratory_id: laboratory_id
                },
            }
        })
            .done(function (result) {
                if (result.error) {
                    toastr["error"](result.error);
                } else {
                    let option = new Option(result.data.name, "{lab_client_id: " + result.data.id + "}", false, true);
                    client_select_tag.children().eq(2).append(option).trigger('change');
                    $('#client_modal').modal('hide');
                    toastr["success"]("Klient dodany poprawnie");
                }
            })
    })
</script>

问题是,它确实有效,但有时却无效(比如每三次尝试一次),即使一次有效,在我重新加载页面之前,其他所有尝试都是失败的。重新加载后,似乎又像扔硬币一样。 它确实每次都会触发附加选项 selected,但实际上附加到 select 列表并不经常发生。

好的,似乎要改变

client_select_tag.children().eq(2).append(option).trigger('change');

进入

client_select_tag.select2().children().eq(2).append(option).trigger('change');

使代码有效