Angular 10集成Bootstrap后navbar下拉菜单无法触发问题求助
问题原因及解决方案
组件模板结构错误
Angular 的组件模板(例如你这里的app.component.html)仅为页面局部片段,不允许包含完整的<html>、<head>、<body>这类全局标签,这些内容应该存放在项目根目录的src/index.html中。你当前的写法会导致最终渲染的DOM出现嵌套的html、body标签,直接破坏Bootstrap的事件绑定逻辑。
处理方式:把app.component.html里除了<nav>导航标签和<router-outlet>之外的内容全部删除,对应的全局页面结构迁移到src/index.html中即可。Bootstrap版本属性不兼容
如果你安装的是Bootstrap 5及以上版本,原生交互用的data-*属性已经全部增加了bs命名空间,你代码里写的data-toggle="dropdown"已经失效,需要统一修改为data-bs-toggle="dropdown"。同时Bootstrap 5已经完全移除了对jQuery的依赖,额外引入jQuery反而可能引发脚本冲突,可以把angular.json里的jQuery引入项删除。
如果你使用的是Bootstrap 4版本,这一步可以跳过,只需确保脚本引入顺序为jQuery在前、Bootstrap JS在后即可(你当前配置的顺序是正确的)。重复ID冲突
你页面里两个下拉触发器的ID都设置为了navbardrop,DOM规范要求页面ID必须唯一,重复ID会导致下拉菜单的目标匹配异常,给两个下拉触发器设置不同的唯一ID即可。修改配置后需重启开发服务
修改angular.json文件后必须重启ng serve开发服务,新的配置才会生效,很多配置无误但功能不生效的问题都是因为没有重启服务导致的。
如果做完以上修改还是异常,打开浏览器开发者工具的控制台,检查是否有脚本加载失败、JS报错的提示,针对性处理即可。
更适配Angular生态的可选方案:可以直接使用 Angular 官方适配的 Bootstrap 组件库
@ng-bootstrap/ng-bootstrap,不需要引入jQuery和Bootstrap的JS文件,仅需引入Bootstrap的CSS样式即可,和Angular的生命周期、事件体系完全兼容,不会出现这类原生JS的冲突问题。
内容的提问来源于stack exchange,提问作者Ahmed Fridhi

