【问题标题】:How to update front-end content after that a form is successfully submitted from a dialog window?从对话框窗口成功提交表单后如何更新前端内容?
【发布时间】:2012-09-05 12:30:42
【问题描述】:

我正在使用 Ruby on Rails 3.2.2 和 jQuery-Rails 2.0.2 gem(包括 jQuery UI)。我有一个jQuery UI Dialog 窗口,当我单击前端内容中的“新评论”链接时,它会打开。当对话框窗口打开时,它会向我的控制器操作执行 AJAX HTTP 请求,使其使用 HTML 表单呈现和“填充”模态窗口正文内容。

我想实现我的观点,表单提交成功后前端的内容会这样改变:触发链接文本从“新评论”变成“编辑评论”。

我怎样才能做到这一点?你有什么建议?


注意:表单是通过执行 AJAX HTTP 请求依次提交的。

【问题讨论】:

    标签: jquery ruby-on-rails ruby jquery-ui modal-dialog


    【解决方案1】:

    这完全取决于您如何将该表单提交到服务器。

    如果您提交的表单设置了:remote => true 属性,它将通过 AJAX 调用发送到服务器,服务器将能够将其与常规的非 ajax 表单请求区分开来:

    respond_to do |format|
      format.js  #this renders the <actionname>.js.erb file and executes it on the client
    end
    

    jquery_ujs 助手将执行服务器返回给他的 javascript 代码。

    您可以在 &lt;actionname&gt;.js.erb 文件中编写任意 JavaScript 代码,如下所示:

    $('#trigger_link').text('edit comment');
    

    如果您不使用远程表单而是进行普通的$.ajax 调用,您可以简单地挂钩到jQuery 提供的success 回调,但我想这很明显。

    更新:

    似乎问题在于您不知道是哪个链接触发了对话框的打开。

    通常在某个地方你有一个 jQuery 函数可以为你打开对话框。在呈现包含触发链接的初始列表时,我假设您有一些方法可以将它们与页面上的其他链接区分开来(可能通过像 .trigger 这样的 css 类)。

    你可以这样做:

    $('.trigger').click(function() {
      window.trigger_link = this;
    });
    

    请注意,上面的这个小 sn-p 不会覆盖您现有的打开弹出窗口的单击事件处理程序。它也会被执行。

    现在我们跟踪打开窗口的链接(点击触发链接时打开窗口 - 我们总是保存最后点击的触发链接),一旦提交表单,我们可以执行以下操作:

    $(window.trigger_link).text('edit comment');
    

    因为 window.trigger_link 指的是正确的链接。

    【讨论】:

    • 我的问题与 "retrieving" / "building" 触发链接的正确 CSS id 有关(在您的回答中,例如,您命名为 trigger_link),因为:(1) AJAX 呈现的表单与其自己的 CSS ids 相关(AJAX 请求由另一个设置了自己的 CSS ids 的控制器操作处理) ; (2) 我在同一个页面中有很多触发链接,每个链接都设置了自己的 CSS id
    • 换句话说,我不能“直接知道”(因此我不能正确地“构建”)来自@987654336 / 内的触发链接的CSS id @ 模板(也许,有一些common 方式 - 我不知道 - 为了解决这个问题......)。
    • 您可以通过$('form submit').text() .. 访问按钮,并且保存表单的容器也应该是已知的。所以$('form submit', $('#containerId')).text() 应该可以工作
    • 问题与检索form(更一般地说,对话窗口的内容)有关,但它与检索触发链接(注意:触发链接不包含在对话窗口中)打开对话窗口以便可以编辑链接文本。
    • 嗯..你不能在点击时通过jQuery设置触发链接吗?在该链接上添加另一个 .click 处理程序,为其设置全局 javascript 变量? $('.link').click(function() { window.trigger_link = this; } 然后在提交时检索它并设置它的值,如下所示:$(window.trigger_link).text()
    猜你喜欢
    • 2013-05-23
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多