gpt4 book ai didi

javascript - Rails 在渲染后强制重新加载 javascript

转载 作者:行者123 更新时间:2023-11-30 21:11:50 24 4
gpt4 key购买 nike

我在我的 Rails 应用程序中使用了一个表单,最后在我的 Controller 中我检查表单的内容是否正确,如果不正确我再次渲染页面并在顶部解释错误

Controller 的一部分

 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 文件,所以 View 不是我预期的那样

如何在渲染后强制重新加载 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 Controller 。

对于大多数情况,您可以使用 turbolinks:load像你展示的事件,但这不是一个 magix 解决方案,你必须仍然记住你所有的“旧”JavaScript 和 HTML 仍然存在,任何 JavaScript“全局变量”都不会被重置,等等。

如果您想在每个页面上重新加载/执行 JavaScript,只需从您的应用程序中删除 Turbolinks(Gemfileapplication.js)。如果您为您的 CSS/JS 实现了适当的缓存 header 并且没有太多的 JS,则性能差异不会那么大。

如果您出于某种原因只想为特定页面/链接/表单禁用它,您可以添加 data-turbolinks="false" attribute到链接。请记住,这需要位于指向页面的链接上,而不是页面本身。要真正重新加载页面本身,您可以像 location.reload() 那样做,但请记住,在您的呈现/重定向之后,这是一个完整的单独页面重新加载。

如果你真的想强制 JavaScript 重新加载,你可以插入另一个 <script>动态进入 head,但请记住,您的原始 JavaScript 仍在加载,因此这可能会很痛苦。

我注意到 Turbolinks 实际上非常庞大和复杂,因此值得阅读它自己的文档,而不仅仅是 Rails 的小片段。 https://github.com/turbolinks/turbolinks

关于javascript - Rails 在渲染后强制重新加载 javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46056260/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com