Angular Material 步进器 'Paginate'
Angular Material Stepper 'Paginate'
我的步进器有很多步,所以我想把它分成两部分,即
当用户进入向导时,步进器 header 仅显示 1--2--3--4,然后,当第 4 步完成且用户进入第 5 步时,header显示5--6--7--8,依此类推进行后续步骤。
你知道怎么做吗?
提前致谢。
编辑:
我尝试使用 *ngIf
到 hide/unhide 个步骤,但它确实从步进器数组中删除了这些步骤,因此当步骤隐藏时输入的信息丢失。
这是我的 *ngIf 方法:https://stackblitz.com/edit/angular-material2-beta-kknvx9
另外,用 [hidden]
尝试了类似的方法,但根本不起作用。
问题是 mat-step
在呈现时变为 mat-step-header
,并且其上的任何自定义 class 或属性都将消失。
下面的代码可以工作,但是很乱。最好的解决方案是找到另一个具有您需要的向导组件,或者在 GitHub 上向 Material 开发人员提交请求,以向 mat-step
.
添加隐藏标志
Class:
export class AppComponent implements OnInit, AfterViewInit{
private ngVersion: string = VERSION.full;
MAX_STEP = 7;
@ViewChild('stepper') private myStepper: MatStepper;
step: number = 0;
page:number = 0;
constructor() {}
ngOnInit() {}
ngAfterViewInit() {
this.rerender();
}
goBack() {
if (this.step > 0) {
this.step--;
this.myStepper.previous();
}
this.page = this.step > 3 ? 1 : 0;
this.rerender();
}
goForward() {
if(this.step < this.MAX_STEP) {
this.step++;
this.myStepper.next();
}
this.page = this.step > 3 ? 1 : 0;
this.rerender()
}
private rerender() {
let headers = document.getElementsByTagName('mat-step-header');
let lines = document.getElementsByClassName('mat-stepper-horizontal-line');
for (let h of headers) {
if (this.page === 0) {
if (Number.parseInt(h.getAttribute('ng-reflect-index')) > 3) {
h.style.display = 'none';
}
else {
h.style.display = 'flex';
}
}
else if (this.page === 1) {
if (Number.parseInt(h.getAttribute('ng-reflect-index')) < 4) {
h.style.display = 'none';
}
else {
h.style.display = 'flex';
}
}
}
for (let i = 0; i < lines.length; i++) {
if (this.page === 0) {
if (i > 2) {
lines[i].style.display = 'none';
}
else {
lines[i].style.display = 'block';
}
}
else if (this.page === 1) {
if (i < 4) {
lines[i].style.display = 'none';
}
else {
lines[i].style.display = 'block';
}
}
}
}
}
查看:
<div class="solution">
<!--------------------------------------------------------------------------------------->
<mat-horizontal-stepper #stepper>
<mat-step>
Step 1
</mat-step>
<mat-step>
Step 2
<input matInput placeholder="Address" required>
</mat-step>
<mat-step>
Step 3
</mat-step>
<mat-step>
Step 4
</mat-step>
<mat-step>
Step 5
</mat-step>
<mat-step>
Step 6
<input matInput placeholder="Address" required>
</mat-step>
<mat-step>
Step 7
</mat-step>
<mat-step>
Step 8
</mat-step>
<!-- one option -->
</mat-horizontal-stepper>
<!-- second option -->
<div>
<button (click)="goBack()" type="button" [hidden]="step === 0">Back</button>
<button (click)="goForward()" type="button" [hidden]="step === MAX_STEP">Next</button>
</div>
<!--------------------------------------------------------------------------------------->
Step: {{step}}
<br>
Page: {{page}}
</div>
我遇到了同样的问题,并且得到了一个可滚动列表的解决方案。
通过将 .mat-horizontal-stepper-header-container
设置为 overflow: scroll
并将 .mat-horizontal-stepper-header
设置为 overflow: visbile
,您将获得一个非压扁且可滚动的 header 栏。可以通过编程轻松完成下一步(或滚动条)。
我最近在处理类似的问题,并参考了这个答案 by Sasan,我尝试编写一个更通用的代码版本。通过考虑我们想要随时显示的步骤的最小和最大索引,我在步进器中添加了一个分页选项。其余不在此范围内的步骤,显示为“none”。
Stepper With Pagination
你可以参考这里的stackblitz:
https://stackblitz.com/edit/angular-mat-stepper-paginator?file=src/app/stepper-paginator1/stepper-paginator1.component.ts
如果你对更详细的解释感兴趣,你可以在这里查看我的博客:
https://madhura-gore.medium.com/angular-material-stepper-with-pagination-b9e1b091b8f6
我的步进器有很多步,所以我想把它分成两部分,即
当用户进入向导时,步进器 header 仅显示 1--2--3--4,然后,当第 4 步完成且用户进入第 5 步时,header显示5--6--7--8,依此类推进行后续步骤。
你知道怎么做吗?
提前致谢。
编辑:
我尝试使用 *ngIf
到 hide/unhide 个步骤,但它确实从步进器数组中删除了这些步骤,因此当步骤隐藏时输入的信息丢失。
这是我的 *ngIf 方法:https://stackblitz.com/edit/angular-material2-beta-kknvx9
另外,用 [hidden]
尝试了类似的方法,但根本不起作用。
问题是 mat-step
在呈现时变为 mat-step-header
,并且其上的任何自定义 class 或属性都将消失。
下面的代码可以工作,但是很乱。最好的解决方案是找到另一个具有您需要的向导组件,或者在 GitHub 上向 Material 开发人员提交请求,以向 mat-step
.
Class:
export class AppComponent implements OnInit, AfterViewInit{
private ngVersion: string = VERSION.full;
MAX_STEP = 7;
@ViewChild('stepper') private myStepper: MatStepper;
step: number = 0;
page:number = 0;
constructor() {}
ngOnInit() {}
ngAfterViewInit() {
this.rerender();
}
goBack() {
if (this.step > 0) {
this.step--;
this.myStepper.previous();
}
this.page = this.step > 3 ? 1 : 0;
this.rerender();
}
goForward() {
if(this.step < this.MAX_STEP) {
this.step++;
this.myStepper.next();
}
this.page = this.step > 3 ? 1 : 0;
this.rerender()
}
private rerender() {
let headers = document.getElementsByTagName('mat-step-header');
let lines = document.getElementsByClassName('mat-stepper-horizontal-line');
for (let h of headers) {
if (this.page === 0) {
if (Number.parseInt(h.getAttribute('ng-reflect-index')) > 3) {
h.style.display = 'none';
}
else {
h.style.display = 'flex';
}
}
else if (this.page === 1) {
if (Number.parseInt(h.getAttribute('ng-reflect-index')) < 4) {
h.style.display = 'none';
}
else {
h.style.display = 'flex';
}
}
}
for (let i = 0; i < lines.length; i++) {
if (this.page === 0) {
if (i > 2) {
lines[i].style.display = 'none';
}
else {
lines[i].style.display = 'block';
}
}
else if (this.page === 1) {
if (i < 4) {
lines[i].style.display = 'none';
}
else {
lines[i].style.display = 'block';
}
}
}
}
}
查看:
<div class="solution">
<!--------------------------------------------------------------------------------------->
<mat-horizontal-stepper #stepper>
<mat-step>
Step 1
</mat-step>
<mat-step>
Step 2
<input matInput placeholder="Address" required>
</mat-step>
<mat-step>
Step 3
</mat-step>
<mat-step>
Step 4
</mat-step>
<mat-step>
Step 5
</mat-step>
<mat-step>
Step 6
<input matInput placeholder="Address" required>
</mat-step>
<mat-step>
Step 7
</mat-step>
<mat-step>
Step 8
</mat-step>
<!-- one option -->
</mat-horizontal-stepper>
<!-- second option -->
<div>
<button (click)="goBack()" type="button" [hidden]="step === 0">Back</button>
<button (click)="goForward()" type="button" [hidden]="step === MAX_STEP">Next</button>
</div>
<!--------------------------------------------------------------------------------------->
Step: {{step}}
<br>
Page: {{page}}
</div>
我遇到了同样的问题,并且得到了一个可滚动列表的解决方案。
通过将 .mat-horizontal-stepper-header-container
设置为 overflow: scroll
并将 .mat-horizontal-stepper-header
设置为 overflow: visbile
,您将获得一个非压扁且可滚动的 header 栏。可以通过编程轻松完成下一步(或滚动条)。
我最近在处理类似的问题,并参考了这个答案
Stepper With Pagination
你可以参考这里的stackblitz: https://stackblitz.com/edit/angular-mat-stepper-paginator?file=src/app/stepper-paginator1/stepper-paginator1.component.ts
如果你对更详细的解释感兴趣,你可以在这里查看我的博客: https://madhura-gore.medium.com/angular-material-stepper-with-pagination-b9e1b091b8f6