让 Select2 Gem 与 ActiveAdmin "Add New" 按钮一起工作
Getting Select2 Gem to work with ActiveAdmin "Add New" Button
我有一个使用 ActiveAdmin 和 Select2 Gem 的 RubyOnRails 应用程序。现在,我制作了一个搜索框,在输入两个字母后,它会显示给定集合中的可能选项。这是相关代码:
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
这还会在下面创建一个 "Add New" 按钮。单击该按钮时,会出现一个常规的 ActiveAdmin 下拉菜单,但我希望显示上面创建的 Select2 搜索菜单。我该怎么做?
这里是 user_select 函数:
$('.user_select').select2({
minimumInputLength: 2
});
如果我单击添加新按钮,它会创建一个新表单,保存该空字段,然后刷新页面,新表单将成为我想要的 Select2 搜索表单。这让我想到 Select2 在页面加载时应用了它的 JS 和 CSS,那么是否可以通过 AJAX 或其他机制再次加载页面的那部分?我不知道该怎么做,所以如果有人能指出我的资源来做类似的事情,我将不胜感激。
是的,select2 通常在页面加载时初始化,这正是您看到所描述行为的原因。
您需要做的是将初始化器包装在另一个函数中,该函数在您单击 'Add New' 按钮后被调用。我不熟悉 ActiveAdmin,但假设它只是一个 AJAX 添加到表单的请求,这样的事情应该有效:
$( document ).ready(function() {
setupSelect2();
});
$( document ).ajaxComplete(function() {
setupSelect2();
});
function setupSelect2() {
$('.user_select').select2({
minimumInputLength: 2
});
});
将所有这些放在一些外部 js 文件中,将其包含在 application.js
中,看看是否能解决您的问题。
我最终使用以下代码让它工作:
$(document).on('has_many_add:after', ->
$('select.user_select').select2({
minimumInputLength: 2
})
)
这是在 Coffeescript 中,但它的 Javascript 形式非常相似,将“->”替换为 function(){} 。 ActiveAdmin 有一个名为 has_many_add:after
的 EventListener,它会在单击按钮后的某个时间调用,您需要在此之后执行您的代码。上面的代码有效,因为事件仍然可以冒泡。
我有一个使用 ActiveAdmin 和 Select2 Gem 的 RubyOnRails 应用程序。现在,我制作了一个搜索框,在输入两个字母后,它会显示给定集合中的可能选项。这是相关代码:
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
这还会在下面创建一个 "Add New" 按钮。单击该按钮时,会出现一个常规的 ActiveAdmin 下拉菜单,但我希望显示上面创建的 Select2 搜索菜单。我该怎么做?
这里是 user_select 函数:
$('.user_select').select2({
minimumInputLength: 2
});
如果我单击添加新按钮,它会创建一个新表单,保存该空字段,然后刷新页面,新表单将成为我想要的 Select2 搜索表单。这让我想到 Select2 在页面加载时应用了它的 JS 和 CSS,那么是否可以通过 AJAX 或其他机制再次加载页面的那部分?我不知道该怎么做,所以如果有人能指出我的资源来做类似的事情,我将不胜感激。
是的,select2 通常在页面加载时初始化,这正是您看到所描述行为的原因。
您需要做的是将初始化器包装在另一个函数中,该函数在您单击 'Add New' 按钮后被调用。我不熟悉 ActiveAdmin,但假设它只是一个 AJAX 添加到表单的请求,这样的事情应该有效:
$( document ).ready(function() {
setupSelect2();
});
$( document ).ajaxComplete(function() {
setupSelect2();
});
function setupSelect2() {
$('.user_select').select2({
minimumInputLength: 2
});
});
将所有这些放在一些外部 js 文件中,将其包含在 application.js
中,看看是否能解决您的问题。
我最终使用以下代码让它工作:
$(document).on('has_many_add:after', ->
$('select.user_select').select2({
minimumInputLength: 2
})
)
这是在 Coffeescript 中,但它的 Javascript 形式非常相似,将“->”替换为 function(){} 。 ActiveAdmin 有一个名为 has_many_add:after
的 EventListener,它会在单击按钮后的某个时间调用,您需要在此之后执行您的代码。上面的代码有效,因为事件仍然可以冒泡。