无法在 Bootstrap 中切换导航栏 4 在 Angular 中
Can't Toggle Navbar in Bootstrap 4 in Angular
为什么我在 angular 4 中使用 bootstrap 4 调整到移动屏幕大小时无法切换导航栏。我将它包含在脚本和样式的 angular cli 中,节点来自 bootstrap 的模块。我的代码中是否缺少某些内容?请检查以下内容。有什么不对?请帮助
<nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
<a class="navbar-brand" href="#">Dashboard</a>
<button class="navbar-toggler d-lg-none" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarsExampleDefault">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Settings</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Profile</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Help</a>
</li>
</ul>
<form class="form-inline mt-2 mt-md-0">
<input class="form-control mr-sm-2" type="text" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>
</div>
</nav>
.angular-cli.json
"styles": [
"styles.css",
"../node_modules/bootstrap/dist/css/bootstrap.min.css"
],
"scripts": [
"../node_modules/popper.js/dist/umd/popper.min.js",
"../node_modules/jquery/dist/jquery.min.js",
"../node_modules/bootstrap/dist/js/bootstrap.min.js"
],
package.json
{
"name": "dashboard2",
"version": "0.0.0",
"license": "MIT",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
"private": true,
"dependencies": {
"@angular/animations": "^4.0.0",
"@angular/common": "^4.0.0",
"@angular/compiler": "^4.0.0",
"@angular/core": "^4.0.0",
"@angular/forms": "^4.0.0",
"@angular/http": "^4.0.0",
"@angular/platform-browser": "^4.0.0",
"@angular/platform-browser-dynamic": "^4.0.0",
"@angular/router": "^4.0.0",
"bootstrap": "^4.0.0-beta",
"core-js": "^2.4.1",
"jquery": "^3.2.1",
"popper.js": "^1.12.5",
"rxjs": "^5.4.1",
"zone.js": "^0.8.14"
},
"devDependencies": {
"@angular/cli": "1.2.7",
"@angular/compiler-cli": "^4.0.0",
"@angular/language-service": "^4.0.0",
"@types/jasmine": "~2.5.53",
"@types/jasminewd2": "~2.0.2",
"@types/node": "~6.0.60",
"codelyzer": "~3.0.1",
"jasmine-core": "~2.6.2",
"jasmine-spec-reporter": "~4.1.0",
"karma": "~1.7.0",
"karma-chrome-launcher": "~2.1.1",
"karma-cli": "~1.0.1",
"karma-coverage-istanbul-reporter": "^1.2.1",
"karma-jasmine": "~1.1.0",
"karma-jasmine-html-reporter": "^0.2.2",
"protractor": "~5.1.2",
"ts-node": "~3.0.4",
"tslint": "~5.3.2",
"typescript": "~2.3.3"
}
}
@Joseph,看起来您还没有安装 bootstrap(和 bootstrap 本身)的依赖项以使导航栏切换正常工作。
如果您打开终端或命令行并导航到包含您的 package.json
文件的目录,运行 以下命令:
npm install --save jquery
npm install --save popper.js
npm install --save bootstrap@4.0.0-beta
这些命令将为您的项目安装必要的依赖项。他们在做什么时相当明确,但如果您需要重新了解他们在做什么或如何工作,我建议您查看位于 here 的 npm install
的文档。
安装后,您需要确保将它们包含在您的 .angular-cli.json 文件中,这样您的 angular 应用程序就可以使用它们.
看起来您可能一直在查看 Bootstrap 中的 this 示例。我做到了,也遇到了同样的问题。
问题是它不是 angular 示例,因此无法正常工作。要使其工作,您必须使用 (click)
事件和一个变量。所以将模板更改为
<nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
<a class="navbar-brand" href="#">Dashboard</a>
<button class="navbar-toggler d-lg-none" type="button" (click)="isCollapsed = !isCollapsed" [attr.aria-expanded]="!isCollapsed" aria-controls="navbarsExampleDefault" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarsExampleDefault" [ngbCollapse]="isCollapsed">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Settings</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Profile</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Help</a>
</li>
</ul>
<form class="form-inline mt-2 mt-md-0">
<input class="form-control mr-sm-2" type="text" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>
</div>
</nav>
如果您希望菜单默认折叠,您应该在 class(在组件的 .ts 文件中)中将变量设置为 true public isCollapsed = true;
这是一个plunker
还有一件事;如果你的导航在共享模块中,你必须记得在这里也导入 NgbCollapseModule。
也就是说,你的shared.module.ts应该是:
import { NgModule } from '@angular/core';
import { NgbCollapseModule } from '@ng-bootstrap/ng-bootstrap';
/*Plus all your other modules*/
@NgModule({
imports: [NgbCollapseModule],
declarations: [],
exports: []
})
export class SharedModule {}
此示例提供汉堡包图标的切换功能(换句话说,如果它 运行 处于响应模式,则整个导航栏都具有切换功能)以及下拉菜单项的切换功能。
它使用 ng-bootstrap 但我宁愿使用原生 Bootstrap 导航栏支持而不是这样做 "hacks"!?
显然其他人也在为同样的问题而苦苦挣扎:https://github.com/twbs/bootstrap/issues/24227
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="#">ApplicationName</a>
<button class="navbar-toggler" type="button" (click)="toggleNavbar = !toggleNavbar">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" [ngbCollapse]="!toggleNavbar">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Features</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Pricing</a>
</li>
<li ngbDropdown class="nav-item">
<a class="nav-link" id="navbarDropdownMenuLink" ngbDropdownToggle aria-haspopup="true" aria-expanded="false">
Dropdown link
</a>
<div ngbDropdownMenu aria-labelledby="navbarDropdownMenuLink">
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<a class="dropdown-item" href="#">Something else here</a>
</div>
</li>
</ul>
</div>
</nav>
如果你想让 Angular 使用 Bootstrap 4 而不是使用 @ng-bootstrap,请参阅此 git 存储库中的代码:https://github.com/fmorriso/Angular-bootstrap4-nav/tree/master/src/app/navigation
我为此浪费了太多时间。你必须破解 Angular 才能让它工作;这不仅仅是版本不正确等问题
如前所述,您需要一个 属性(例如 isShown,它最初是错误的)
然后使用
[ngClass]="{ 'show': isShown }"
此处
<div class="collapse navbar-collapse" [ngClass]="{ 'show': isShown }" id="navbarSupportedContent" >
link 上的点击事件确保菜单在 link 之后再次折叠
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-header',
templateUrl: './header.component.html',
styleUrls: ['./header.component.css']
})
export class HeaderComponent implements OnInit {
isShown:boolean = false;
constructor() { }
ngOnInit() {
}
}
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" routerLink="/"><img width="20%" src="/assets/logo.svg"></a>
<button #navbarToggler class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" (click)="isShown = !isShown" [attr.aria-expanded]="isShown" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" [ngClass]="{ 'show': isShown }" id="navbarSupportedContent" >
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" (click)="isShown = false" routerLink="/">Home <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" (click)="isShown = false" routerLink="/contact">Contact</a>
</li>
<li class="nav-item">
<a class="nav-link" (click)="isShown = false" routerLink="/imprint">Imprint</a>
</li>
</ul>
</div>
</nav>
要使切换在 angular 中正常工作,您只需做 4 件事
- 安装 ng boostrap
- 向导航栏开关添加切换点击监听器
(click)="isCollapsed = !isCollapsed"
- 使用 属性 绑定到 aria-expanded,
[attr.aria-expanded]="!isCollapsed"
这样 属性 将在您单击时更改(true 或 false)
- 以同样的方式使用 属性 绑定到 ngCollapse
[ngbCollapse]="isCollapsed"
NB: using JQuery is not adviced
这对我有用!!!
现在我们可以在 angular 4 使用 bootstrap 4.
调整到移动屏幕时切换导航栏
试试这个代码
app.component.html
<nav class="navbar navbar-expand-lg justify-content-between">
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation" id="navButton">
<i class="fa fa-bars"></i>
</button>
<div class="row">
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav ml-auto">
<li class="nav-item" *ngFor="let menu of mainmenu, let i = index">
<a class="nav-link" (click)="findIndex(i)" routerLink="/{{menu.href}}">{{menu.icon}} {{menu.text}}</a>
<ng-container *ngIf="menu.children && menu.children.length > 0">
<span class="d-block d-sm-none"><i class="fa fa-chevron-down" aria-hidden="true"></i></span>
</ng-container>
<ul class="sub_menu dropdown-menu" [ngClass]="{active : isActive(i)}" *ngIf="menu.children && menu.children.length > 0">
<li *ngFor="let sub_menu of menu.children"><a class="nav-link" routerLink="/{{sub_menu.href}}" (click)="closeMenu()"><img src="{{sub_menu.icon}}" class="nav-img" /> {{sub_menu.text}}</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
app.component.ts
closeMenu() {
var isMobile = /iPhone|iPad|iPod|BlackBerry|Opera Mini|IEMobile|Android/i.test(navigator.userAgent);
if (isMobile) {
document.getElementById('navButton').click();
}
}
我不知道这是否仍然相关,但当我遇到这个问题时帮助我的是停止实时服务器,然后重新编译应用程序并使用 ng 服务再次启动它。有时,当您在服务器为 运行 时安装依赖项时,即使您插入依赖项,angular.json 也看不到它们。也许对于未来的用户
如果有人正在寻找动态切换导航栏的方法
您可以使用 ViewChild 和模板变量来获取对按钮的引用,然后您可以触发点击事件:
HTML
<button #menu class="navbar-toggler d-lg-none" type="button"
data-toggle="collapse" data-target="#navbarsExampleDefault"
aria-controls="navbarsExampleDefault" aria-expanded="false"
aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
TS
import { ViewChild, ElementRef } from '@angular/core';
@ViewChild('menu') menu: ElementRef;
toggleMenu() {
this.menu.nativeElement.click();
}
closeMenu() {
const isMenuOpen = this.menu.nativeElement.getAttribute('aria-expanded') === 'true';
if (isMenuOpen) {
this.menu.nativeElement.click();
}
}
我知道这不是这个问题的答案,但它非常相关并且可能会有所帮助。
Bootstrap - 4.4.1,Angular-cli:7.3.9
最简单的方法是在您的客户端入口点导入 js 包:
进口'bootstrap/dist/js/bootstrap.bundle';行到 'polyfills.ts' 文件
效果非常好试试这个
<nav class="navbar navbar-expand-md navbar-light">
<a>Home</a>
<button
class="navbar-toggler d-lg-none"
type="button"
data-toggle="collapse"
(click)="isShown=!isShown"
>
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" [ngClass]="{ 'show': isShown }">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="#">About</a>
</li>
</ul>
</div>
</nav>
对应的ts文件为
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
// title = 'WebApp';
isShown = false;
}
为什么我在 angular 4 中使用 bootstrap 4 调整到移动屏幕大小时无法切换导航栏。我将它包含在脚本和样式的 angular cli 中,节点来自 bootstrap 的模块。我的代码中是否缺少某些内容?请检查以下内容。有什么不对?请帮助
<nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
<a class="navbar-brand" href="#">Dashboard</a>
<button class="navbar-toggler d-lg-none" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarsExampleDefault">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Settings</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Profile</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Help</a>
</li>
</ul>
<form class="form-inline mt-2 mt-md-0">
<input class="form-control mr-sm-2" type="text" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>
</div>
</nav>
.angular-cli.json
"styles": [
"styles.css",
"../node_modules/bootstrap/dist/css/bootstrap.min.css"
],
"scripts": [
"../node_modules/popper.js/dist/umd/popper.min.js",
"../node_modules/jquery/dist/jquery.min.js",
"../node_modules/bootstrap/dist/js/bootstrap.min.js"
],
package.json
{
"name": "dashboard2",
"version": "0.0.0",
"license": "MIT",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
"private": true,
"dependencies": {
"@angular/animations": "^4.0.0",
"@angular/common": "^4.0.0",
"@angular/compiler": "^4.0.0",
"@angular/core": "^4.0.0",
"@angular/forms": "^4.0.0",
"@angular/http": "^4.0.0",
"@angular/platform-browser": "^4.0.0",
"@angular/platform-browser-dynamic": "^4.0.0",
"@angular/router": "^4.0.0",
"bootstrap": "^4.0.0-beta",
"core-js": "^2.4.1",
"jquery": "^3.2.1",
"popper.js": "^1.12.5",
"rxjs": "^5.4.1",
"zone.js": "^0.8.14"
},
"devDependencies": {
"@angular/cli": "1.2.7",
"@angular/compiler-cli": "^4.0.0",
"@angular/language-service": "^4.0.0",
"@types/jasmine": "~2.5.53",
"@types/jasminewd2": "~2.0.2",
"@types/node": "~6.0.60",
"codelyzer": "~3.0.1",
"jasmine-core": "~2.6.2",
"jasmine-spec-reporter": "~4.1.0",
"karma": "~1.7.0",
"karma-chrome-launcher": "~2.1.1",
"karma-cli": "~1.0.1",
"karma-coverage-istanbul-reporter": "^1.2.1",
"karma-jasmine": "~1.1.0",
"karma-jasmine-html-reporter": "^0.2.2",
"protractor": "~5.1.2",
"ts-node": "~3.0.4",
"tslint": "~5.3.2",
"typescript": "~2.3.3"
}
}
@Joseph,看起来您还没有安装 bootstrap(和 bootstrap 本身)的依赖项以使导航栏切换正常工作。
如果您打开终端或命令行并导航到包含您的 package.json
文件的目录,运行 以下命令:
npm install --save jquery
npm install --save popper.js
npm install --save bootstrap@4.0.0-beta
这些命令将为您的项目安装必要的依赖项。他们在做什么时相当明确,但如果您需要重新了解他们在做什么或如何工作,我建议您查看位于 here 的 npm install
的文档。
安装后,您需要确保将它们包含在您的 .angular-cli.json 文件中,这样您的 angular 应用程序就可以使用它们.
看起来您可能一直在查看 Bootstrap 中的 this 示例。我做到了,也遇到了同样的问题。
问题是它不是 angular 示例,因此无法正常工作。要使其工作,您必须使用 (click)
事件和一个变量。所以将模板更改为
<nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
<a class="navbar-brand" href="#">Dashboard</a>
<button class="navbar-toggler d-lg-none" type="button" (click)="isCollapsed = !isCollapsed" [attr.aria-expanded]="!isCollapsed" aria-controls="navbarsExampleDefault" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarsExampleDefault" [ngbCollapse]="isCollapsed">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Settings</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Profile</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Help</a>
</li>
</ul>
<form class="form-inline mt-2 mt-md-0">
<input class="form-control mr-sm-2" type="text" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>
</div>
</nav>
如果您希望菜单默认折叠,您应该在 class(在组件的 .ts 文件中)中将变量设置为 true public isCollapsed = true;
这是一个plunker
还有一件事;如果你的导航在共享模块中,你必须记得在这里也导入 NgbCollapseModule。
也就是说,你的shared.module.ts应该是:
import { NgModule } from '@angular/core';
import { NgbCollapseModule } from '@ng-bootstrap/ng-bootstrap';
/*Plus all your other modules*/
@NgModule({
imports: [NgbCollapseModule],
declarations: [],
exports: []
})
export class SharedModule {}
此示例提供汉堡包图标的切换功能(换句话说,如果它 运行 处于响应模式,则整个导航栏都具有切换功能)以及下拉菜单项的切换功能。
它使用 ng-bootstrap 但我宁愿使用原生 Bootstrap 导航栏支持而不是这样做 "hacks"!?
显然其他人也在为同样的问题而苦苦挣扎:https://github.com/twbs/bootstrap/issues/24227
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="#">ApplicationName</a>
<button class="navbar-toggler" type="button" (click)="toggleNavbar = !toggleNavbar">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" [ngbCollapse]="!toggleNavbar">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Features</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Pricing</a>
</li>
<li ngbDropdown class="nav-item">
<a class="nav-link" id="navbarDropdownMenuLink" ngbDropdownToggle aria-haspopup="true" aria-expanded="false">
Dropdown link
</a>
<div ngbDropdownMenu aria-labelledby="navbarDropdownMenuLink">
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<a class="dropdown-item" href="#">Something else here</a>
</div>
</li>
</ul>
</div>
</nav>
如果你想让 Angular 使用 Bootstrap 4 而不是使用 @ng-bootstrap,请参阅此 git 存储库中的代码:https://github.com/fmorriso/Angular-bootstrap4-nav/tree/master/src/app/navigation
我为此浪费了太多时间。你必须破解 Angular 才能让它工作;这不仅仅是版本不正确等问题
如前所述,您需要一个 属性(例如 isShown,它最初是错误的) 然后使用
[ngClass]="{ 'show': isShown }"
此处
<div class="collapse navbar-collapse" [ngClass]="{ 'show': isShown }" id="navbarSupportedContent" >
link 上的点击事件确保菜单在 link 之后再次折叠
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-header',
templateUrl: './header.component.html',
styleUrls: ['./header.component.css']
})
export class HeaderComponent implements OnInit {
isShown:boolean = false;
constructor() { }
ngOnInit() {
}
}
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" routerLink="/"><img width="20%" src="/assets/logo.svg"></a>
<button #navbarToggler class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" (click)="isShown = !isShown" [attr.aria-expanded]="isShown" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" [ngClass]="{ 'show': isShown }" id="navbarSupportedContent" >
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" (click)="isShown = false" routerLink="/">Home <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" (click)="isShown = false" routerLink="/contact">Contact</a>
</li>
<li class="nav-item">
<a class="nav-link" (click)="isShown = false" routerLink="/imprint">Imprint</a>
</li>
</ul>
</div>
</nav>
要使切换在 angular 中正常工作,您只需做 4 件事
- 安装 ng boostrap
- 向导航栏开关添加切换点击监听器
(click)="isCollapsed = !isCollapsed"
- 使用 属性 绑定到 aria-expanded,
[attr.aria-expanded]="!isCollapsed"
这样 属性 将在您单击时更改(true 或 false) - 以同样的方式使用 属性 绑定到 ngCollapse
[ngbCollapse]="isCollapsed"
NB: using JQuery is not adviced
这对我有用!!!
现在我们可以在 angular 4 使用 bootstrap 4.
调整到移动屏幕时切换导航栏试试这个代码
app.component.html
<nav class="navbar navbar-expand-lg justify-content-between">
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation" id="navButton">
<i class="fa fa-bars"></i>
</button>
<div class="row">
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav ml-auto">
<li class="nav-item" *ngFor="let menu of mainmenu, let i = index">
<a class="nav-link" (click)="findIndex(i)" routerLink="/{{menu.href}}">{{menu.icon}} {{menu.text}}</a>
<ng-container *ngIf="menu.children && menu.children.length > 0">
<span class="d-block d-sm-none"><i class="fa fa-chevron-down" aria-hidden="true"></i></span>
</ng-container>
<ul class="sub_menu dropdown-menu" [ngClass]="{active : isActive(i)}" *ngIf="menu.children && menu.children.length > 0">
<li *ngFor="let sub_menu of menu.children"><a class="nav-link" routerLink="/{{sub_menu.href}}" (click)="closeMenu()"><img src="{{sub_menu.icon}}" class="nav-img" /> {{sub_menu.text}}</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
app.component.ts
closeMenu() {
var isMobile = /iPhone|iPad|iPod|BlackBerry|Opera Mini|IEMobile|Android/i.test(navigator.userAgent);
if (isMobile) {
document.getElementById('navButton').click();
}
}
我不知道这是否仍然相关,但当我遇到这个问题时帮助我的是停止实时服务器,然后重新编译应用程序并使用 ng 服务再次启动它。有时,当您在服务器为 运行 时安装依赖项时,即使您插入依赖项,angular.json 也看不到它们。也许对于未来的用户
如果有人正在寻找动态切换导航栏的方法 您可以使用 ViewChild 和模板变量来获取对按钮的引用,然后您可以触发点击事件:
HTML
<button #menu class="navbar-toggler d-lg-none" type="button"
data-toggle="collapse" data-target="#navbarsExampleDefault"
aria-controls="navbarsExampleDefault" aria-expanded="false"
aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
TS
import { ViewChild, ElementRef } from '@angular/core';
@ViewChild('menu') menu: ElementRef;
toggleMenu() {
this.menu.nativeElement.click();
}
closeMenu() {
const isMenuOpen = this.menu.nativeElement.getAttribute('aria-expanded') === 'true';
if (isMenuOpen) {
this.menu.nativeElement.click();
}
}
我知道这不是这个问题的答案,但它非常相关并且可能会有所帮助。
Bootstrap - 4.4.1,Angular-cli:7.3.9
最简单的方法是在您的客户端入口点导入 js 包:
进口'bootstrap/dist/js/bootstrap.bundle';行到 'polyfills.ts' 文件
效果非常好试试这个
<nav class="navbar navbar-expand-md navbar-light">
<a>Home</a>
<button
class="navbar-toggler d-lg-none"
type="button"
data-toggle="collapse"
(click)="isShown=!isShown"
>
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" [ngClass]="{ 'show': isShown }">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="#">About</a>
</li>
</ul>
</div>
</nav>
对应的ts文件为
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
// title = 'WebApp';
isShown = false;
}