javascript - Rails 6 - 加载自定义 JS 文件的正确方法是什么?
问题描述
我很难正确配置和设置我自己的 JS 文件,其中包含用于特定任务的 JS 函数。
我浏览了一些文章,发现我需要将我的自定义 JS 放到 JS packs 文件夹 -> app/javascript/packs/currency_calculations.js
:
货币计算.js:
function convert_curr(from, to) {
...
}
function show_convertion(curr) {
...
}
...
然后我尝试将此自定义 JS 文件添加到app/javascript/packs/application.js
:
import Rails from "@rails/ujs";
import "@hotwired/turbo-rails";
import * as ActiveStorage from "@rails/activestorage";
import "channels";
import "controllers";
Rails.start();
ActiveStorage.start();
import "stylesheets/application";
// my custom JS file
import "packs/currency_calculations" // I also tried import "currency_calculations" -- same result
我还尝试将以下内容添加到application.html.erb文件中:
= javascript_pack_tag 'currency_calculations'
它也没有用。
我仍然收到此错误:
Uncaught Error: Cannot find module 'currency_calculations'
当尝试从视图调用函数时,然后:
Uncaught ReferenceError: convert_curr is not defined
连接它的正确方法是什么?我从 Rails 5 开始使用将我所有的 JS 函数放到一个 js 文件中,而这个文件只是为了添加到这样的文件中app/assets/javascripts/application.js
:
//= require currency_calculations
然后,在一个视图中,我可以简单地调用想要的 JS 函数,如convert_curr("a", "b")
.
先感谢您。
解决方案
在 Rails 6 中有几种方法可以做到这一点。
第一个是创建一个自定义目录并在 application.js 文件中要求它。在这种情况下,您可以创建一个这样的目录:
app/javascript/custom/currency_calculations.js
然后你需要在你的 application.js 文件中要求它:
// app/javascript/packs/application.js
// ...
require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")
require("custom/currency_calculations")
如果您将自定义文件夹命名为“货币”,然后将 .js 文件命名为 index.js,则同样的方法也可以简化。
然后你可以这样称呼它:
require("currency")
Require 默认会在文件夹中查找索引文件。但在这种情况下,必须存在索引文件,否则它将失败。
如果您不希望 JS 与其他所有内容一起编译,另一种方法是使用 javascript_pack_tag。
在这种情况下,将 js 文件添加到您的 app/javascript/packs 目录。然后在需要的地方使用 pack 标签助手,例如:
<%= javascript_pack_tag 'currency_converter' %>
我要提到的最后一件事...您确定不需要其他库来使其工作(例如 JQuery)吗?在这种情况下,您需要先安装该库并将其导入您的 application.js,然后再调用您尝试执行的 js 文件。
推荐阅读
- c# - 如何从 IdentityDbContext 和 ApplicationDbContext 连接表
- r - 用于测试组内均值显着性的 R 函数
- javascript - 使用html将新的li html附加到页面时无法准确获取li标签的高度
- sql - 带有动态最后的 Spark 高级窗口
- php - 重新说明 php 的 feof() 是如何工作的
- testing - 如何启动和暂停 jmeter 测试计划运行
- flutter - 颤动的 StaggeredGridView 在条件下显示图块
- macos - macOS 下使用 pip install pytorch 失败
- amazon-web-services - AWS DynamoDB 与 AWS DocumentDB(新推出的服务)之间的区别?
- jquery - VisJS 网络未居中