我在 Rails 应用程序中使用表单,最后在控制器中检查表单的内容是否正确,如果没有,我再次渲染页面,在错误之上解释
控制器的一部分
if @insertion.save
redirect_to @insertion
else
render 'new'
end
在我看来,我已经用这一行来显示错误。
<% if @insertion.errors.any? %>
<div id="error_explanation">
<div class="alert alert-danger">
The form contains <%= pluralize(@insertion.errors.count, "error") %>.
</div>
<ul>
<% @insertion.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
问题是渲染后页面将不会再次加载我的 javascript 文件,因此视图不符合我的预期
渲染后如何强制重新加载js?
这是我的咖啡文件,由于 Turbolink
$(document).on "turbolinks:load", ->
insertionJS = new Insertion()
if $('.insertions.show').length > 0
console.log("insertions.show")
insertionJS.showJS() .....continue
通过 Turbolinks 的设计,JavaScript 和 CSS 不会重新加载,它将您的链接等转换为 XHR 请求,然后使用响应进行更新<body>
并触发其特殊事件(也是为什么 jQuery$(function() { ... });
Turbolinks 无法按预期工作。由于它执行 XHR,因此它根本不是真正的页面加载,即使它对于 Rails 控制器来说看起来像页面加载。
对于大多数情况你可以使用turbolinks:load
像你展示的事件,但这不是 magix 解决方案,你仍然必须记住所有“旧”JavaScript 和 HTML 仍然存在,任何 JavaScript“全局变量”都不会被重置,等等。
如果您想在每个页面上重新加载/执行 JavaScript,只需从您的应用程序中删除 Turbolinks(Gemfile
, application.js
)。如果你为你的 CSS/JS 实现了正确的缓存头并且没有太多的 JS,那么性能差异并不是那么大。
如果您只是想出于某种原因禁用特定页面/链接/表单,您可以添加data-turbolinks="false"属性 https://github.com/turbolinks/turbolinks#disabling-turbolinks-on-specific-links到链接。请记住,这需要位于指向该页面的链接上,而不是页面本身。为了让页面本身真正重新加载,你可以这样做location.reload()
,但请记住,这是在渲染/重定向之后完全单独的页面重新加载。
如果你真的想强制 JavaScript 重新加载,你可以插入另一个<script>
动态地进入 head,但记住你原来的 JavaScript仍在加载中,所以这可能会很痛苦。
我要指出的是,Turbolinks 实际上相当大且复杂,因此值得阅读它自己的文档,而不仅仅是 Rails 中的小片段。https://github.com/turbolinks/turbolinks https://github.com/turbolinks/turbolinks
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)