jquery 让Select2 Gem与ActiveAdmin的“添加新项”按钮一起工作

s3fp2yjn  于 2022-12-18  发布在  jQuery
关注(0)|答案(3)|浏览(167)

我有一个RubyOnRails应用程序,它使用ActiveAdmin和Select2 Gems。现在,我创建了一个搜索框,在输入两个字母后,它会显示给定集合中的可能选项。下面是代码:

f.has_many :location_permissions, :allow_destroy => true, heading: 'Users With Access To This Installation' do |app_f|
  app_f.input :user,  :input_html => { :class => "user_select" }, :collection => User.all.map{ |user| ["#{user.name} (#{user.email})", user.id] }
end

这也会在下面创建一个“添加新项”按钮。当单击该按钮时,会出现一个常规的ActiveAdmin下拉菜单,但我希望显示上面创建的Select2搜索菜单。如何操作?
下面是user_select函数:

$('.user_select').select2({
  minimumInputLength: 2
});

如果我单击add new按钮,它会创建一个新表单,保存那个空字段,然后刷新页面,新表单就会成为我想要的Select2搜索表单。这让我想到Select2在页面加载时应用了它的JS和CSS,那么是否可以通过 AJAX 或其他机制再次加载页面的这一部分?我不知道该如何做。所以如果有人能给我指出一个资源来做这样的事情,我会很感激你的帮助。

guykilcj

guykilcj1#

最后我用下面的代码让它工作:

$(document).on('has_many_add:after', ->
  $('select.user_select').select2({
    minimumInputLength: 2
  })
)

这是在Coffeescript中,但其Javascript形式非常相似,请将“-〉”替换为function(){}。ActiveAdmin有一个名为has_many_add:after的EventListener,它会在单击按钮一段时间后调用,您需要在此之后执行代码。由于事件仍然可以冒泡,因此上述代码可以正常工作。

7cjasjjr

7cjasjjr2#

是的,通常select2是在页面加载时初始化的,这正是您看到所描述的行为的原因。
你需要做的是将初始化器 Package 在另一个函数中,这个函数在你点击“Add New”按钮后被调用。我对ActiveAdmin不熟悉,但是假设它只是一个 AJAX 请求来添加到表单中,应该可以像这样工作:

$( document ).ready(function() {
  setupSelect2();
});
$( document ).ajaxComplete(function() {
  setupSelect2();
});

function setupSelect2() {
  $('.user_select').select2({
    minimumInputLength: 2
  });
});

将所有这些放在某个外部js文件中,并将其包含在application.js中,看看这是否能解决您的问题。

nbysray5

nbysray53#

从此ActiveAdmin问题中提供的解决方案
我们看到了如何使用ActiveAdmin调用javascript / jQuery,这是一次性的。其他答案提供了将.js文件包含到ActiveAdmin配置中的方法。
下面是一段代码片段,用于使用ActiveAdmin中使用的Arbre HTML构建器语法实现OP自己的解决方案:

script do
  raw %(
    $(document).on('has_many_add:after', () =>
      $('select.user_select').select2({
        minimumInputLength: 2
      })
    )
  )
end

这感觉很有帮助,因为对于那些可能不熟悉如何在ActiveAdmin页面中实现JS作为实现所选答案的选项的人来说。

相关问题