【问题标题】:Number pipe doesn't format value if you delete comma如果删除逗号,数字管道不会格式化值
【发布时间】:2020-01-13 21:57:40
【问题描述】:

我有我在输入字段中使用的数字管道的工作示例:
https://stackblitz.com/edit/decimal-pipe-comma-separator-example-arg-h3gtrw?file=app%2Fshared%2Fnumber.pipe.ts

例如当我输入 11111 并在输入外部单击时,它会格式化为 11,111。但是,当我删除逗号并再次在输入外部单击时,它不会再次用逗号格式化。为什么会这样?当我调试代码时,它似乎返回了正确的值,但它显示了未格式化的数字。原始角度 DecimalPipe 似乎也是如此。我该如何解决?

我也在下面添加了管道和html代码:

import {
  Pipe,
  PipeTransform
} from '@angular/core';

@Pipe({
  name: 'numberFormat'
})
export class NumberFormatPipe implements PipeTransform {
  transform(value: number | string, minFractionDigits: number = 0, maxFractionDigits: number = 2, locale: string = 'en'): string {
    return new Intl.NumberFormat(locale, {
      minimumFractionDigits: minFractionDigits,
      maximumFractionDigits: maxFractionDigits
    }).format(Number(value));
  }
}
<div>
  <input type="text" [ngModel]="userNum | numberFormat" (ngModelChange)="userNum=$event" [ngModelOptions]="{updateOn:'blur'}">
</div>

【问题讨论】:

  • 你试过让管道不纯吗?
  • 刚刚添加 pure: false 到管道,它似乎没有帮助,或者我应该添加其他东西吗?
  • 不。我认为这就是问题所在。我的互联网连接不好。我在加载 stackblitz 时遇到问题

标签: angular typescript


【解决方案1】:

由于数值没有改变,所以视图没有更新。您可以通过在设置真实值之前设置中间虚拟值来强制更改检测:

<input type="text" 
  [ngModel]="userNum | numberFormat"
  (ngModelChange)="setUserNum($event)" 
  [ngModelOptions]="{updateOn:'blur'}">
setUserNum(value) {
  this.userNum = undefined;                // Set temporary value
  this.changeDetectorRef.detectChanges();  // Force change detection
  this.userNum = value;                    // Set actual value (triggers change detection)
}

请参阅this stackblitz 以获取演示。


如果您想在多个字段上使用该技术,您可以定义一个通用的setValue 方法,在该方法中您可以通过其名称访问属性:

<input type="text" 
  [ngModel]="userNum | numberFormat"
  (ngModelChange)="setValue('userNum', $event)" 
  [ngModelOptions]="{updateOn:'blur'}">
setValue(key, value) {
  this[key] = undefined;
  this.changeDetectorRef.detectChanges();
  this[key] = value;
}

请参阅this stackblitz 以获取演示。

【讨论】:

  • 这看起来很酷,但如果我有 10 个输入,我需要 10 个方法来设置 this.userNum = value 、 this.userNum1 = value 、 this.userNum2 = value 等,所以它不是通用的解决方案
  • 我在答案中添加了相同技术的可重复使用版本。
猜你喜欢
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 2021-03-04
  • 2019-02-12
  • 2010-10-16
  • 2014-05-31
  • 2020-12-18
  • 2017-12-09
相关资源
最近更新 更多