Использование труб в ngModel для элементов INPUT в угловом

У меня есть поле HTML INPUT.

 

и я хочу отформатировать его значение и использовать существующий канал:

 .... [(ngModel)]="item.value | useMyPipeToFormatThatValue" ..... 

и получите сообщение об ошибке:

Не может иметь трубку в выражении действия

Как использовать каналы в этом контексте?

Вы не можете использовать операторы выражения шаблона (pipe, save navigator) в инструкции шаблона:

 (ngModelChange)="Template statements" 

(ngModelChange) = “item.value | useMyPipeToFormatThatValue = $ event”

https://angular.io/guide/template-syntax#template-statements

Как и выражения шаблонов, операторы шаблонов используют язык, похожий на JavaScript. Парсер анализатора шаблонов отличается от синтаксического анализатора шаблонов и, в частности, поддерживает как базовое присваивание (=), так и цепочки выражений (с; или,).

Однако определенный синтаксис JavaScript не допускается :

  • новый
  • операторы приращения и уменьшения, ++ и –
  • оператор, например, + = и – =
  • поразрядные операторы | а также &
  • операторы выражения шаблона

Поэтому вы должны написать его следующим образом:

  

Пример плунжера

  

Решение здесь состоит в том, чтобы разделить привязку на одностороннюю привязку и привязку события, которая действительно включает синтаксис [(ngModel)] . [] – синтаксис одностороннего связывания и () – синтаксис привязки события. При использовании вместе – [()] Угловой признает это как стенографию и связывает двухстороннюю привязку в форме односторонней привязки и привязки события к значению объекта компонента.

Причина, по которой вы не можете использовать [()] с трубой, заключается в том, что трубы работают только с односторонними связями. Поэтому вы должны разделить трубу только на одностороннюю привязку и обрабатывать событие отдельно.

Дополнительную информацию см. В разделе Симулятор углового шаблона .

Я пробовал решения выше, но значение, которое идет к модели, было форматированным значением, а затем возвращалось и давало мне ошибки CurrencyPipe. Поэтому мне пришлось

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

И по функции addToAmount -> change on blur вызывают проблемы с 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(); } 

Мое решение приведено ниже здесь searchDetail – это объект.

   
  

Я хотел бы добавить еще один пункт к принятому ответу.

Если тип вашего управления вводом не является текстом, труба не работает.

Помните об этом и сохраняйте свое время.

  • Что альтернатива угловым.копиям в угловом
  • Создайте новый экземпляр classа с зависимостями, не понимая поставщика фабрики
  • Как применять фильтры к * ngFor?
  • Обработка 401s по всему миру с помощью углового
  • Как передать данные на угловые маршрутизаторы?
  • Как вручную использовать ленивый модуль?
  • Как динамически создавать загрузочные модалы как компоненты Angular2?
  • множественная компоновка для разных страниц в угловом 2
  • Как передать параметры запроса с помощью routerLink в новом Router V 3 alpha (владивосток)
  • Угловой валидатор, который опирается на несколько полей формы
  • Не может связываться с 'for', поскольку это не известное свойство native angular2
  • Давайте будем гением компьютера.