我正在重构turbostimulus的Rails控制器,并试图理解如何在Turbo中执行应用程序目前使用JS响应模板所做的事情.

things#show页上,我有一个按钮可以请求thing文本记录的"以前版本".

目前,在rails UJS中,该按钮向things/versions_controller#show操作发送GET JS请求.该操作通过为@versions设置IVAR(包含从数据库中提取的版本文本)进行响应,并呈现一行js模板:

# things/versions/show.js.erb

alert('<%= @versions %>');

有了Turbo,我明白了,模板必须简单地呈现turbo_stream标签和更新/追加/替换页面元素.alert 不在该范围内.

有没有办法把ruby ivar @versions直接传给刺激控制器,这样就可以显示jsalert ?我能想象到的唯一方式是,刺激控制器将处理点击,向things/versions_controller#show操作发出一个FETCH请求(它将给出一个HTML响应),并处理该响应本身.没有涡轮增压.

我想我可以让Turbo Response在页面中打印一个包含@versions的隐藏turbo_frame,并将该框架附加到刺激控制器,该控制器将在框架连接到DOM时立即在alert 中抛出文本.(?)但这似乎过于做作了.

我真的主要是想了解范例,找到做这类事情的最惯用的方式,如果有的话.此外,我意识到alert 是粗糙的,我可以使用模式呈现来实现这一点.

推荐答案

我不太明白刺激措施是怎么涉及到这里的.除了其他答案之外,您还可以创建自定义的Turbo Stream操作,以使alert 操作更好且可重复使用:

// app/javascript/application.js

Turbo.StreamActions.alert = function () {
  alert(this.templateContent.textContent)
};
# config/initializers/turbo_stream_actions.rb

# this is optional but makes it much cleaner
module CustomTurboStreamActions
  def alert text
    action(:alert, "#", text)
  end

  ::Turbo::Streams::TagBuilder.include(self)
end

在您的控制器中使用它来响应TURBO_STREAM个请求:

respond_to do |format|
  format.turbo_stream do
    # without CustomTurboStreamActions module
    # render turbo_stream: turbo_stream.action(:alert, "#", @versions)

    # with CustomTurboStreamActions
    render turbo_stream: turbo_stream.alert(@versions)
  end
end

100

Javascript相关问答推荐

想要检测字符串中的所有单词

为什么JavaScript双边字符串文字插值不是二次的?

如何通过在提交时工作的函数显示dom元素?

是否有方法在OpenWeatherMap API中获取过go 的降水数据?

zoom svg以适应圆

没有输出到带有chrome.Devtools扩展的控制台

如何找出摆线表面上y与x相交的地方?

使用useEffect,axios和useParams进行react测试

如何调用名称在字符串中的实例方法?

cypress中e2e测试上的Click()事件在Switch Element Plus组件上使用时不起作用

加载背景图像时同步旋转不显示的问题

在JS中拖放:检测文件

Html文件和客户端存储的相关问题,有没有可能?

使用VUE和SCSS的数字滚动动画(&;内容生成)

查询参数中的JAVASCRIPT/REACT中的括号

如何利用CSS中的隐藏元素实现平滑扩展和防止网格行间隙

Django导入问题,无法导入我的应用程序,但我已在设置中安装了它

自动滚动功能在当前图像左侧显示上一张图像的一部分

$GTE的mongoose 问题

无法在Adyen自定义卡安全字段创建中使用自定义占位符