【发布时间】: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