在Angular2中将管道添加到formControlName

And*_*son 5 model-driven reactive-programming angular

我想在Angular2的输入字段中添加一个数字管道.我正在使用模型驱动的表单,我的所有输入都有一个formControlName而不是使用数据绑定.我formControlName="number | number : '1.2-2'"遇到的问题是无效的代码.它抛出一个错误,说找不到formControlName.我不想删除formControlName来代替ngModel,因为我正在订阅表单输入以在使用表单时进行验证.

jmm*_*gle 1

更新:我意识到一种更简单、更明智的方法是使用 valueChanges 对更改事件值执行带有管道转换的 setValue。

如果您有许多带有订阅的表单控件,可能可以找到一些有关清理订阅和提高效率的最佳实践。您还可以在处理/提交最终表单值时清除任何不需要的管道转换。

基本示例(另请参阅:原始来源):

ngOnInit() {
  this.searchField = new FormControl();
  this.searchField.valueChanges
      .subscribe(val => {
        this.searchField.setValue(myPipe.transform(val))
      });
}
Run Code Online (Sandbox Code Playgroud)

带有去抖延迟+清晰度检查的摘录:

this.searchField.valueChanges
    .debounceTime(400)
    .distinctUntilChanged()
    .subscribe(term => {
      this.searchField.setValue(myPipe.transform(val))
  });
Run Code Online (Sandbox Code Playgroud)

原始方法...

此答案描述了如何为输入字段创建自定义控件值访问器,该访问器在 onChange (获取 ConvertTo* 自定义函数)和 writeValue (获取 ConvertFrom 自定义函数)方法内插入自定义时间戳转换函数。

您可能会创建类似的东西(例如,使模板等适应其他表单输入类型),但用您想要的管道转换方法(可能是两种不同的类型)替换转换函数,以实现您想要的效果。Angular 文档或源代码可能有助于了解更多详细信息。

我见过的另一种建议方法涉及在初始表单控件创建期间使用管道,但这似乎不是很有用,因为当用户更改输入值时,它不会继续应用这些更改。它首先会正确显示,但任何操作都会失去变换过滤,并且表单将简单地按原样提交,而不应用管道变换。