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

如何在AngularDart的Material Input中实现百分比验证及错误消息?

在AngularDart中实现Material Input的百分比验证与自定义错误消息

刚好我之前做过类似的需求,给你一步步拆解怎么实现这个功能,AngularDart的Material组件结合表单验证器就能轻松搞定:

1. 先搭好模板结构(用响应式表单更灵活)

首先在组件的HTML模板里配置material-input,同时利用它的matError插槽自定义错误消息,替换默认的提示:

<form [formGroup]="percentForm">
  <material-input
    formControlName="percent"
    label="百分比"
    type="number"
    suffix="%"
    placeholder="请输入0-100之间的数字"
  >
    <!-- 自定义错误消息的插槽,let-error可以拿到控件的错误对象 -->
    <ng-template matError let-error>
      <span *ngIf="error.required">请填写百分比</span>
      <span *ngIf="error.min">百分比不能小于0%</span>
      <span *ngIf="error.max">百分比不能超过100%</span>
      <span *ngIf="error.number">请输入有效的数字</span>
    </ng-template>
  </material-input>
</form>

这里的suffix="%"用来自动显示百分比符号,不用用户手动输入;type="number"会让浏览器做基础的数字输入校验,同时配合Angular的验证器做范围校验。

2. 在组件类中配置表单与验证规则

接下来在Dart代码里初始化响应式表单组,给百分比字段添加验证规则:

import 'package:angular/angular.dart';
import 'package:angular_forms/angular_forms.dart';
import 'package:angular_components/angular_components.dart';

@Component(
  selector: 'percent-input-demo',
  templateUrl: 'percent_input_demo.html',
  directives: [
    coreDirectives,
    formDirectives,
    MaterialInputComponent,
  ],
)
class PercentInputDemoComponent {
  final FormGroup percentForm;

  PercentInputDemoComponent() : percentForm = FormGroup({
    'percent': FormControl(
      null,
      // 组合必填、最小值、最大值三个验证器
      Validators.compose([
        Validators.required,
        Validators.min(0),
        Validators.max(100),
      ]),
      // 可选:设置实时验证(默认是失去焦点时验证)
      updateOn: FormControlUpdateOn.change,
    ),
  });
}

这里用Validators.compose把多个验证器组合起来,updateOn: FormControlUpdateOn.change可以让验证在用户每输入一个字符时就触发,实时显示错误消息。

3. 处理特殊场景:支持用户输入带%的内容

如果用户习惯直接输入类似50%这样的内容,而不是纯数字,我们可以自定义一个验证器来处理:

// 自定义百分比验证器:支持带%符号的输入
ValidatorFn percentValidator() {
  return (AbstractControl control) {
    if (control.value == null || control.value.toString().trim().isEmpty) {
      return {'required': true};
    }
    // 去掉输入中的%符号并清理空格
    String cleanedValue = control.value.toString().replaceAll('%', '').trim();
    try {
      num value = num.parse(cleanedValue);
      if (value < 0) return {'min': true};
      if (value > 100) return {'max': true};
      // 验证通过返回null
      return null;
    } catch (_) {
      // 解析失败,返回数字无效错误
      return {'number': true};
    }
  };
}

然后把原来的验证器替换成这个自定义的:

FormControl(
  null,
  Validators.compose([
    percentValidator(),
  ]),
)

这样不管用户输入纯数字还是带%的内容,都能正确验证啦。

4. 验证状态的触发逻辑

默认情况下,material-input会在以下时机触发验证:

  • 控件失去焦点时
  • 用户提交表单时
    如果想调整触发时机,除了上面提到的updateOn: FormControlUpdateOn.change,还可以选择updateOn: FormControlUpdateOn.blur(默认)或者updateOn: FormControlUpdateOn.submit。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:15:15