Rails 带有 select2 的嵌套表单
Rails nested form with select2
我对嵌套表单使用 cocoon gem,对自定义 selects 使用 select2。
第一个集合 select 已按预期运行。当我添加另一个 select 项目时,即使 select 项目具有相同的 class,它也不起作用。我尝试了 解决方案。但它并没有解决我的问题。因为我调用了嵌套项的部分。
_form.html
<%= simple_form_for(@course) do |f| %>
<%= f.simple_fields_for :course_teachers do |course_teacher| %>
<%= render "course_teacher_fields", :f => course_teacher %>
<% end %>
<div class="links">
<%= link_to_add_association 'Add Teacher', f, :course_teachers, class:"btn btn-info" %>
</div>
<%end%>
_course_teacher_fields.html
<div class="nested-fields">
<%= f.association :teacher, collection: Teacher.all, label_method: :full_name_with_title, input_html: {class: "teacher"} %><br/>
</div>
app.js
$(".teacher").select2({
placeholder: "Select Teacher",
allowClear: true
});
你有什么想法吗?
问题是您的 javascript 只在已渲染的项目上初始化 select2 一次(这就是为什么您对第一个 select 没有问题的原因) 但在你添加另一个之后,select2()
不会触发并且不会在该项目上初始化。
要解决此问题,请在 `cocoon:after-insert' 之后添加一个回调,并在添加的行上触发 select2 事件。
所以你的 javascript 应该是
function init_select2(selector){
$(selector).select2({
placeholder: "Select Teacher",
allowClear: true
});
};
init_select2(".teacher")
$("form").on("cocoon:after-insert", function(_, row){
field = $(row).find(".teacher")
init_select2(field);
});
我没有测试过这段代码,但我希望你能理解。
我对嵌套表单使用 cocoon gem,对自定义 selects 使用 select2。
第一个集合 select 已按预期运行。当我添加另一个 select 项目时,即使 select 项目具有相同的 class,它也不起作用。我尝试了
_form.html
<%= simple_form_for(@course) do |f| %>
<%= f.simple_fields_for :course_teachers do |course_teacher| %>
<%= render "course_teacher_fields", :f => course_teacher %>
<% end %>
<div class="links">
<%= link_to_add_association 'Add Teacher', f, :course_teachers, class:"btn btn-info" %>
</div>
<%end%>
_course_teacher_fields.html
<div class="nested-fields">
<%= f.association :teacher, collection: Teacher.all, label_method: :full_name_with_title, input_html: {class: "teacher"} %><br/>
</div>
app.js
$(".teacher").select2({
placeholder: "Select Teacher",
allowClear: true
});
你有什么想法吗?
问题是您的 javascript 只在已渲染的项目上初始化 select2 一次(这就是为什么您对第一个 select 没有问题的原因) 但在你添加另一个之后,select2()
不会触发并且不会在该项目上初始化。
要解决此问题,请在 `cocoon:after-insert' 之后添加一个回调,并在添加的行上触发 select2 事件。
所以你的 javascript 应该是
function init_select2(selector){
$(selector).select2({
placeholder: "Select Teacher",
allowClear: true
});
};
init_select2(".teacher")
$("form").on("cocoon:after-insert", function(_, row){
field = $(row).find(".teacher")
init_select2(field);
});
我没有测试过这段代码,但我希望你能理解。