web-dev-qa-db-fra.com

Puis-je déplacer par programme les marches d'un tapis-pas-horizontal-pas à pas en matériau angulaire

J'ai une question concernant Angular Material (with Angular 4+). Dites dans mon modèle de composant que j'ajoute un composant <mat-horizontal-stepper>, et à chaque étape <mat-step>, j'ai des boutons pas à pas pour naviguer dans le composant. Ainsi...

<mat-horizontal-stepper>
  <mat-step>
    Step 1
    <button mat-button matStepperPrevious type="button">Back</button>
    <button mat-button matStepperNext type="button">Next</button>
  </mat-step>
  <mat-step>
    Step 2
    <button mat-button matStepperPrevious type="button">Back</button>
    <button mat-button matStepperNext type="button">Next</button>
  </mat-step>
  <mat-step>
    Step 3
    <button mat-button matStepperPrevious type="button">Back</button>
    <button mat-button matStepperNext type="button">Next</button>
  </mat-step>
</mat-horizontal-stepper>

Maintenant, je me demande s’il est possible de supprimer les boutons de chaque étape et de les placer ailleurs dans le <mat-horizontal-stepper> en position statique ou même en dehors du <mat-horizontal-stepper> et je peux naviguer en arrière en utilisant le code dans mon fichier TypeScript. Pour donner une idée, je voudrais que mon HTML soit quelque chose comme ça

<mat-horizontal-stepper>
    <mat-step>
        Step 1
    </mat-step>
    <mat-step>
        Step 2
    </mat-step>
    <mat-step>
        Step 3
    </mat-step>
    <!-- one option -->
    <div>
       <button mat-button matStepperPrevious type="button">Back</button>
       <button mat-button matStepperNext type="button">Next</button>
    </div>
</mat-horizontal-stepper>

<!-- second option -->
<div>
   <button (click)="goBack()" type="button">Back</button>
   <button (click)="goForward()" type="button">Next</button>
</div>
22
Mike Sav

Oui. Il est possible de passer à un stepper spécifique en utilisant la propriété selectedIndex de la MatStepper. De plus, MatStepper expose les méthodes publiques next() et previous(). Vous pouvez les utiliser pour aller et venir.

Dans votre modèle:

Ajoutez un identifiant à votre stepper, par exemple. #stepper. Ensuite, dans vos méthodes goBack() et goForward(), transmettez l'id stepper:

<mat-horizontal-stepper #stepper>
    <!-- Steps -->
</mat-horizontal-stepper>    
<!-- second option -->
<div>
   <button (click)="goBack(stepper)" type="button">Back</button>
   <button (click)="goForward(stepper)" type="button">Next</button>
</div>

.. et dans votre TypeScript: 

import { MatStepper } from '@angular/material/stepper';

goBack(stepper: MatStepper){
    stepper.previous();
}

goForward(stepper: MatStepper){
    stepper.next();
}

Lien vers stackblitz demo .

Vous pouvez activer/désactiver les boutons Back et Next en utilisant les éléments suivants: 

<button (click)="goBack(stepper)" type="button" 
        [disabled]="stepper.selectedIndex === 0">Back</button>
<button (click)="goForward(stepper)" type="button" 
        [disabled]="stepper.selectedIndex === stepper._steps.length-1">Next</button>
57
Faisal

En plus de la réponse de @ Faisal , c’est mon point de vue sur le fait de faire sauter MatStepper sans avoir à passer le stepper dans les arguments.

Ceci est utile lorsque vous avez besoin de plus de flexibilité pour manipuler le stepper, par exemple. d'un Service ou autre chose.

HTML:

<div fxLayout="row" fxLayoutAlign="center center" fxLayoutGap="6px">
  <button (click)="move(0)">1st</button>
  <button (click)="move(1)">2nd</button>
  <button (click)="move(2)">3rd</button>
  <button (click)="move(3)">4th</button>
</div>

Fichier TS:

move(index: number) {
    this.stepper.selectedIndex = index;
}

Voici la démo de stackblitz .

9
Altus

Vous pouvez également le faire en spécifiant l'index réel du stepper à l'aide de selectedIndex.

stackblitz: https://stackblitz.com/edit/angular-4rvy2s?file=app%2Fstepper-overview-example.ts

HTML:

<div class="fab-nav-container">
   <mat-vertical-stepper linear="false" #stepper>
       <mat-step *ngFor="let step of stepNodes; let i = index">
           <ng-template matStepLabel>
               <p> {{step.title}} </p>
           </ng-template>
       </mat-step>
   </mat-vertical-stepper>
</div>

<div class="button-container">
   <div class="button-grp">
      <button mat-stroked-button (click)="clickButton(1, stepper)">1</button>
      <button mat-stroked-button (click)="clickButton(2, stepper)">2</button>
      <button mat-stroked-button (click)="clickButton(3, stepper)">3</button>
   </div>
</div>

TS:

import {Component, OnInit, ViewChild} from '@angular/core';
import {FormBuilder, FormGroup, Validators} from '@angular/forms';
import { MatVerticalStepper } from '@angular/material';
import { MatStepper } from '@angular/material';
export interface INodes {
    title: string;
    seq: number;
    flowId: string;
}
/**
 * @title Stepper overview
 */
@Component({
  selector: 'stepper-overview-example',
  templateUrl: 'stepper-overview-example.html',
  styleUrls: ['stepper-overview-example.scss'],
})
export class StepperOverviewExample implements OnInit {
  @ViewChild(MatVerticalStepper) vert_stepper: MatVerticalStepper;
  @ViewChild('stepper') private myStepper: MatStepper;

  stepNodes: INodes[] = [
    { title: 'Request Submission', seq: 1, flowId: 'xasd12'}, 
    { title: 'Department Approval', seq: 2, flowId: 'erda23'}, 
    { title: 'Requestor Confirmation', seq: 3, flowId: 'fsyq51'}, 
  ];

  ngOnInit() {
  }
  ngAfterViewInit() {
    this.vert_stepper._getIndicatorType = () => 'number';
  }
  clickButton(index: number, stepper: MatStepper) {
      stepper.selectedIndex = index - 1;
  }
}
0
M.Laida