Açısal / Açısal Malzemede bir mat-yatay adımlayıcı adımlarını programlı olarak hareket ettirebilir miyim


88

Angular Material ile ilgili bir sorum var (Angular 4+ ile). Bileşen şablonumda bir <mat-horizontal-stepper>bileşen eklediğimi ve her adımda <mat-step>bileşende gezinmek için adım düğmeleri olduğunu varsayalım. Böyle ...

<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>

Şimdi, düğmeleri her adımdan çıkarmanın ve onları <mat-horizontal-stepper>statik bir konumda veya hatta dışında başka bir yerde tutmanın mümkün olup olmadığını merak ediyorum <mat-horizontal-stepper>ve bileşen typecript dosyamdaki kodu kullanarak geriye ve ileriye gidebilirim. Bir fikir vermek gerekirse, HTML’imin böyle olmasını isterim

<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>

Yanıtlar:


182

Evet. selectedIndexÖzelliği kullanarak belirli bir adımlayıcıya atlamak mümkündür MatStepper. Ayrıca, MatSteppergenel yöntemleri ortaya çıkarır next()ve previous(). Bunları ileri geri hareket etmek için kullanabilirsiniz.

Şablonunuzda:

Stepperinize bir kimlik ekleyin, örn #stepper. Ardından goBack()ve goForward()yöntemlerinde, adım kimliğini iletin:

<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>

.. ve dizinizde:

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

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

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

Bağlantı stackblitz demo .


ViewChildTypeScript'inizdeki step bileşenine aşağıda gösterildiği gibi referans almak için de kullanabilirsiniz :

@ViewChild('stepper') private myStepper: MatStepper;

goBack(){
    this.myStepper.previous();
}

goForward(){
    this.myStepper.next();
}

Bu durumda, bileşeninizin html'sindeki yöntemde adım referansını iletmeniz gerekmez. ViewChild ile Demo Bağlantısı


Aşağıdakileri kullanarak Backve Nextdüğmelerini etkinleştirebilir / devre dışı bırakabilirsiniz :

<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>

8
Sadece bakıyordum ViewChildve Stepper'a nasıl referans verebileceğimi görüyordum - ama beni yendin! Devre dışı bırak / etkinleştir işlevini de eklemiş olmana bayıldım! Birkaç puan al!
Mike Sav

ViewChildstep'i almak için iyi bir seçenektir. Ama bir id geçirmeyi tercih ederim. Demoya da ViewChildçözüm ekledim \ o /
Faisal

Merhaba Faisal, böylesine harika bir cevap için teşekkürler, bir yardım daha, bir formu mat adımına geçirmek yerine açısal bileşenleri geçirebilir miyiz ve sonra bu bileşenin geçerli olmasına bağlı olarak bir sonraki mat adımına geçebilir miyim, bu nasıl elde edilebilir , thankyou
Enthu

Güzel çözüm. Ancak kaydırma alanını gerçek başlıkla değil, yalnızca step içeriğiyle nasıl sınırlayabiliriz? Yığın içerik eklerseniz, başlık gözden kaybolur. Başlık, kullanıcının bir süreçte nerede olduğuna dair bir gösterge verdiğinden, her adımdaki içerik miktarına bakılmaksızın başlığın görünür olması önemlidir.
Wayne Riesterer

1
Angular 8 kullanıyorsanız ve @ViewChild kullanıyorsanız, static: false @ViewChild('stepper', {static: false}) private myStepper: MatStepper; Per Angular kullanmalısınız, bu değer Angular 9+ link
rorvis

29

@ Ek olarak Faysal 'ın cevabı, bu argüman olarak step geçmesine gerek kalmadan MatStepper sıçrattı almak benim.

Bu, adımlayıcıyı bir Serviceveya başka bir şeyden manipüle ederken daha fazla esnekliğe ihtiyacınız olduğunda yararlıdır .

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>

TS Dosyası:

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

İşte stackblitz demosu .


21

Bir sonraki adıma programlı olarak gitmek istiyorsanız ve doğrusal bir adımlayıcı kullanıyorsanız , aşağıdaki adımları izleyin:

  • Bunun steppergibi bir oluşturun : <mat-horizontal-stepper linear #matHorizontalStepper>
  • Şöyle tanımla mat-step:<mat-step [completed]="isThisStepDone">
  • İçeriden aşağıdaki mat-stepgibi bir sonraki adıma geçmek için bir düğme oluşturun: <button (click)="next(matHorizontalStepper)">NEXT STEP</button>
  • Gelen .tsdosyanın bir beyan MatStepperbaşvuru adlı step :
    @ViewChild('matHorizontalStepper') stepper: MatStepper;
  • Ayrıca, .tsdosya içinde yanlışisThisStepDone olarak başlat :isThisStepDone: boolean = false;
  • Ardından NEXT STEP düğmesi için yöntem yazın next():

    submit(stepper: MatStepper) {
     this.isThisStepDone = true;
     setTimeout(() => {           // or do some API calls/ Async events
      stepper.next();
     }, 1);
    }
    

3
Eşzamansız kısım ( setTimeout()), üzerinden durum yayılımı nedeniyle gereklidir isThisStepDone.
Yuri

2

SeçiliIndex'i kullanarak adımlayıcı'nın gerçek dizinini belirterek de bunu yapabilirsiniz.

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;
  }
}

1
Ben sadece kullanıyorum @ViewChild('stepper') private myStepper: MatStepper;ve işlevimde this.matStepper.next();. Mükemmel çalışma
Maksimum
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.