Не могу переключиться. Загрузчик 5 js не инициализирован должным образом?

#javascript #ruby-on-rails #twitter-bootstrap #webpacker #bootstrap-5

Вопрос:

У меня проблема с моей реализацией начальной загрузки 5.0.0-beta2. Я могу развернуть свои навигационные панели и аккордеоны, но не сворачивать их.

Похоже, это проблема с инициализацией js.

Потому что, если я загружу страницу, на которой нет элементов, а затем перейду на страницу, на которой есть (мои страницы не перезагружаются, потому что я использую hotwire/Turbo) Я могу как расширять, так и сворачивать их. Хотя эти ошибки выводятся на консоль при переключении:

 Uncaught TypeError: No method named "toggle"
    at Function.collapseInterface (bootstrap.bundle.js:1942)
    at bootstrap.bundle.js:2001
    at Array.forEach (<anonymous>)
    at HTMLButtonElement.<anonymous> (bootstrap.bundle.js:1985)
    at HTMLDocument.handler (bootstrap.bundle.js:414)
 

Есть идеи, что я должен сделать по-другому?

Я использую webpack для упаковки своих активов для своего приложения Ruby on Rails (используя драгоценный камень webpacker). Вот моя настройка вебпакера:

 // app/javascript/packs/application.js

import Rails from "@rails/ujs"
import { Turbo } from "@hotwired/turbo-rails"
import "bootstrap"
import "../stylesheets/application"
window.Turbo = Turbo
window.bootstrap = require('bootstrap/dist/js/bootstrap.bundle.js')
Rails.start()
 
 /* app/javascript/stylesheets/application.scss */

@import "~bootstrap/scss/bootstrap";
 
 // config/webpack/environment.js

const { environment } = require('@rails/webpacker')
const webpack = require('webpack')
environment.plugins.prepend(
  'Provide',
  new webpack.ProvidePlugin({
    Rails: '@rails/ujs',
    Popper: ['popper.js', 'default']
  })
)
module.exports = environment

 

Кроме того, я делюсь несколькими изображениями, чтобы показать переходы, которые происходят при переключении после перезагрузки страницы.

Мое первоначальное состояние выглядит так.

Исходное состояние

При переключении навигационной панели она переходит, как и ожидалось:

Расширяющееся состояние

Он заканчивается в расширенном состоянии:

Расширенное состояние

Но когда я нажимаю значок навигатора, навигационная панель не сворачивается. Вместо этого он переходит в расширяющееся состояние (второе изображение) и заканчивается в расширенном состоянии (третье изображение).

Комментарии:

1. Попробуйте измениться window.bootstrap = require(...) , import * from 'bootstrap' может быть, это вам поможет.

Ответ №1:

Просто попробовал Bootstrap 5.0.0-beta2 , Rails 6.1 с вашим кодом конфигурации.

Проблема, похоже, в том, как вы загружаете bootstrap объект, то есть строку:

 // Conflict somehow
window.bootstrap = require('bootstrap/dist/js/bootstrap.bundle.js')
 

Вы могли бы использовать const require или import вместо этого из Doc:

const bootstrap = требуется(‘bootstrap’) или импорт начальной загрузки из ‘начальной загрузки’ загрузит все плагины начальной загрузки в объект начальной загрузки.

 const bootstrap = require('bootstrap') // or
import bootstrap from 'bootstrap'
 

Или вы можете загрузить bootstrap объект глобально:

 // config/webpack/environment.js
const { environment } = require('@rails/webpacker')
const webpack = require('webpack')

environment.plugins.prepend(
  'Provide',
  new webpack.ProvidePlugin({
    Rails: '@rails/ujs',
    Popper: ['popper.js', 'default'],
    bootstrap: ['bootstrap']
  })
)

module.exports = environment
 

Комментарии:

1. Отлично @eux обе эти строки решают проблему. Только это вызывает другие проблемы. Если я ссылаюсь bootstrap на свои собственные файлы js, я получаю Uncaught ReferenceError: bootstrap is not defined . Например, у меня есть файл, который я включаю следующим образом: import "../javascripts/bootstrap_toast" и из этого файла я запускаю new bootstrap.Toast(my_toast_elm, {}).show(); . Итак, как мне поделиться новой bootstrap константой с более широким охватом?

2. Вы можете загрузить bootstrap объект глобально , как «Поппер» config/webpack/environment.js , ознакомьтесь с подробностями обновленного ответа.

3. Отлично, это сработало. Можете присудить награду в течение 10 часов 🙂

4. Рад помочь : )