Turbo Frames无法从头识别Javascript



我正在构建我的模板,并完成了最初的步骤。我在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)
})

上面的第二部分启用了引导工具提示。

回到我的模板中,我将其分解为三个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{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"}}

导航到此替换的内容时,工具提示将不起作用。但是,当您通过浏览器重新加载FULL页面时,工具提示会突然起作用,因为代码在标题中。

有没有一种方法可以让框架加载必要的Javascript?

基本上,使用Turbo,JS会被添加到头部,而不会在页面加载时进行修改。

所以当你打电话时:

var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))

基本上,它会在JS被附加到应用程序的确切时间搜索DOM中请求的DOM节点。如果你的应用程序刷新了涡轮帧,那么它就不会播放了。请看我最近回复的这个帖子:如何在带有Turbo、ImportMaps和Stimulus的Rails 7应用程序中加载页面特定的自定义Javascript函数?

如果您希望在加载新内容时刷新工具提示,则必须使用Stimulus,将代码放入Stimulus控制器的connect()方法中,并将该控制器连接到应用程序中可能包含工具提示的每个部分。

您还可以将控制器连接到<html>标签并添加突变观察者(https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver)如果你不想在应用程序的许多地方连接刺激控制器,请在connect()方法中使用。(如果你愿意,你也可以在javascript/application.js中添加突变观察员。刺激的目的实际上是防止垃圾邮件中的突变观察员,但如果你有很多工具提示,它仍然是一个可行的解决方案(

最新更新