我刚刚转换到了Rails 6 (6.0.0.rc1),默认使用Webpacker gem来处理JavaScript资产,与Rails-UJS一起使用。我想在一些模块中使用Rails UJS,以便通过函数提交表单:
const form = document.querySelector("form")
Rails.fire(form, "submit")
在之前安装了Webpacker的Rails版本中,我的模块中似乎可以“全局”使用
Rails
引用,但现在调用Rails.fire
时出现了这个问题...ReferenceError: Rails is not defined
我应该如何使来自
@rails/ujs
的Rails
对于我的特定模块或所有模块都可用?以下是我的设置...
app/javascript/controllers/form_controller.js
import { Controller } from "stimulus"
export default class extends Controller {
// ...
submit() {
const form = this.element
Rails.fire(form, "submit")
}
// ...
}
app/javascript/controllers.js
// Load all the controllers within this directory and all subdirectories.
// Controller files must be named *_controller.js.
import { Application } from "stimulus"
import { definitionsFromContext } from "stimulus/webpack-helpers"
const application = Application.start()
const context = require.context("controllers", true, /_controller\.js$/)
application.load(definitionsFromContext(context))
app/javascript/packs/application.js
require("@rails/ujs").start()
import "controllers"
谢谢!
form_controller.js
,以便在多个Rails应用程序中重复使用它。在不同的控制器中多次执行import Rails from "@rails/ujs"
是否有任何缺点?如果没有,我会将其标记为已接受的答案。 - R4ttlesnake@rails/ujs
。每个控制器都简单地得到相同的Rails
导出,即使你使用不同的名称导入它,或者使用CommonJS的require()
而不是ES6的import
。请注意,只需在application.js
中调用一次.start()
。 - inopinatusRails
特别是在全局空间中使用比较满意,因为它是一个实用库,抽象了常见的功能(比如 AJAX 请求),而这些功能我需要一直使用。我认为它类似于 jQuery;我不想在每个 JS 文件中都导入 jQuery,因为 jQuery 是我用来构建真正应用代码的工具。话虽如此,像你所提到的避免全局变量还是有很多智慧的。 - Dan L