如果总最小值不等于最大值则显示错误

Show Error if Total Min Value Is Not Equal to Max Value

如果总最小值不等于总最大值,我需要显示错误。我将如何做到?这是我的代码和下面的 link PLEASE CLICK THIS LINK

this.total$ = this.inquiryForm.valueChanges.pipe(
      startWith(this.inquiryForm.value),
      map(f => f.rows.reduce(
        (acc, q) =>
          ({
            min: +acc.min + +q.min,
            max: +acc.max + +q.max
          }),
        { min: 0, max: 0 }
      ))
    );

您应该能够简单地向组件添加一个布尔值 属性 和 tap() 计算的总数以设置值:

在public属性部分,添加:

minEqualsMax = true;

ngOnInit()中:

this.total$ = this.inquiryForm.valueChanges.pipe(
      startWith(this.inquiryForm.value),
      map(f => f.rows.reduce(
        (acc, q) =>
          ({
            min: +acc.min + +q.min,
            max: +acc.max + +q.max
          }),
        { min: 0, max: 0 }
      )),
      tap(total => { this.minEqualsMax = total.min === total.max; }),
    );

那么只需使用 *ngIf="!minEqualsMax"

将您的消息添加到模板即可

但是,这不会停止表单提交,因为没有向表单验证添加任何内容。如果您需要,我建议编写一个自定义验证器函数,该函数迭代 rows FormArray 来计算值,如果它们的总和不相等,return 会出现适当的错误。

自定义验证器可以像这样简单:

const MinEqualsMaxValidator: ValidatorFn = (array: FormArray): { [key: string]: boolean } => {

  const total = array.value
    .reduce((total, val) => (total.min+=+val.min, total.max+=+val.max, total), {min:0,max:0})
  const valid = total.min === total.max;

  return valid ? null : { minEqualMax: true };
};

在构建 rows FormGroup 时将其作为第二个参数添加到表单中:即 rows: formBuilder.group([], MinEqualsMaxValidator).

然后您可以使用如下内容在表单中包含一条错误消息(添加到当前 table 的底部):

<tr *ngIf="inquiryForm.rows.invalid && (inquiryForm.controls.rows.dirty || inquiryForm.controls.rows.touched || inquiryForm.submitted)">
  <td colspan="4">
    Validation Error!
    <div *ngIf="inquiryForm.controls.rows.errors.minEqualMax">Error: min does not equal max!</div>
  </td>
</tr>

希望对您有所帮助!

我只是将 Total$ 更改为正常 属性 total = {max:0,min:0}; 并创建一个方法来检查 total

的状态
this.inquiryForm.valueChanges.subscribe(f => {
  this.total = f.rows.reduce(
    (acc, q) =>
      ({
        min: +acc.min + +q.min,
        max: +acc.max + +q.max
      }));
})

isTotalNotValid 方法

  isTotalNotValid(): boolean {
    let total = this.total;
    if (total.max > 0 || total.min > 0) {
      return total.min === total.max ? true : false;
    } else {
      return false;
    }
  }

模板

<td colspan="3" class="error">{{isTotalNotValid() ? 'Max and min can\'t be equal' : ''}}</td>

并且您可以使用 isTotalNotValid 禁用保存按钮

<button type="submit" [disabled]="!inquiryForm.valid || !inquiryForm.controls.rows.length || isTotalNotValid()">Save</button>

stackblitz demo