在Angular2-View中,在INPUT元素的ngModel中使用pipe道
我有一个HTMLinput字段。
<input [(ngModel)]="item.value" name="inputField" type="text" />
我想格式化它的值并使用现有的pipe道:
.... [(ngModel)]="item.value | useMyPipeToFormatThatValue" .....
并得到错误信息:
在动作expression式中不能有pipe道
我如何在这种情况下使用pipe道?
模板语句中不能使用模板expression式运算符 (pipe道,保存导航器):
(ngModelChange)="Template statements"
(ngModelChange)=“item.value | useMyPipeToFormatThatValue = $ event”
https://angular.io/docs/ts/latest/guide/template-syntax.html#!#template-expressions
所以你应该这样写:
<input [ngModel]="item.value | useMyPipeToFormatThatValue" (ngModelChange)="item.value=$event" name="inputField" type="text" />
Plunker例子
<input [ngModel]="item.value | useMyPipeToFormatThatValue" (ngModelChange)="item.value=$event" name="inputField" type="text" />
这里的解决scheme是将绑定分成单向绑定和事件绑定 – 语法[(ngModel)]
实际上包含了这个绑定。 ()
是单向绑定语法, ()
是事件绑定语法。 当同时使用时 – [()]
Angular将其识别为简写,并以单向绑定和绑定到组件对象值的事件的forms连接双向绑定。
你不能在pipe道上使用[()]
的原因是pipe道只能使用单向绑定。 因此,必须将pipe道拆分为仅在单向绑定上进行操作并分别处理事件。
有关更多信息,请参阅angular度模板语法 。
我尝试了上面的解决scheme,但模型的价值是格式化的值,然后返回给我currencyPipe错误。 所以我不得不
[ngModel]="transfer.amount | currency:'USD':true" (blur)="addToAmount($event.target.value)" (keypress)="validateOnlyNumbers($event)"
而在addToAmount – >模糊变化的function导致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(); }