MatStepper 如何触发步骤的错误状态?
How does MatStepper triggers the error state for a step?
我正在我的一个组件中实现 mat-horizontal-stepper
,如果我在 [completed]
属性 是 false
但这并没有发生。
我不确定使用 completed
属性 或类似的东西是否有一些限制;这是我目前所拥有的:
组件的HTML
<mat-horizontal-stepper linear #auditStepper>
<mat-step label="Choose a Company" [completed]="selectionClient.selected.length > 0">
</mat-step>
<mat-step label="Select a PPC Account" errorMessage="Select an Account" [completed]="selectionPPC.selected.length > 0">
</mat-step>
<mat-step label="Set Your Targets">
</mat-step>
</mat-horizontal-stepper>
组件的 TS
@Component({
selector: 'app-new-audit',
templateUrl: './new-audit.component.html',
styleUrls: ['./new-audit.component.scss'],
providers: [
{
provide: STEPPER_GLOBAL_OPTIONS,
useValue: { showError: true }
}
]
})
在上面的代码中,我只提供了重要的东西;但是如果我正确地遵循 Angular Material 文档,我需要做的就是将 providers
添加到组件(或我的主应用程序模块)中,仅此而已?
因此,例如,如果我进入第 2 步但保持 completed
条件为假,然后移动到另一个步骤,它应该会触发错误,因为该步骤不再处于活动状态但也未完成。
我只是想了解一切是如何工作的,因为我没有使用反应形式或实际用于此步进器的任何形式,因为我使用的是 MatTable;我只需要用户 select 来自 table 的一行(通过 MatTable 的 selection 功能),如果 selection 数组有一个元素,那么我可以考虑这一步作为 "complete" 并允许移动到下一步。
Stackblitz 演示
https://stackblitz.com/edit/angular-khyu8u
编辑:
如果我在步骤中使用 FormGroup
和 [stepControl]
属性,则错误状态可以正常工作,但我需要它而不需要表格。
有专门的 method 描述了显示错误所需的条件:
private _getDefaultIndicatorLogic(step: CdkStep, isCurrentStep: boolean): StepState {
if (step._showError && step.hasError && !isCurrentStep) {
return STEP_STATE.ERROR;
}
step._showError
来自 STEPPER_GLOBAL_OPTIONS
您在 providers 中定义的
step.hasError
包括最有趣的部分
以下是所有定义:
@Input()
get hasError(): boolean {
return this._customError == null ? this._getDefaultError() : this._customError;
}
set hasError(value: boolean) {
this._customError = coerceBooleanProperty(value);
}
private _getDefaultError() {
return this.stepControl && this.stepControl.invalid && this.interacted;
}
如你所见 hasError returns true
if
1) 我们 stepControl
状态无效,当前步骤已交互
2) 我们通过 hasError
输入道具 return true
!isCurrentStep
表示只有在其他步骤才会显示错误
因此您可以将 hasError
属性 传递给具有自定义逻辑的步骤,例如:
<mat-step ... #step [hasError]="step.interacted"
我正在我的一个组件中实现 mat-horizontal-stepper
,如果我在 [completed]
属性 是 false
但这并没有发生。
我不确定使用 completed
属性 或类似的东西是否有一些限制;这是我目前所拥有的:
组件的HTML
<mat-horizontal-stepper linear #auditStepper>
<mat-step label="Choose a Company" [completed]="selectionClient.selected.length > 0">
</mat-step>
<mat-step label="Select a PPC Account" errorMessage="Select an Account" [completed]="selectionPPC.selected.length > 0">
</mat-step>
<mat-step label="Set Your Targets">
</mat-step>
</mat-horizontal-stepper>
组件的 TS
@Component({
selector: 'app-new-audit',
templateUrl: './new-audit.component.html',
styleUrls: ['./new-audit.component.scss'],
providers: [
{
provide: STEPPER_GLOBAL_OPTIONS,
useValue: { showError: true }
}
]
})
在上面的代码中,我只提供了重要的东西;但是如果我正确地遵循 Angular Material 文档,我需要做的就是将 providers
添加到组件(或我的主应用程序模块)中,仅此而已?
因此,例如,如果我进入第 2 步但保持 completed
条件为假,然后移动到另一个步骤,它应该会触发错误,因为该步骤不再处于活动状态但也未完成。
我只是想了解一切是如何工作的,因为我没有使用反应形式或实际用于此步进器的任何形式,因为我使用的是 MatTable;我只需要用户 select 来自 table 的一行(通过 MatTable 的 selection 功能),如果 selection 数组有一个元素,那么我可以考虑这一步作为 "complete" 并允许移动到下一步。
Stackblitz 演示 https://stackblitz.com/edit/angular-khyu8u
编辑:
如果我在步骤中使用 FormGroup
和 [stepControl]
属性,则错误状态可以正常工作,但我需要它而不需要表格。
有专门的 method 描述了显示错误所需的条件:
private _getDefaultIndicatorLogic(step: CdkStep, isCurrentStep: boolean): StepState {
if (step._showError && step.hasError && !isCurrentStep) {
return STEP_STATE.ERROR;
}
step._showError
来自STEPPER_GLOBAL_OPTIONS
您在 providers 中定义的
step.hasError
包括最有趣的部分
以下是所有定义:
@Input()
get hasError(): boolean {
return this._customError == null ? this._getDefaultError() : this._customError;
}
set hasError(value: boolean) {
this._customError = coerceBooleanProperty(value);
}
private _getDefaultError() {
return this.stepControl && this.stepControl.invalid && this.interacted;
}
如你所见 hasError returns true
if
1) 我们 stepControl
状态无效,当前步骤已交互
2) 我们通过 hasError
输入道具 return true
!isCurrentStep
表示只有在其他步骤才会显示错误
因此您可以将 hasError
属性 传递给具有自定义逻辑的步骤,例如:
<mat-step ... #step [hasError]="step.interacted"