在Angular中的INPUT元素中使用ngModel中的管道

Lon*_*ely 113 pipe html-input angular2-ngmodel angular

我有一个HTML INPUT字段.

<input 
    [(ngModel)]="item.value" 
    name="inputField" 
    type="text" 
/>
Run Code Online (Sandbox Code Playgroud)

我想格式化它的值并使用现有的管道:

.... 
[(ngModel)]="item.value | useMyPipeToFormatThatValue" 
....
Run Code Online (Sandbox Code Playgroud)

并收到错误消息:

动作表达式中不能有管道

在这种情况下如何使用管道?

yur*_*zui 179

您不能在模板语句中使用模板表达式运算符(管道,保存导航器):

(ngModelChange)="Template statements"
Run Code Online (Sandbox Code Playgroud)

(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" />
Run Code Online (Sandbox Code Playgroud)

Plunker示例

  • 请注意,在示例中,管道仅适用于一个方向.假设`item.value`是一个数字,你使用`DatePipe`将它转换为日期字符串.当编辑日期时,`$ event`也将是一个日期字符串,并且不会回到`item.value`你必须反转管道在`(ngModelChange)`表达式中所做的事情 - 即转动日期字符串回到一个数字. (7认同)
  • 这对我有用!@BlakeRivell"[]"将属性从数据源单向绑定到视图目标,此时您可以更改管道显示的方式.当使用"()"绑定时,另一种改变格式的方法在这里是无用的.所以我猜这就是为什么香蕉在一个方框"[()]"不能用管子和分裂它们是要走的路.你可以在这里阅读更多相关信息:https://angular.io/docs/ts/latest/guide/template-syntax.html#!#binding-syntax (4认同)
  • 有人可以解释为什么它必须像这样分开吗?我正在尝试将日期绑定到类型为date的输入:[(ngModel)] ="model.endDate | date:'y-MM-dd'"并且管道将不起作用.但是,如果我不使用香蕉语法并使用上面的拆分语法,它可以正常工作. (3认同)
  • @Protagonist`(ngModelChange)="updateItemValue($ event)"`,然后创建一个`updateItemValue(date:string)`方法并在其中`item.value = someConversionFunction(date);`现在,如果你问的应该是什么你用作转换功能,我不知道.也许`Date.parse()`可能有效. (3认同)

Kno*_*per 101

<input [ngModel]="item.value | useMyPipeToFormatThatValue" 
      (ngModelChange)="item.value=$event" name="inputField" type="text" />
Run Code Online (Sandbox Code Playgroud)

这里的解决方案是将绑定拆分为单向绑定和事件绑定 - 语法[(ngModel)]实际包含在内.[]是单向绑定语法,()是事件绑定语法.当一起使用时 - [()]Angular将其识别为速记,并以单向绑定和绑定到组件对象值的事件的形式连接双向绑定.

您不能使用[()]管道的原因是管道仅适用于单向绑定.因此,必须将管道拆分为仅对单向绑定进行操作并单独处理事件.

有关详细信息,请参阅角度模板语法.


Tib*_*mas 7

<input [ngModel]="item.value | currency" (ngModelChange)="item.value=$event"
name="name" type="text" />
Run Code Online (Sandbox Code Playgroud)

我想在接受的答案上再加一点。

如果输入控件的类型不是文本,则管道将无法工作。

请记住它并节省您的时间。

  • 检查 ngx-locale-mask angular 库,我根据角度语言环境屏蔽了特定货币的输入框 (2认同)

cab*_*i99 6

我尝试了上面的解决方案但是模型的值是格式化的值然后返回并给我currencyPipe错误.所以我必须这样做

  [ngModel]="transfer.amount | currency:'USD':true"
                                   (blur)="addToAmount($event.target.value)"
                                   (keypress)="validateOnlyNumbers($event)"
Run Code Online (Sandbox Code Playgroud)

并且在addToAmount的功能上 - >改变模糊导致ngModelChange给我游标问题.

removeCurrencyPipeFormat(formatedNumber){
    return formatedNumber.replace(/[$,]/g,"")
  }
Run Code Online (Sandbox Code Playgroud)

并删除其他非数字值.

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();
  }
Run Code Online (Sandbox Code Playgroud)