【问题标题】:Rails autocomplete works in parent but not nested form. Why?Rails 自动完成以父形式工作,但不能以嵌套形式工作。为什么?
【发布时间】:2012-03-12 17:57:48
【问题描述】:

在带有 JEE 的 Rails 3.2 应用程序中,我试图在使用 Cacoon 的复杂嵌套表单中实现一个自动完成字段,如 Railscast #102。

我已经设法让类似的自动完成字段在父表单上完美运行。但是我无法让自动完成功能在嵌套表单上工作。似乎没有触发 javascript。

我的表单看起来像

<%= form_for @parent do |f| %>
<%= f.text_field :name, :class=>"parent-name", :data => {:autocomplete_source => Model.order(:name).map(&:name) } %>
  <%= f.fields_for :children  do |child| %>
    <%= f.fields_for :grand_children do |grand_child| %>
      <%= f.text_field :name, :class=>"grand-child-name", :data => {:autocomplete_source => Model.order(:name).map(&:name) } %>
    <% end %>
  <% end %>
<% end %>

我有两个 javascript 函数

$(function() {
    $('.parent-name').autocomplete({
        source: $('.parent-name').data('autocomplete-source')
    });
});

$(function() {
    $('.grand-child-name').autocomplete({
        source: $('.grand-child-name').data('autocomplete-source')
    });
}); 

父自动完成功能完美,孙子却不行。我错过了什么吗?有没有理由不能以嵌套形式工作?还是我的方法有误?

感谢任何指点。

编辑

孙子元素是异步添加的,父元素是在页面加载时呈现的。这似乎是问题的关键。当我打开现有记录进行编辑(即在页面加载时呈现和填充字段)时,自动完成功能对这些字段起作用。

解决方案

感谢 Chris Drappier,他为我指明了正确的方向。他说我在添加新的表单元素时需要添加我的观察者。

我现在有两个 jquery 函数。原来的

$(function() {
    $('.grand-child-name').autocomplete({
        source: $('.grand-child-name').data('autocomplete-source')
    });
});

$(function() {
    $(document).on("focus",".grand-child-name", function() {
        $('.grand-child-name').autocomplete({
            source: $('.grand-child-name').data('autocomplete-source')
        }); 
    });
})

虽然 Chris 将我指向 .live() 函数,但显然它已被贬低,而 .on(focus) 提供了正确的功能。

谢谢克里斯!

【问题讨论】:

  • 您是否在最初加载页面时呈现整个表单?或者您是异步插入这些元素。另外,如果您将文本字段从孙子项移到子项中怎么办。那它对你有用吗?
  • 在你的父母身上,你是否在模型中做accepts_nested_attributes_for? asciicasts.com/episodes/196-nested-model-form-part-1
  • @ChrisDrappier 感谢您的建议。我正在异步插入元素,这似乎是问题所在。如果我打开现有记录,并因此在加载期间呈现字段,则自动完成工作。为什么是这样?我能做些什么呢?我非常感谢任何有助于我学习这一点的正确方向的指示。
  • @CaleyWoods 感谢您的想法。我在模型中定义了嵌套属性。这似乎不是问题,因为自动完成适用于页面加载期间呈现的元素。见上文。
  • @AndyHarvey 我已经为您的问题添加了答案。我会继续更新问题的文本,以包括表单元素被异步添加的事实。这是解决问题的关键。

标签: javascript ruby-on-rails autocomplete nested-forms


【解决方案1】:

这是一个棘手的问题,但我认为问题是您必须在添加新表单元素时添加观察者。如果您使用的是 jquery,则有处理这种情况的功能。请参阅 jquery 中的 api 文档以获取 live() 。我认为这应该能让你到达你需要的地方。

【讨论】:

  • 谢谢@chris,我会调查并报告。
  • 哇,多么酷的修复!我使用了 .on() 而不是 .live(),但修复第一次就奏效了——对我来说很不寻常,因为我的 javascript 技能并不那么火爆。我将在上面的问题中发布我的完整解决方案。谢谢克里斯!
  • @ChrisDrappier live 现已弃用。
猜你喜欢
  • 1970-01-01
  • 2017-07-01
  • 2018-07-24
  • 2013-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
相关资源
最近更新 更多