如何在 best_in_place 编辑完成后触发事件?

Posted

技术标签:

【中文标题】如何在 best_in_place 编辑完成后触发事件?【英文标题】:How to trigger events upon the completion of a best_in_place edit? 【发布时间】:2012-04-25 10:46:16 【问题描述】:

在显示页面中,我显示了一个周期性事件发生的日期列表,并计算了所有日期的统计数据,例如连续日期之间的最大、最小和平均间隔。

我使用 best_in_place gem 来允许就地编辑日期。但是,每次更改日期时,都必须计算统计信息并从服务器重新呈现。

如何将回调函数与 best_in_place 编辑的完成挂钩,以便重新渲染统计信息?

这是我在 show.html.erb 中的 Rails 代码

<td id="event_date">
  <%= best_in_place @event, :occur_date %>
</td>

在html中是

<td id="event_date"> 
    <span class='best_in_place' id='best_in_place_event_132_occur_date' data-url='/events/132' data-object='event' data-attribute='occur_date' data-type='input'>2012-03-23</span>
</td>

我尝试了以下咖啡脚本代码:

jQuery ->
$("#best_in_place_event_*_occur_date").live 'ajax:complete', (evt, data, status, xhr) ->
  alert "a date has changed"

这似乎不起作用,在我编辑日期 (occur_date) 后没有任何反应。

有人知道我应该如何在 best_in_place 编辑成功后触发事件吗?

【问题讨论】:

你说,“统计数据必须从服务器计算和重新渲染。”所以这种重新计算发生在模型中,并在更新操作中从控制器调用,对吗?只是想在回答之前弄清楚我的事实。 是的,统计数据计算在模型中完成,并且统计数据(例如 max、min、avg)不存储在 ActiveRecord 中。不确定我是否做得对,但我没有通过控制器,我有视图调用模型方法。这是我的代码。在views/events/show.html.erb "events_stats", :locals => :event => @event%> 在views/events/_event_stats.html.erb: 最短: 最长: 平均: 【参考方案1】:

至于你的例子:

<td id="event_date">
  <%= best_in_place @event, :occur_date, :classes => 'bip_date' %>
</td>

$('.bip_date').bind("ajax:success", function()
alert("a date has changed")
);
// or: $('.event_data .best_in_place').bind(...)    

来自official readme:

成功时触发 'ajax:success' 事件。

使用绑定:

$('.best_in_place').bind("ajax:success", function ()
$(this).closest('tr').effect('highlight'); );

要绑定特定于特定字段的回调,请使用 辅助方法中的“类”选项,然后绑定到该类。

<%= best_in_place @user, :name, :classes => 'highlight_on_success' %>
<%= best_in_place @user, :mail, :classes => 'bounce_on_success' %>

$('.highlight_on_success').bind("ajax:success", function()bip_date);
$('.bounce_on_success').bind("ajax:success", function()$(this).closest('tr').effect('bounce')););

【讨论】:

【参考方案2】:

好吧,看看源代码,似乎 best_in_place 正确触发了 loadSuccessCallback 中的 ajax:success 事件。这意味着您应该能够使用一些 jQuery 将您自己的函数绑定到更改的事件。

$(".best_in_place").live 'change', (event) ->
  alert "Hello, World!"

【讨论】:

这很好用。请务必将 jquery 的“live”方法替换为较新的“on”方法。 对,@Stone。 Karen 在她的问题中使用了 live,她没有显示我可以与 on 一起使用的父元素,而且这是一个旧答案。 完全,只是想把它放在那里以通知现在正在查看答案的任何人。顺便说一句,谢谢你的回答!

以上是关于如何在 best_in_place 编辑完成后触发事件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Rails gem 'best_in_place' 进行内联编辑 - 错误:在 textarea 上编辑后新行丢失

best_in_place 更新后保留原始值

我如何将 country_select gem 与 best_in_place 编辑集成

Rails 4 - best_in_place:无法处理的实体

如何让 best_in_place 的 respond_with_bip 工作?

将 best_in_place 与 TinyMCE 等富文本编辑器一起使用