嵌套表单文本字段中的自动完成

Autocompletion in a nested form text field

我正在使用 rails 5,我想自动完成嵌套形式的文本字段。嵌套表单是通过 cocoon 生成的。 当我尝试在父表单中使用自动完成功能时,它工作正常。但是,我的 javascript 似乎不适用于嵌套表单。

这是嵌套形式的模型文件

class Programline < ApplicationRecord
belongs_to :program, inverse_of: :programlines
belongs_to :exercise


def exercise_name
 exercise.try(:exe_desc)
end

def exercise_name=(exe_desc)
 self.exercise = Exercise.find_by_exe_desc(exe_desc) if 
 exe_desc.present?
end



end

这是我在嵌套表单中的文本字段。

 <%= f.text_field :exercise_name, data: {autocomplete_source: Exercise.order(:exe_desc).map(&:exe_desc)} ,class: "form-control", placeholder: "Exercise", autofocus: true %>

这是我的 javascript 文件。

     jQuery
     $(function() {
      $(document).on("focus","programline_exercise_name", function() {
        $('programline_exercise_name').autocomplete({
            source: $('programline_exercise_name').data('autocomplete- source')
              }); 
                });
                  })

当我填写表格时,它工作正常,插入数据和建立关系没有任何问题。但是它不会自动找到练习table中的数据。

感谢您的帮助。

您的 JQuery 应如下所示(假设您的嵌套字段具有 ID programline_exercise_name):

$(function() {
 $(document).on("focus","#programline_exercise_name", function() {
   $('#programline_exercise_name').autocomplete({
       source: $('#programline_exercise_name').data('autocomplete- source')
    }); 
 });
});

您在 cocoon issues 中交叉发布了此内容,因此我将在此处复制我的回答给您。

您的 select 离子过滤器 jquery 似乎有误。你写 on("focus","programline_exercise_name"$('programline_exercise_name') 会去寻找具有该名称的 html 元素。喜欢 $('p') 将 select 所有段落。我假设您想要 select 带有 id 或 class programline_exercise_name 的元素?对于动态添加的字段,您肯定会使用 class,但是您的 jquery 代码段也会是错误的。

因此,如果您将想要的 class-名称添加到字段

<%= f.text_field :exercise_name, data: { autocomplete_source: Exercise.order(:exe_desc).map(&:exe_desc)},
      class: "form-control programline_exercise_name", 
      placeholder: "Exercise", 
      autofocus: true %>

然后你需要像

这样的东西
$(document).on("focus", ".programline_exercise_name", function() {
  var _this = $(this); 
  _this.autocomplete({
    source: _this.data('autocomplete- source')
  }); 
});

未测试,所以让我解释一下:当使用 class .programline_exercise_name 在任何文本字段上触发焦点事件时,只为引发该事件的元素设置自动完成。