【问题标题】:Cocoon callbacks after form reload表单重新加载后的 Cocoon 回调
【发布时间】:2014-09-25 16:10:44
【问题描述】:

我正在创建一个表单,用户可以在其中添加许多嵌套问题,每个问题可以有许多嵌套答案,其他字段具有 ActiveRecord 验证器,当它们失败时,页面会重新加载,插入的字段仍然存在。

所有回调(例如cocoon:before-insert)都不会重新加载,例如插入对象的下拉列表的更改处理程序

如果在服务器端验证器上重新加载页面失败,我该怎么做才能使这些回调得到尊重?

另一方面,在代码质量方面,将在 cocoon 回调中创建的处理程序添加到调用控制器上的 new 方法时构建的嵌套对象的最佳方法是什么(即不受插入后/插入前回调)?

这里有一些用于澄清的示例咖啡脚本代码:

$(document).ready ->
  $('#questions').on("cocoon:after-insert", (e, added_question) ->
    added_question.find('#type').change ->
      if $(this).val() is "1"
        added_question.find("#answers").hide()
      else
        added_question.find("#answers").show()

编辑:更改问题,因为删除问题是缺少适当的包装类

编辑#2:添加示例代码

【问题讨论】:

  • 如何定义回调处理?在文档就绪事件中?你能显示一些代码吗?你在用 Rails 4 吗?
  • 是的,它在文档就绪事件中,我已经添加了一些澄清的代码,发生的情况是 div #type 上的更改处理程序不再绑定到对象,是的,使用 rails 4.0.1

标签: ruby-on-rails cocoon-gem


【解决方案1】:

在使用 rails4 时,您使用的是turbolinks,您不能再依赖document.ready 事件,而应该监听page:change 事件。

所以你的代码会变成:

$(window).bind 'page:change', () ->
  $('#questions').on("cocoon:after-insert", (e, added_question) ->
    added_question.find('#type').change ->
      if $(this).val() is "1"
        added_question.find("#answers").hide()
      else
        added_question.find("#answers").show()

或者你可以写$(document).on 'page:change', () -> ...,这是完全相同的。

[更新:替代解决方案]

我还没有真正阅读过事件处理程序 :) 一些评论:

  • 您可能需要尝试使用before-insert。那可能行得通。
  • 其次,您使用的是 id #type,但一页会不止一个吗?那是自找麻烦:) 如果您获得的不止一个,请使用课程。此外,请使用更具描述性的名称。

有一个更简单的解决方案:jquery可以动态绑定,所以你可以写

$('#questions').on 'change', '.question-type', () -> 
  var this = $(this)
  var question = $(this).parent('.your-question-class')
  question.toggle()

不确定您是否真的需要检查该值,只需切换可见性?

这个代码当然没有经过测试,但我希望你能得到它的 gis。查找 jquery on 处理程序,它允许使用选择器捕获事件。因此,在这种情况下,#questions div 内的任何更改事件,在具有类question-type 的元素上(而不是您不正确的#type id)都将由此处理程序处理。它将是动态的,因为它附加到容器元素。因此,如果添加或删除问题,它仍然有效。

【讨论】:

  • 实际上我没有使用 turbolinks,而是切换到尝试这个,虽然 $(window).bind 现在可以工作,但更改处理程序仍然没有应用于现有对象,例如:我插入一个Q1 通过 cocoon 并更改#type div,从而导致更改回调触发,然后我提交错误的表单,页面更改,但未插入 Q1 对象,因此保持不变,而插入后回调仍然存在并适用于新对象,它不会触发在页面更改之前创建的对象
  • parents 方法正是我所需要的,谢谢,至于切换,这只是示例代码,因为我的实际代码有更多内容,但我会研究一下,谢谢!
  • 这是有效的,但是我在使用 turbolinks 时遇到了多个条目的问题(比如 cocoon 的 github 页面上的 issue #177),所以我效仿并将包含标签更改为标题并修复了它,但是,绑定到问题 id 的更改处理程序不再起作用,有什么想法吗?
猜你喜欢
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
相关资源
最近更新 更多