Вы не можете использовать операторы выражения шаблона (конвейер, навигатор сохранения) в операторе шаблона:
(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" />
Пример Plunker
item.value
это число, и вы используете егоDatePipe
для преобразования в строку даты. Когда дата редактируется,$event
она также будет строкой даты и не будет возвращаться вitem.value
нее. Вам нужно отменить то, что канал сделал в вашем(ngModelChange)
выражении, то есть снова превратить строку даты в число.(ngModelChange)="updateItemValue($event)"
, затем создайтеupdateItemValue(date: string)
метод и внутри него.item.value = someConversionFunction(date);
Теперь, если вы спрашиваете, что вы должны использовать в качестве функции преобразования, я не знаю. МожетDate.parse()
сработает.Решением здесь является разделение привязки на одностороннюю привязку и привязку событий, которые
[(ngModel)]
фактически охватывает синтаксис .[]
синтаксис односторонней привязки и синтаксис()
привязки событий. При совместном использовании -[()]
Angular распознает это как сокращение и связывает двустороннюю привязку в форме односторонней привязки и привязки события к значению объекта компонента.Причина, по которой вы не можете использовать
[()]
канал, заключается в том, что каналы работают только с односторонними привязками. Следовательно, вы должны разделить канал, чтобы работать только с односторонней привязкой и обрабатывать событие отдельно.Смотрите Angular Template Syntax для получения дополнительной информации.
источник
К принятому ответу хочу добавить еще один пункт.
Если тип вашего элемента управления вводом не является текстовым, канал не будет работать.
Помните об этом и сэкономьте свое время.
источник
Я пробовал приведенные выше решения, но значение, которое поступает в модель, было отформатированным значением, которое затем возвращалось и давало мне ошибки currencyPipe. Так что мне пришлось
И в функции addToAmount -> change on blur, потому что ngModelChange вызывал у меня проблемы с курсором.
И удаление других нечисловых значений.
источник
Мое решение приведено ниже здесь searchDetail - это объект ..
источник
вы должны использовать [ngModel] вместо двусторонней привязки модели с [(ngModel)]. затем используйте событие ручного изменения с (ngModelChange). это публичное правило для всех двухсторонних входов в компоненты.
потому что труба на эмиттере событий неверна.
источник
из-за двусторонней привязки, чтобы предотвратить ошибку:
вы можете вызвать функцию для изменения модели следующим образом:
будет хорошо, если есть лучшее решение для предотвращения этой ошибки.
источник