You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁用mat-vertical-stepper后续步骤及正确使用linear模式?

嘿,我来帮你搞定Angular Material步进器的这个问题!你的核心问题有两个:一是mat-step不支持disabled属性导致报错,二是不知道怎么结合表单验证使用linear模式,下面一步步给你解决:

一、先解决「disabled is not a part of mat-step」的错误

首先明确:mat-step根本没有[disabled]这个输入属性,这就是你报错的原因。要控制步骤是否可访问,Angular Material提供了更规范的方式——要么用linear模式,要么通过completed属性标记步骤是否完成。

二、正确实现「第一步验证通过前禁用后续步骤」

推荐用linear模式(这是官方专门为顺序步进场景设计的),配合表单验证来控制步骤的可访问性,下面结合你的代码修改:

1. 先修正表单的问题

你当前的表单同时用了formGroup和ngModel但没绑定formControlName,这会触发Angular的错误。我们改用Reactive Forms的标准写法,先在组件类里初始化表单:

import { Component } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';

@Component({
  // 你的组件元数据(selector、templateUrl等)
})
export class YourStepperComponent {
  // 定义每个步骤的表单
  generalDetailsForm: FormGroup;
  educationForm: FormGroup;
  // 第三步、第四步的表单同理定义

  constructor(private fb: FormBuilder) {
    // 初始化第一步表单,添加必填验证
    this.generalDetailsForm = this.fb.group({
      firstName: ['', Validators.required]
    });

    // 初始化第二步表单
    this.educationForm = this.fb.group({
      highestEducation: ['', Validators.required]
    });
  }
}

2. 修改步进器模板,启用linear模式

把mat-vertical-stepper加上linear属性,然后给每个mat-step绑定completed属性到对应表单的有效性,这样只有表单验证通过,步骤才会标记为完成,后续步骤才能访问:

<mat-vertical-stepper #stepper linear>
  <!-- 第一步:General Details -->
  <mat-step [completed]="generalDetailsForm.valid" label="General Details">
    <div class="col-md-9 col-lg-9">
      <form [formGroup]="generalDetailsForm">
        <div class="row">
          <div class="col-md-5 col-lg-5">
            <mat-form-field class="example-full-width">
              <input matInput placeholder="First Name" formControlName="firstName">
              <!-- 添加错误提示,提升用户体验 -->
              <mat-error *ngIf="generalDetailsForm.get('firstName')?.invalid">
                First name is required!
              </mat-error>
            </mat-form-field>
          </div>
        </div>
      </form>
      <!-- 下一步按钮:表单验证通过才可用,点击后跳转到下一步 -->
      <button mat-raised-button color="primary" style="float:right" 
              [disabled]="!generalDetailsForm.valid" 
              (click)="stepper.next()">
        Next
      </button>
    </div>
  </mat-step>

  <!-- 第二步:Education -->
  <mat-step [completed]="educationForm.valid" label="Education">
    <div class="col-md-9 col-lg-9">
      <form [formGroup]="educationForm">
        <div class="row">
          <div class="col-md-5 col-lg-5">
            <mat-form-field class="example-full-width">
              <input matInput placeholder="Highest Education" formControlName="highestEducation">
              <mat-error *ngIf="educationForm.get('highestEducation')?.invalid">
                Highest education is required!
              </mat-error>
            </mat-form-field>
          </div>
        </div>
      </form>
      <!-- 返回和下一步按钮 -->
      <button mat-raised-button color="primary" (click)="stepper.previous()">Back</button>
      <button mat-raised-button color="primary" style="margin-left:8px; float:right"
              [disabled]="!educationForm.valid" 
              (click)="stepper.next()">
        Next
      </button>
    </div>
  </mat-step>

  <!-- 第三步、第四步按照同样的逻辑添加即可 -->
</mat-vertical-stepper>

3. 关于linear模式的核心逻辑

当你给步进器加上linear后:

  • 用户无法直接点击后面的步骤标签跳转,必须按顺序完成前一步
  • 只有当前步骤的completed属性为true(这里绑定了表单的valid),才能通过按钮或编程方式进入下一步
  • 如果前一步没完成,即使尝试强制跳转,步进器也会自动回到最近完成的步骤

三、替代方案(不推荐,仅作了解)

如果你不想用linear模式,也可以通过手动控制步进器的selectedIndex和步骤的completed来实现,但这种方式代码更繁琐,不如linear简洁。比如在组件类里维护一个isStep2Enabled变量,当第一步表单验证通过后设置为true,然后给第二步的completed绑定这个变量,但还是推荐用官方的linear方案。

内容的提问来源于stack exchange,提问作者Nandini S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:51:18