Você não pode usar operadores de expressão de modelo (canal, salvar navegador) na instrução de modelo:
(ngModelChange)="Template statements"
(ngModelChange) = "item.value | useMyPipeToFormatThatValue = $ event"
https://angular.io/guide/template-syntax#template-statements
Como expressões de modelo, as instruções de modelo usam uma linguagem que se parece com JavaScript. O analisador de instrução de modelo difere do analisador de expressão de modelo e suporta especificamente as atribuições básicas (=) e as expressões de encadeamento (com; ou,).
No entanto, certa sintaxe do JavaScript não é permitida :
- Novo
- operadores de incremento e decremento, ++ e -
- atribuição de operador, como + = e - =
- os operadores bit a bit | e &
- os operadores de expressão do modelo
Então você deve escrever da seguinte maneira:
<input [ngModel]="item.value | useMyPipeToFormatThatValue"
(ngModelChange)="item.value=$event" name="inputField" type="text" />
Exemplo de Plunker
item.value
é um número e você oDatePipe
converte em uma sequência de datas. Quando a data é editada,$event
ela também será uma sequência de datas e não se ajustará novamente.item.value
Você deve reverter o que o pipe fez em sua(ngModelChange)
expressão - ou seja, transformar a sequência de datas em um número.(ngModelChange)="updateItemValue($event)"
, crie umupdateItemValue(date: string)
método e dentro deleitem.value = someConversionFunction(date);
Agora, se você está perguntando o que deve usar como função de conversão, eu não sei. TalvezDate.parse()
possa funcionar.A solução aqui é dividir a ligação em uma ligação unidirecional e em evento - que a sintaxe
[(ngModel)]
realmente abrange.[]
é uma sintaxe de ligação unidirecional e()
é uma sintaxe de ligação de evento. Quando usados juntos - o[()]
Angular reconhece isso como abreviação e liga uma ligação bidirecional na forma de uma ligação unidirecional e uma associação de evento a um valor de objeto componente.A razão pela qual você não pode usar
[()]
com um tubo é que eles funcionam apenas com ligações unidirecionais. Portanto, você deve dividir o tubo para operar apenas na ligação unidirecional e manipular o evento separadamente.Consulte Sintaxe de modelo angular para obter mais informações.
fonte
Gostaria de acrescentar mais um ponto à resposta aceita.
Se o tipo do seu controle de entrada não for texto, o canal não funcionará.
Tenha isso em mente e economize seu tempo.
fonte
Eu tentei as soluções acima, mas o valor que vai para o modelo foi o valor formatado, retornando e gerando erros de currencyPipe. Então eu tive que
E na função de addToAmount -> alterar no desfoque, porque o ngModelChange estava me dando problemas de cursor.
E removendo os outros valores não numéricos.
fonte
Minha solução é fornecida abaixo aqui searchDetail é um objeto.
fonte
você deve usar [ngModel] em vez da ligação de modelo bidirecional com [(ngModel)]. use o evento de alteração manual com (ngModelChange). essa é uma regra pública para todas as entradas bidirecionais nos componentes.
porque o canal no emissor do evento está errado.
fonte
devido à ligação bidirecional, para evitar erros de:
você pode chamar uma função para alterar o modelo assim:
será bom se houver uma solução melhor para evitar esse erro.
fonte