我正在构建我的模板,并有了初步的步骤。我在Rails上7.0.2.4,turbo-rails 1.1.1,Bootstrap 5。
在我的布局模板中,我有以下内容:
= javascript_include_tag "application", data:{turbo:{track: "reload"}}, defer: true
哪些链接到我的app/javascript/application.js,这里的相关部分是:
import * as bootstrap from "bootstrap"
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl)
})
上面的第二部分启用了Bootstrap工具提示。
回到我的模板,我将其分解为三个Turbo帧:
%turbo-frame{id: "main_frame", data:{turbo:{action: "advance"}}}
.container-fluid
.row.flex-nowrap
.col-auto.col-md-3.col-xl-2.px-sm-2.px-0.bg-dark
%turbo-frame{id: "sidebar", data:{turbo:{action: "advance"}}}
.col
%turbo-frame{id: "content", data:{turbo:{action: "advance"}}}
= yield
首先是main_frame,它被分为边栏和内容框架。点击边栏中的链接,其中包含日期-turbo-frame:“content”属性,将内容框架与所需内容交换。
现在,在大多数完整内容框架上,该框架的顶部都有一个导航标题,该标题的左右两侧各有一个按钮,中间有文本:
%turbo-frame{id: "content", data:{turbo:{action: "advance"}}}
.row
.d-flex
.p-2
%a{href: path, data:{turbo:{frame: "content"},
bs:{toggle: "tooltip", placement: "bottom",
title: "Back"}},
aria:{label: "Back"}}
%i.bi.bi-arrow-left-circle-fill{aria:{hidden: "true"}}
.flex-grow-1
// Some Text
.p-2
%a{href: new_path, data:{turbo:{frame: "new"},
bs:{toggle: "tooltip", placement: "bottom",
title: "New"}},
aria:{label: "New"}}
%i.bi.bi-plus{aria:{hidden: "true"}}
当您导航到这个被替换的内容时,工具提示不起作用。但是,当您通过浏览器重新加载整个页面时,工具提示突然起作用了,因为代码在头部。
有没有办法让框架加载必要的Javascript?
1条答案
按热度按时间mnemlml81#
基本上与涡轮增压你的JS是添加到头部,而不是修改跨页面加载。
所以当你叫:
基本上,它会在你的JS被添加到应用程序的时候,在DOM中搜索所请求的DOM节点。如果你的应用程序刷新了一个turbo帧,那么它就不会被播放。请看我最近回复的这个帖子:如何加载页面特定的自定义Javascript函数在Rails 7应用程序与Turbo,ImportMaps和刺激?
如果您希望在加载新内容时刷新工具提示,则必须使用Stimulus,将代码放入Stimulus控制器的
connect()
方法中,并将该控制器附加到可能包含工具提示的应用程序的每个部分。您还可以将控制器附加到
<html>
标签并添加一个突变观察器(https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver),如果您不想在应用中的多个位置连接Stimulus控制器。(如果你愿意的话,你也可以在javascript/application.js
中添加突变观察者。刺激的目的实际上是为了防止垃圾邮件突变观察者,但如果你有很多工具提示,它仍然是可行的解决方案)