Использование труб в ngModel на входных элементах в угловой
у меня есть поле ввода HTML.
<input [(ngModel)]="item.value" name="inputField" type="text" />
и я хочу отформатировать его значение и использовать существующий канал:
.... [(ngModel)]="item.value | useMyPipeToFormatThatValue" .....
и получаем сообщение об ошибке:
не может иметь канал в выражении действия
Как я могу использовать трубы в этом контексте?
5 ответов:
вы не можете использовать операторы выражения шаблона(труба, сохранить навигатор) в заявлении шаблона:
(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 распознает это как сокращение и связывает двустороннюю привязку в виде односторонней привязки и привязки события к значению компонентного объекта.причина, по которой вы не можете использовать
[()]с трубой это то, что трубы работают только с односторонней привязки. Поэтому вы должны разделить трубу, чтобы работать только с односторонней привязкой и обрабатывать событие отдельно.Посмотреть Угловые Синтаксис Шаблона для получения дополнительной информации.
Я пробовал решения выше, но значение, которое идет в модель, было форматированным значением, а затем возвращалось и давало мне ошибки 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(); }
<input [ngModel]="item.value | currency" (ngModelChange)="item.value=$event" name="name" type="text" />Я хотел бы добавить еще один пункт в принятой ответ.
Если тип вашего входного элемента управления не является текстом, труба не будет работать.
имейте это в виду и сэкономить ваше время.
мое решение приведено ниже здесь 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">
Comments