Angular 4 - 如何为 type='input' 呈现 2 个小数位

Posted

技术标签:

【中文标题】Angular 4 - 如何为 type=\'input\' 呈现 2 个小数位【英文标题】:Angular 4 - how to render 2 decimal places for type='input'Angular 4 - 如何为 type='input' 呈现 2 个小数位 【发布时间】:2018-01-31 22:17:15 【问题描述】:

This question 是关于在用户将数据输入数字类型的输入时限制/验证输入。

我遇到的问题是,当模型首次加载时,任何整数或 1dp 的数字都只会以 1dp 呈现。例如 40 或 40.0 都显示为 40.0(而不是 40.00)。

我已添加此代码,以便在用户键入新值后,它会以 2dp 显示:

在模板文件中:

(change)="setTwoNumberDecimal($event)"

在组件文件中:

  setTwoNumberDecimal($event) 
    $event.target.value = parseFloat($event.target.value).toFixed(2);
  

这适用于在用户更改值之后显示 2dp。

我尝试编写一个指令,该指令在数据最初加载时应格式化为 2dp,但尽管该指令确实会触发,但它不会将值更改为 2dp。

import  Directive, ElementRef, Input, Renderer2  from '@angular/core';

@Directive (
  selector: '[fbDecimalFormat]'
)

export class DecimalFormatDirective 

  constructor(private el: ElementRef,
              private renderer: Renderer2) 
    //renderer.setAttribute(el, 'value', parseFloat(el.nativeElement.value).toFixed(2));
    this.el.nativeElement.value = parseFloat(this.el.nativeElement.value).toFixed(2);
  


仅供参考,注释的渲染行不起作用(错误:setAttribute not recognized) - 这是一个独立于平台的尝试。

所以问题是: 如何获取输入以 2dps 呈现其初始值?

【问题讨论】:

【参考方案1】:

模板表单

对此的解决方案是使用内置的DecimalPipe(奇怪地称为数字)而不是对模型值使用双向绑定 - 即。从 [(ngModel)][ngModel] 和 (ngModelChange)

    <input type="number" step="0.01" 
            (change)="setTwoNumberDecimal($event)"
            (ngModelChange)="item.value=$event"
            [ngModelOptions]="updateOn: 'blur'"
            [ngModel]="setting.decimal_value | number:'1.2-2'">

有关拆分 [()] 绑定的更多信息,请参阅 this question。

另请注意,更新仅在用户离开控件(模糊)时触发,否则每次输入内容时都会更新,这将是令人沮丧的用户体验(感谢 @Mihail 的评论)。

反应式表单

针对 cme​​ts 中的问题: “这也可以与反应形式一起使用吗?”

答案是:

不,使用具有反应形式的管道更复杂。您可以仅使用管道来显示值,例如

 <p>form.get('name').value | myPipe</p> 

但我认为正确的方法是使用值访问器。更多信息here.

【讨论】:

@harry 我正在尝试实现它对我不起作用...使用它-> 这也可以与反应形式一起使用吗? @Gambo 不,使用具有反应形式的管道更加复杂。您可以仅使用管道来显示值,例如

form.get('name').value | myPipe

但我认为正确的方法是使用值访问器。更多信息在这里:***.com/questions/40637453/…
Even (change)="setTwoNumberDecimal($event)" 不需要 考虑使用 [ngModelOptions]="updateOn: 'blur'",因为编辑变得乏味。【参考方案2】:

Number.toFixed(x) 将任何数字格式化为“x”个尾随小数。该数字被四舍五入,如果需要在小数点后使用“0”来创建所需的小数长度。在模板中,我们可以格式化值并验证值

value1 = 0
value2 = 0.0

<p>
  value1.toFixed(2) - shows 0.00
  value2.toFixed(2) - shows 0.00
</p>

【讨论】:

谢谢,但问题是“我怎样才能获得渲染 2dp 的输入”而不是模板。

以上是关于Angular 4 - 如何为 type='input' 呈现 2 个小数位的主要内容,如果未能解决你的问题,请参考以下文章

如何为 angular2 的登录组件编写测试(单元测试)

如何为 Angular 2.0 设置环境?

如何为 Angular 组件注释 ngdoc?

Angular - 如何为可选输入属性设置默认值

Angular:如何为 Angular 应用程序中的功能创建测试模块?

如何为 Freewall jQuery 插件创建 Angular 指令