我有一个 HTML INPUT 字段。
<input
[(ngModel)]="item.value"
name="inputField"
type="text"
/>
我想格式化它的值并使用现有的管道:
....
[(ngModel)]="item.value | useMyPipeToFormatThatValue"
....
并得到错误信息:
动作表达式中不能有管道
在这种情况下如何使用管道?
我有一个 HTML INPUT 字段。
<input
[(ngModel)]="item.value"
name="inputField"
type="text"
/>
我想格式化它的值并使用现有的管道:
....
[(ngModel)]="item.value | useMyPipeToFormatThatValue"
....
并得到错误信息:
动作表达式中不能有管道
在这种情况下如何使用管道?
您不能在模板语句中使用模板表达式运算符(管道、保存导航器):
(ngModelChange)="Template statements"
(ngModelChange)="item.value | useMyPipeToFormatThatValue=$event"
https://angular.io/guide/template-syntax#template-statements
与模板表达式一样,模板语句使用类似于 JavaScript 的语言。模板语句解析器与模板表达式解析器不同,它特别支持基本赋值 (=) 和链接表达式(使用 ; 或 ,)。
但是,某些 JavaScript 语法是不允许的:
- 新的
- 递增和递减运算符,++ 和 --
- 运算符赋值,例如 += 和 -=
- 位运算符 | 和 &
- 模板表达式运算符
所以你应该这样写:
<input [ngModel]="item.value | useMyPipeToFormatThatValue"
(ngModelChange)="item.value=$event" name="inputField" type="text" />
<input [ngModel]="item.value | useMyPipeToFormatThatValue"
(ngModelChange)="item.value=$event" name="inputField" type="text" />
此处的解决方案是将绑定拆分为单向绑定和事件绑定 - 语法[(ngModel)]
实际上包含这些绑定。[]
是单向绑定语法,()
是事件绑定语法。当一起使用时 - [()]
Angular 将其识别为简写,并以单向绑定和事件绑定的形式将双向绑定连接到组件对象值。
不能[()]
与管道一起使用的原因是管道仅适用于单向绑定。因此,您必须将管道拆分为仅对单向绑定进行操作并单独处理事件。
有关更多信息,请参阅 Angular模板语法。
<input [ngModel]="item.value | currency" (ngModelChange)="item.value=$event"
name="name" type="text" />
我想对已接受的答案再补充一点。
如果输入控件的类型不是文本,则管道将不起作用。
记住它并节省您的时间。
我尝试了上面的解决方案,但模型的值是格式化的值,然后返回并给我 currencyPipe 错误。所以我不得不
[ngModel]="transfer.amount | currency:'USD':true"
(blur)="addToAmount($event.target.value)"
(keypress)="validateOnlyNumbers($event)"
而关于 addToAmount 的功能 -> 模糊变化导致 ngModelChange 给了我光标问题。
removeCurrencyPipeFormat(formatedNumber){
return formatedNumber.replace(/[$,]/g,"")
}
并删除其他非数值。
validateOnlyNumbers(evt) {
var theEvent = evt || window.event;
var key = theEvent.keyCode || theEvent.which;
key = String.fromCharCode( key );
var regex = /[0-9]|\./;
if( !regex.test(key) ) {
theEvent.returnValue = false;
if(theEvent.preventDefault) theEvent.preventDefault();
}
您必须使用 [ngModel] 而不是与 [(ngModel)] 的双向模型绑定。然后将手动更改事件与 (ngModelChange) 一起使用。这是组件中所有双向输入的公共规则。
因为事件发射器上的管道是错误的。
我的解决方案在下面给出了 searchDetail 是一个对象..
<p-calendar [ngModel]="searchDetail.queryDate | date:'MM/dd/yyyy'" (ngModelChange)="searchDetail.queryDate=$event" [showIcon]="true" required name="queryDate" placeholder="Enter the Query Date"></p-calendar>
<input id="float-input" type="text" size="30" pInputText [ngModel]="searchDetail.systems | json" (ngModelChange)="searchDetail.systems=$event" required='true' name="systems"
placeholder="Enter the Systems">
由于两种方式绑定,为了防止错误:
ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was
checked.
你可以调用一个函数来改变这样的模型:
<input [ngModel]="item.value"
(ngModelChange)="getNewValue($event)" name="inputField" type="text" />
import { UseMyPipeToFormatThatValuePipe } from './path';
constructor({
private UseMyPipeToFormatThatValue: UseMyPipeToFormatThatValuePipe,
})
getNewValue(ev: any): any {
item.value= this.useMyPipeToFormatThatValue.transform(ev);
}
如果有更好的解决方案来防止此错误,那就太好了。