examples - ¿Puedo mover de manera programática los pasos de una estera-paso-horizontal en Material Angular/Angular?
layout-align (3)
Tengo una pregunta relacionada con el material angular (con Angular 4+). Digamos que en mi plantilla de componente agrego un componente <mat-horizontal-stepper>
, y dentro de cada paso <mat-step>
tengo botones de pasos para navegar por el componente. Al igual que...
<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>
Ahora me pregunto si es posible quitar los botones de cada paso y tenerlos en otro lugar en el <mat-horizontal-stepper>
en una posición estática o incluso fuera del <mat-horizontal-stepper>
y puedo navegar hacia atrás y reenvía utilizando código dentro de mi componente de archivo de script. Para dar una idea, me gustaría que mi HTML fuera algo como esto.
<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>
Además de la respuesta de @Faisal, esta es mi opinión sobre cómo hacer saltar el MatStepper sin tener que pasar el paso a paso en los argumentos.
Esto es útil cuando necesita más flexibilidad para manipular el paso a paso, por ejemplo, desde un Service
u otra cosa.
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>
Archivo TS:
move(index: number) {
this.stepper.selectedIndex = index;
}
Aquí está la demo stackblitz .
Sí. Es posible saltar a un paso específico usando la propiedad selectedIndex
de MatStepper
. Además, MatStepper
expone los métodos públicos next()
y previous()
. Puedes usarlos para moverte de un lado a otro.
En su plantilla:
Agrega una identificación a tu paso a paso, por ejemplo, #stepper
. Luego, en tus goBack()
y goForward()
, pasa el ID paso a paso:
<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>
.. y en su escritura:
import { MatStepper } from ''@angular/material/stepper'';
goBack(stepper: MatStepper){
stepper.previous();
}
goForward(stepper: MatStepper){
stepper.next();
}
Enlace a la demo de stackblitz .
Puede habilitar / deshabilitar los botones Back
y Next
usando lo siguiente:
<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>
Si desea navegar programáticamente al siguiente paso si está usando un paso a paso lineal , siga los pasos a continuación:
- Cree un
stepper
astepper
como este:<mat-horizontal-stepper linear #matHorizontalStepper>
- Defina
mat-step
como este:<mat-step [completed]="isThisStepDone">
- Desde el interior de
mat-step
cree un botón para ir al siguiente paso como este:<button (click)="next(matHorizontalStepper)">NEXT STEP</button>
- En el archivo
.ts
declare una referencia deMatStepper
llamada stepper :
@ViewChild(''matHorizontalStepper'') stepper: MatStepper;
- Además, dentro del archivo
.ts
, inicialiceisThisStepDone
como false :isThisStepDone: boolean = false;
Luego escriba el método para el botón SIGUIENTE PASO llamado
next()
:submit(stepper: MatStepper) { this.isThisStepDone = true; setTimeout(() => { // or do some API calls/ Async events stepper.next(); }, 1); }