Rails 渲染后强制重新加载 javascript
Rails force reload of javascript after render
我在我的 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 不会重新加载,它会将您的 links 等转换为 XHR 请求,然后使用响应进行更新<body>
并触发它的特殊事件(也是为什么 jQuery $(function() { ... });
不能按预期使用 Turbolinks。因为它执行 XHR,所以它不是真正的页面加载完全没有,即使它看起来像 Rails 控制器。
在大多数情况下,你可以像你展示的那样使用 turbolinks:load
事件,但这不是一个 magix 解决方案,你必须仍然记住你所有的 "old" JavaScript 和 HTML 仍然存在,任何 JavaScript "globals" 都不会被重置,等等
如果您想在每个页面上显示 reloading/executing JavaScript,只需从您的应用程序中删除 Turbolinks (Gemfile
, application.js
)。如果你为你的 CSS/JS 实现了适当的缓存头并且没有太多的 JS,性能差异并不那么大。
如果您出于某种原因只想针对特定 page/link/form 禁用它,您可以将 data-turbolinks="false"
attribute 添加到 link。请记住,这需要在通向页面的 link 上,而不是页面本身。要真正重新加载页面本身,您可以像 location.reload()
那样做,但请记住,这是在 render/redirect.
之后完全独立的页面重新加载
如果你真的想强制JavaScript重新加载,你可以动态插入另一个<script>
到head,但记住你原来的JavaScript 仍然被加载,所以这可能会很痛苦。
我注意到 Turbolinks 实际上非常庞大和复杂,因此值得阅读它自己的文档,而不仅仅是来自 Rails 的小片段。 https://github.com/turbolinks/turbolinks
我在我的 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 不会重新加载,它会将您的 links 等转换为 XHR 请求,然后使用响应进行更新<body>
并触发它的特殊事件(也是为什么 jQuery $(function() { ... });
不能按预期使用 Turbolinks。因为它执行 XHR,所以它不是真正的页面加载完全没有,即使它看起来像 Rails 控制器。
在大多数情况下,你可以像你展示的那样使用 turbolinks:load
事件,但这不是一个 magix 解决方案,你必须仍然记住你所有的 "old" JavaScript 和 HTML 仍然存在,任何 JavaScript "globals" 都不会被重置,等等
如果您想在每个页面上显示 reloading/executing JavaScript,只需从您的应用程序中删除 Turbolinks (Gemfile
, application.js
)。如果你为你的 CSS/JS 实现了适当的缓存头并且没有太多的 JS,性能差异并不那么大。
如果您出于某种原因只想针对特定 page/link/form 禁用它,您可以将 data-turbolinks="false"
attribute 添加到 link。请记住,这需要在通向页面的 link 上,而不是页面本身。要真正重新加载页面本身,您可以像 location.reload()
那样做,但请记住,这是在 render/redirect.
如果你真的想强制JavaScript重新加载,你可以动态插入另一个<script>
到head,但记住你原来的JavaScript 仍然被加载,所以这可能会很痛苦。
我注意到 Turbolinks 实际上非常庞大和复杂,因此值得阅读它自己的文档,而不仅仅是来自 Rails 的小片段。 https://github.com/turbolinks/turbolinks