【发布时间】:2017-09-19 02:25:11
【问题描述】:
我创建了一个简单的管道,我将其应用于文本输入。正则表达式有效 - 但有些奇怪。控制台日志正确显示新值(已删除非字母数字),但在浏览器中,输入字段在我输入好字符之前不会更新。所以输入'123!!!!A'会显示感叹号,直到输入A然后它们消失。为什么?
我是这样使用管道的:
<input type="text" class="form-control" [ngModel]="name | inputFormat" (ngModelChange)="name=$event">
管道是
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'inputFormat'
})
export class InputFormatPipe implements PipeTransform {
transform(value: any): any {
value = value.replace(/[^a-z0-9]/gi, '');
console.log('new value: '+value);
return value;
}
}
我怀疑更改检测不起作用 - 但不确定如何解决此问题。
【问题讨论】:
-
你想用这段代码解决什么任务?我会说它不应该工作。如果您希望在输入中以某种特定方式格式化您的值,那么您可能需要实现 ControlValueAccessor... 但这只是我的猜测。请提供您想要达到的目标的详细信息。
-
我正在编写一个通用管道,它将删除受限制的字符、更改大小写、用其他字符替换一些字符等。为了简单起见,我已将我的问题简化为最简单的情况来演示错误
-
无论如何,这不是要走的路。如果您需要执行此类操作,那么 ControlValueAccessor 是您最好的朋友。它将允许您直接订阅输入上的不同事件并在您的值到达模型之前处理它们。例如,您可以通过在 keydown 事件中拒绝不需要的字符来避免更正您的值,甚至在它们被输入获取之前。只需查看角度源中的 DefaultValueAccessor 并添加一些创造性思维。这不是一门火箭科学,虽然它需要你提供一些代码,但它肯定是更好的方法。
-
有没有可以参考的例子?早些时候有人告诉我,PIPE 是实现这一目标的正确方法(我使用的是 onchange 指令)。除此之外,我很好奇为什么这不起作用以及如何解决它!
-
管道仅用于格式化值以便将它们显示为静态文本,即在 span/div 或类似的东西中。不用于输入。我无法告诉你为什么它不起作用,老实说,我不想深入研究这个问题,因为我看不到知识中有任何价值,为什么某些东西在使用不当时不起作用。 :) 例如,我会尝试为您制作一些东西,请给我几分钟。
标签: angular