Javascript 在一个控制器操作中多次更新视图

Javascript 在一个控制器操作中多次更新视图,javascript,jquery,ruby-on-rails,ruby-on-rails-5,Javascript,Jquery,Ruby On Rails,Ruby On Rails 5,Rails和Web开发的新功能。我有一个要修改的DOM元素。我目前有一个单独的Javascript文件来修改DOM function start_loading_bar(msg) { loading_message(msg) $('#progress').fadeIn() } function loading_message(msg) { $('.progress-message').text(msg + "...") } 这链接到表单提交按钮启动的onclick事件 = f.su

Rails和Web开发的新功能。我有一个要修改的DOM元素。我目前有一个单独的Javascript文件来修改DOM

function start_loading_bar(msg) {
  loading_message(msg)
  $('#progress').fadeIn()
}
function loading_message(msg) {
  $('.progress-message').text(msg + "...")
}
这链接到表单提交按钮启动的onclick事件

= f.submit "Submit", class: "btn btn-success", onclick: "start_loading_bar('Loading Feed data to Amazon');", remote: true
单击此按钮后,执行JS,然后执行处理表单提交的控制器函数。在这个控制器函数中,我想多次调用同一个JS函数。据我所知,我需要控制器

respond_to do |format| 
    format.js { render js: "loading_message(msg);" }
end
为了调用js函数,我不认为我可以在一个函数中有多个respond_to block

也许我处理这个问题的方法不对

给我一点背景。这个JS函数链接到一个加载条,当我执行
$('.progress message').text(msg+“..”)
加载条文本被设置,然后
$('.\progress')。fadeIn()
将删除
显示:无$(#进度)
上进行编码>并逐渐淡入

我的最终目标是让表单提交按钮用一条通用消息启动加载栏,然后控制器将根据进程的哪个部分修改加载栏消息。我在控制器中有3个离散步骤,因此,例如,我希望文本是

“步骤1/3”

“步骤2/3”

“步骤3/3”

在控制器功能的不同部分

这需要我打电话

加载_消息(“步骤1/3”)

加载_消息(“步骤2/3”)

加载_消息(“步骤3/3”)

我想我必须把控制器分成更小的部分,每个部分都会用JS函数调用来响应


然而,我想问的是,我是否忽略了一个更好/更优雅的解决方案。

我想问的第一个问题是,什么花费了这么长时间,以至于您需要向用户提供如此高级别的反馈,也许您应该将其发送给后台工作人员,这意味着您可能仍然需要以某种方式通知您的用户

除非你打开一个websocket,或者使用类似Pusher的东西,否则让你的控制器更新你的JS并不是一个简单的壮举

否则,您的第二个想法是,如果控制器操作是完全不同的流程,那么UI请求每个步骤是有意义的。这将导致更多的网络呼叫,更多的可能出错。那么,你真的需要那种程度的反馈吗


我不确定您需要做什么,但如果需要很长时间,请将其推送到Sidekiq作业,然后实现类似Pubsub的推送器。

据我所知,您无法从服务器端运行客户端javascript。。。但似乎有一个eventlistener,用于通过返回的头检查上传进度。(我假设服务器必须支持这个……)这个站点有一些例子:要考虑的另一个问题是在JavaScript函数中使用回调。这就是你的控制器与客户端javascript通信的方式。谢谢你的回答,任务是通过他们的API将数据从我的应用上传到amazon。在我这边,将数据提交给amazon并不是一项很长的任务,但是,一旦amazon收到数据,他们需要大约5分钟才能告诉您数据上传是否成功。因此,我的应用程序将提交数据,然后使用uid进行提交以检查其状态。我将探索sidekiq,它可能会对这一点有用。非常感谢。嗯。。。在这种情况下,我肯定会考虑某种形式的pubsub。原因是您的前端必须继续轮询您的API,然后再轮询aws,这对于低容量和降低成本来说是很好的。您可以使用aws lambda侦听该事件,然后使用其pubsub通知您的前端以及后端,一旦作业完成并且aws支持Ruby,这是非常可能的。我相信已经有宝石可以做到这一点。