我有一个相当标准的Rails 5.2应用程序(遵循几乎所有惯例),使用yarn和webpacker,在我的package.json
和yarn.lock
文件中,其中stimulus版本为1.1.1
。
# package.json
{
"name": "MY_APP_NAME",
"private": true,
"dependencies": {
"@rails/webpacker": "^4.0.2",
"coffeescript": "1.12.7",
"stimulus": "^1.1.1"
},
"devDependencies": {
"webpack-dev-server": "^3.2.1"
}
}
从 StimulusJS 的讨论页(https://discourse.stimulusjs.org/t/stimulusjs-and-turbolinks/669)开始,在 Stimulus 1.1 版本之后,使用 Turbolinks 时,stimulus 控制器会在 DOM 准备好后执行 connect/initialize 方法。
然而,我能够使下面的控制器正常执行的唯一方式是添加事件处理程序并等待
turbolinks:load
事件触发。如果相关,请注意,我正在尝试使用 jQuery Select2 插件创建自定义选择元素。
# app/javascript/packs/controllers/intake_customization_controller.js
import { Controller } from "stimulus";
export default class extends Controller {
static targets = [ "userIds" ]
initialize() {
// Code will not execute without this event handler wrapping it...
$(document).on("turbolinks:load", ()=> {
$(this.userIdsTarget).select2()
})
}
}
HTML表单:
<%= form_with model: @account, url: settings_intake_customization_path, method: :put, id: "settings-intake_customization-form", data: { controller: "intake-customization" } do |form| %>
<%= form.collection_select :user_ids, current_account.users, :id, :name, { include_blank: false }, { multiple: true, data: { target: "intake-customization.userIds" } } %>
<% end %>
我在使用turbolinks设置刺激控制器时有什么遗漏吗?
使用事件处理程序,我可以获得所需的功能,但从Discourse论坛上阅读的内容来看,我不需要使用事件处理程序。
即使package.json
中显示为最新版本的Stimulus,我的应用程序是否可能“缓存”了旧版本?
$(this.userIdsTarget).selectpicker()
。使用connect()
是正确的方法。 - Sergio Gonzalez