我创建了一个管道来格式化输入框中的值,如下所示:
1 123
10 123
101 123
2 101 123
23 101 123
123 101 123
当我在输入框中键入或按下退格键时,管道会提供所需的输出.
问题:当我从“输入”框中删除空格时,输入框不会更新.
例如如果我将值从123 123更改为123123,则输入框不会更新.
管道:
@Pipe({name: 'formatCurrency'}) export class FormatCurrencyPipe implements PipeTransform{ transform(value: string): string { //convert to string value = value.toString(); // remove spaces value = value.replace(/ /g,''); console.log('Spaces removed'); console.log(value); // add spaces value = value.replace(/\B(?=(\d{3})+(?!\d))/g,' '); console.log('Spaces Added'); console.log(value); return value; } }
HTML:
<input type="text" (keypress)="disableSpace($event)" [ngModel]="data.value | formatCurrency" (ngModelChange)="data.value = $event" />
零件:
export class App implements OnInit { name:string; data:any = {value: 123345}; constructor() {} ngOnInit(): void { this.name = 'Angular2'; } disableSpace(event: any) { if (event.charCode && event.charCode === 32 || event.which && event.which === 32) { event.preventDefault(); } } }
Plunker:https://plnkr.co/edit/j5tmNxllfZxP0EDp2XgL?p=preview
解决方法
好的,最后在挖掘之后我找到了解决这个问题的方法.
因此,当管道返回新格式化的字符串时,它仍然与之前返回的字符串相同.
因此,我们需要使用一些角度魔法来实现这一目标.
@Pipe({name: 'formatCurrency'}) export class FormatCurrencyPipe implements PipeTransform{ transform(value: string): string { //convert to string value = value.toString(); // remove spaces value = value.replace(/ /g,' '); console.log('Spaces Added'); console.log(value); return WrappedValue.wrap(value); } }
请注意,管道现在返回WrappedValue.wrap(value).
这表示即使引用未更改,管道转换的结果也已更改.
供参考:https://angular.io/docs/js/latest/api/core/index/WrappedValue-class.html
Plunker:https://plnkr.co/edit/dhxtZrTeRKm2FSw5DIJU?p=preview
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。