Bootstrap 下拉列表 Angular 6
Bootstrap dropdown with Angular 6
我正在尝试使用 Angular 在 Bootstrap 导航栏中创建一个下拉项 6. 我的代码在我在线测试时工作正常:
<nav class="navbar bg-light navbar-light navbar-expand">
<ul class="navbar-nav">
<li class="nav-item dropdown" >
<a class="nav-link dropdown-toggle" data-toggle="dropdown">Page1</a>
<div class="dropdown-menu">
<a class="dropdown-item" href="#">Page1.1</a>
</div>
</li>
<li><a class="nav-link" href="#">Page2</a></li>
</ul>
</nav>
但是下拉菜单不适用于 Angular 6. 为了将 Bootstrap 与 Angular 一起使用,我使用了以下方法:
ng add @ng-bootstrap/schematics
除那个下拉项外,一切正常!
给你...
我做了以下更改 -
1. app.component.html
<p>
Start editing to see some magic happen :)
</p>
<nav class="navbar bg-light navbar-light navbar-expand">
<ul class="nav navbar-nav">
<li class="dropdown" appDropdown>
<a href="#" class="dropdown-toggle" role="button">Page1</a>
<ul class="dropdown-menu">
<li><a href="#">Page1.1</a></li>
<li><a href="#">Page1.2</a></li>
<li><a href="#">Page1.3</a></li>
</ul>
</li>
<li><a class="nav-link" href="#">Page2</a></li>
</ul>
</nav>
2。 app.module.ts
我添加了一个指令来侦听下拉菜单的点击事件,并在 app.module.ts
中导入了相同的指令
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
import { HelloComponent } from './hello.component';
import { DropdownDirective } from './dropdown.directive';
@NgModule({
imports: [ BrowserModule, FormsModule ],
declarations: [ AppComponent, HelloComponent, DropdownDirective ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
3。 dropdown.directive.ts
添加了监听点击事件的指令
import { Directive, HostListener, ElementRef, Renderer2 } from "@angular/core";
@Directive({
selector: '[appDropdown]'
})
export class DropdownDirective {
manageDropdown : boolean = false;
constructor(private elementRef: ElementRef, private renderer: Renderer2) {
}
@HostListener('click') openDropdown(eventData: Event) {
if(!this.manageDropdown) {
this.renderer.addClass(this.elementRef.nativeElement,'open');
this.manageDropdown = !this.manageDropdown;
} else {
this.renderer.removeClass(this.elementRef.nativeElement, 'open');
this.manageDropdown = !this.manageDropdown;
}
}
}
4。 angular.json
请求您 "npm install --save bootstrap@3" 并在 angular.json 文件中进行以下更改。
"styles": [
"src/styles.css",
"../node_modules/bootstrap/dist/css/bootstrap.min.css"
],
"scripts": [
"../node_modules/bootstrap/dist/js/bootstrap.min.js"
]
注意 - 供您参考,请访问 reference link。可以看下拉demo
我之前遇到过同样的问题,我发现如下:
- html 应与 bootstrap 中的 class
container
绑定,如 Bootstrap Layout 中所述
- 如 Bootstrap Dropdown
中所述,下拉菜单基于第三方库 Popper.js
据我从您的问题中了解到,您没有参考所需的 javascript
即 util.js, bootstrap.js, popper.js
或缩小版本。
到这里,我什么都没做,只是参考索引文件中需要的javascript个文件
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
然后我创建了一个导航组件并按要求设计如下:
<div class="container">
<!-- Content here -->
<ul class="nav nav-pills">
<li class="nav-item">
<a class="nav-link active" href="#">Active</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">Dropdown</a>
<div class="dropdown-menu">
<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 class="dropdown-divider"></div>
<a class="dropdown-item" href="#">Separated link</a>
</div>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Link</a>
</li>
<li class="nav-item">
<a class="nav-link disabled" href="#">Disabled</a>
</li>
</ul>
</div
可以找到工作演示 here。希望对你有帮助。
我遇到了与 bootstrap 相同的问题,但我找到了解决方案。
如果您使用的是 Angular 6,则无需为 bootstrap 添加 popper.js。您需要添加 bootstrap 4 然后添加 rxjs-compat.
npm install rxjs-compat
并添加 ngx-bootstrap 来执行下拉操作。安装 ngx-bootstrap,
npm install ngx-bootstrap --save
现在我们需要使用以下代码在您的应用程序中添加来自 ngx-bootstrap 的下拉模块
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { BsDropdownModule } from 'ngx-bootstrap/dropdown';
import { TooltipModule } from 'ngx-bootstrap/tooltip';
import { ModalModule } from 'ngx-bootstrap/modal';
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
CommonModule,
BsDropdownModule.forRoot(),
TooltipModule.forRoot(),
ModalModule.forRoot()
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
然后我对您的代码做了一些更改,它对我来说工作正常。
<nav class="navbar navbar-default">
<ul class="nav navbar-nav">
<li class="dropdown" dropdown >
<a dropdownToggle role="button"> <!-- {2} -->
Page1<span class="caret"></span></a>
<div *dropdownMenu class="dropdown-menu">
<a class="dropdown-item" href="#">Page1.1</a>
</div>
</li>
<li><a class="nav-link" href="#">Page2</a></li>
</ul>
</nav>
@Rushikesh Salunke is great but at the time i saw it i was already using @ng-bootstrap library, not ngx, and this is what i found from the docs的答案。
首先,将 NgbDropdown 模块导入到要使用它的组件中。
import { NgbDropdown} from '@ng-bootstrap/ng-bootstrap';
然后修改你的.html如下:
<div ngbDropdown class="d-inline-block">
<button class="btn btn-outline-primary" id="dropdownBasic1" ngbDropdownToggle>Toggle dropdown</button>
<div ngbDropdownMenu aria-labelledby="dropdownBasic1">
<button class="dropdown-item">Action - 1</button>
<button class="dropdown-item">Another Action</button>
<button class="dropdown-item">Something else is here</button>
</div>
</div>
您可以查看其他用例here。
当你按照给定的例子做对了一切,但它似乎不起作用时,可能是你忘记导入 Bootstrap 模块。
您可以通过此行到您打算在其中使用该组件的主模块来执行此操作:
import { NgbModule } from '@ng-bootstrap/ng-bootstrap'
@NgModule({
declarations: [MyComponent],
imports: [
NgbModule
],
exports: [MyComponent]
})
对于正在寻找 bootstrap 4.4.1 和 Angular 9+ 解决方案的任何人,我通过使用以下主机侦听器创建自定义指令来解决。只是将 show 添加到父 li 并没有做任何事情
@HostListener('click', ['$event']) onClick(event) {
if (this.el.nativeElement.classList.contains('show')) {
this.renderer.removeClass(this.el.nativeElement, 'show');
this.renderer.setAttribute(this.el.nativeElement.childNodes[0], 'aria-expanded', 'false')
this.renderer.removeClass(this.el.nativeElement.childNodes[1], 'show')
} else {
this.renderer.addClass(this.el.nativeElement, 'show')
this.renderer.setAttribute(this.el.nativeElement.childNodes[0], 'aria-expanded', 'true')
this.renderer.addClass(this.el.nativeElement.childNodes[1], 'show')
}
}
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"
crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"
crossorigin="anonymous"></script>
在关闭 body 标签之前在 index.html 添加这个。这对我有用。
<ul class="navbar-nav navbar-right">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" role="button" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false">
Manage Data
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="">Save Data</a>
<a class="dropdown-item" href="">Fetch Data</a>
</div>
</li>
</ul>
步骤 1:安装 ng-bootstrap
ng add @ng-bootstrap/ng-bootstrap
步骤 2:将 ng-bootstrap 模块添加到您的组件模块文件
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
...
@NgModule({
imports: [BrowserModule, NgbModule],
...
})
步骤 3:在您的组件视图文件中添加以下代码:
<div class="col">
<div ngbDropdown class="d-inline-block">
<button class="btn btn-outline-primary" id="dropdownBasic1" ngbDropdownToggle>Toggle dropdown</button>
<div ngbDropdownMenu aria-labelledby="dropdownBasic1">
<button ngbDropdownItem>Action - 1</button>
<button ngbDropdownItem>Another Action</button>
<button ngbDropdownItem>Something else is here</button>
</div>
</div>
</div>
我正在尝试使用 Angular 在 Bootstrap 导航栏中创建一个下拉项 6. 我的代码在我在线测试时工作正常:
<nav class="navbar bg-light navbar-light navbar-expand">
<ul class="navbar-nav">
<li class="nav-item dropdown" >
<a class="nav-link dropdown-toggle" data-toggle="dropdown">Page1</a>
<div class="dropdown-menu">
<a class="dropdown-item" href="#">Page1.1</a>
</div>
</li>
<li><a class="nav-link" href="#">Page2</a></li>
</ul>
</nav>
但是下拉菜单不适用于 Angular 6. 为了将 Bootstrap 与 Angular 一起使用,我使用了以下方法:
ng add @ng-bootstrap/schematics
除那个下拉项外,一切正常!
给你...
我做了以下更改 -
1. app.component.html
<p> Start editing to see some magic happen :) </p> <nav class="navbar bg-light navbar-light navbar-expand"> <ul class="nav navbar-nav"> <li class="dropdown" appDropdown> <a href="#" class="dropdown-toggle" role="button">Page1</a> <ul class="dropdown-menu"> <li><a href="#">Page1.1</a></li> <li><a href="#">Page1.2</a></li> <li><a href="#">Page1.3</a></li> </ul> </li> <li><a class="nav-link" href="#">Page2</a></li> </ul> </nav>
2。 app.module.ts
我添加了一个指令来侦听下拉菜单的点击事件,并在 app.module.ts
中导入了相同的指令import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
import { HelloComponent } from './hello.component';
import { DropdownDirective } from './dropdown.directive';
@NgModule({
imports: [ BrowserModule, FormsModule ],
declarations: [ AppComponent, HelloComponent, DropdownDirective ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
3。 dropdown.directive.ts
添加了监听点击事件的指令
import { Directive, HostListener, ElementRef, Renderer2 } from "@angular/core";
@Directive({
selector: '[appDropdown]'
})
export class DropdownDirective {
manageDropdown : boolean = false;
constructor(private elementRef: ElementRef, private renderer: Renderer2) {
}
@HostListener('click') openDropdown(eventData: Event) {
if(!this.manageDropdown) {
this.renderer.addClass(this.elementRef.nativeElement,'open');
this.manageDropdown = !this.manageDropdown;
} else {
this.renderer.removeClass(this.elementRef.nativeElement, 'open');
this.manageDropdown = !this.manageDropdown;
}
}
}
4。 angular.json
请求您 "npm install --save bootstrap@3" 并在 angular.json 文件中进行以下更改。
"styles": [
"src/styles.css",
"../node_modules/bootstrap/dist/css/bootstrap.min.css"
],
"scripts": [
"../node_modules/bootstrap/dist/js/bootstrap.min.js"
]
注意 - 供您参考,请访问 reference link。可以看下拉demo
我之前遇到过同样的问题,我发现如下:
- html 应与 bootstrap 中的 class
container
绑定,如 Bootstrap Layout 中所述
- 如 Bootstrap Dropdown 中所述,下拉菜单基于第三方库
Popper.js
据我从您的问题中了解到,您没有参考所需的 javascript
即 util.js, bootstrap.js, popper.js
或缩小版本。
到这里,我什么都没做,只是参考索引文件中需要的javascript个文件
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
然后我创建了一个导航组件并按要求设计如下:
<div class="container">
<!-- Content here -->
<ul class="nav nav-pills">
<li class="nav-item">
<a class="nav-link active" href="#">Active</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">Dropdown</a>
<div class="dropdown-menu">
<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 class="dropdown-divider"></div>
<a class="dropdown-item" href="#">Separated link</a>
</div>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Link</a>
</li>
<li class="nav-item">
<a class="nav-link disabled" href="#">Disabled</a>
</li>
</ul>
</div
可以找到工作演示 here。希望对你有帮助。
我遇到了与 bootstrap 相同的问题,但我找到了解决方案。 如果您使用的是 Angular 6,则无需为 bootstrap 添加 popper.js。您需要添加 bootstrap 4 然后添加 rxjs-compat.
npm install rxjs-compat
并添加 ngx-bootstrap 来执行下拉操作。安装 ngx-bootstrap,
npm install ngx-bootstrap --save
现在我们需要使用以下代码在您的应用程序中添加来自 ngx-bootstrap 的下拉模块
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { BsDropdownModule } from 'ngx-bootstrap/dropdown';
import { TooltipModule } from 'ngx-bootstrap/tooltip';
import { ModalModule } from 'ngx-bootstrap/modal';
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
CommonModule,
BsDropdownModule.forRoot(),
TooltipModule.forRoot(),
ModalModule.forRoot()
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
然后我对您的代码做了一些更改,它对我来说工作正常。
<nav class="navbar navbar-default">
<ul class="nav navbar-nav">
<li class="dropdown" dropdown >
<a dropdownToggle role="button"> <!-- {2} -->
Page1<span class="caret"></span></a>
<div *dropdownMenu class="dropdown-menu">
<a class="dropdown-item" href="#">Page1.1</a>
</div>
</li>
<li><a class="nav-link" href="#">Page2</a></li>
</ul>
</nav>
@Rushikesh Salunke is great but at the time i saw it i was already using @ng-bootstrap library, not ngx, and this is what i found from the docs的答案。
首先,将 NgbDropdown 模块导入到要使用它的组件中。
import { NgbDropdown} from '@ng-bootstrap/ng-bootstrap';
然后修改你的.html如下:
<div ngbDropdown class="d-inline-block">
<button class="btn btn-outline-primary" id="dropdownBasic1" ngbDropdownToggle>Toggle dropdown</button>
<div ngbDropdownMenu aria-labelledby="dropdownBasic1">
<button class="dropdown-item">Action - 1</button>
<button class="dropdown-item">Another Action</button>
<button class="dropdown-item">Something else is here</button>
</div>
</div>
您可以查看其他用例here。
当你按照给定的例子做对了一切,但它似乎不起作用时,可能是你忘记导入 Bootstrap 模块。
您可以通过此行到您打算在其中使用该组件的主模块来执行此操作:
import { NgbModule } from '@ng-bootstrap/ng-bootstrap'
@NgModule({
declarations: [MyComponent],
imports: [
NgbModule
],
exports: [MyComponent]
})
对于正在寻找 bootstrap 4.4.1 和 Angular 9+ 解决方案的任何人,我通过使用以下主机侦听器创建自定义指令来解决。只是将 show 添加到父 li 并没有做任何事情
@HostListener('click', ['$event']) onClick(event) {
if (this.el.nativeElement.classList.contains('show')) {
this.renderer.removeClass(this.el.nativeElement, 'show');
this.renderer.setAttribute(this.el.nativeElement.childNodes[0], 'aria-expanded', 'false')
this.renderer.removeClass(this.el.nativeElement.childNodes[1], 'show')
} else {
this.renderer.addClass(this.el.nativeElement, 'show')
this.renderer.setAttribute(this.el.nativeElement.childNodes[0], 'aria-expanded', 'true')
this.renderer.addClass(this.el.nativeElement.childNodes[1], 'show')
}
}
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"
crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"
crossorigin="anonymous"></script>
在关闭 body 标签之前在 index.html 添加这个。这对我有用。
<ul class="navbar-nav navbar-right">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" role="button" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false">
Manage Data
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="">Save Data</a>
<a class="dropdown-item" href="">Fetch Data</a>
</div>
</li>
</ul>
步骤 1:安装 ng-bootstrap
ng add @ng-bootstrap/ng-bootstrap
步骤 2:将 ng-bootstrap 模块添加到您的组件模块文件
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
...
@NgModule({
imports: [BrowserModule, NgbModule],
...
})
步骤 3:在您的组件视图文件中添加以下代码:
<div class="col">
<div ngbDropdown class="d-inline-block">
<button class="btn btn-outline-primary" id="dropdownBasic1" ngbDropdownToggle>Toggle dropdown</button>
<div ngbDropdownMenu aria-labelledby="dropdownBasic1">
<button ngbDropdownItem>Action - 1</button>
<button ngbDropdownItem>Another Action</button>
<button ngbDropdownItem>Something else is here</button>
</div>
</div>
</div>