No puede usar operadores de expresión de plantilla (tubería, guardar navegador) dentro de la declaración de plantilla:
(ngModelChange)="Template statements"
(ngModelChange) = "item.value | useMyPipeToFormatThatValue = $ event"
https://angular.io/guide/template-syntax#template-statements
Al igual que las expresiones de plantilla, las declaraciones de plantilla usan un lenguaje que se parece a JavaScript. El analizador de sentencias de plantilla difiere del analizador de expresiones de plantilla y admite específicamente tanto la asignación básica (=) como las expresiones de encadenamiento (con; o,).
Sin embargo, cierta sintaxis de JavaScript no está permitida :
- nuevo
- operadores de incremento y decremento, ++ y -
- asignación de operador, como + = y - =
- los operadores bit a bit | y &
- los operadores de expresiones de plantilla
Entonces debes escribirlo de la siguiente manera:
<input [ngModel]="item.value | useMyPipeToFormatThatValue"
(ngModelChange)="item.value=$event" name="inputField" type="text" />
Ejemplo de Plunker
item.value
es un número, y lo usaDatePipe
para convertirlo en una cadena de fecha. Cuando se edita la fecha,$event
también será una cadena de fecha y no se ajustará de nuevo.item.value
Debe invertir lo que hizo la tubería en su(ngModelChange)
expresión, es decir, volver la cadena de fecha a un número.(ngModelChange)="updateItemValue($event)"
, luego cree unupdateItemValue(date: string)
método y dentro de él.item.value = someConversionFunction(date);
Ahora, si pregunta qué debe usar como función de conversión, no lo sé. QuizásDate.parse()
podría funcionar.La solución aquí es dividir el enlace en un enlace unidireccional y un enlace de evento, que en
[(ngModel)]
realidad abarca la sintaxis .[]
es una sintaxis de enlace unidireccional y()
es una sintaxis de enlace de eventos. Cuando se usan juntos:[()]
Angular reconoce esto como una forma abreviada y conecta un enlace bidireccional en forma de enlace unidireccional y un enlace de evento a un valor de objeto componente.La razón por la que no puede usar
[()]
una tubería es que las tuberías funcionan solo con enlaces unidireccionales. Por lo tanto, debe dividir la tubería para operar solo en el enlace unidireccional y manejar el evento por separado.Consulte Sintaxis de plantilla angular para obtener más información.
fuente
Me gustaría agregar un punto más a la respuesta aceptada.
Si el tipo de control de entrada no es texto, la tubería no funcionará.
Tenlo en cuenta y ahorra tiempo.
fuente
Probé las soluciones anteriores, pero el valor que va al modelo fue el valor formateado y luego regresó y me dio errores de currencyPipe. Entonces tuve que
Y en la función de addToAmount -> cambio en desenfoque porque el ngModelChange me estaba dando problemas con el cursor.
Y eliminando los otros valores no numéricos.
fuente
Mi solución se proporciona a continuación aquí searchDetail es un objeto.
fuente
debe usar [ngModel] en lugar del enlace de modelo bidireccional con [(ngModel)]. luego use el evento de cambio manual con (ngModelChange). Esta es una regla pública para todas las entradas bidireccionales en los componentes.
porque la tubería en el emisor de eventos está mal.
fuente
debido a la unión bidireccional, para evitar errores de:
puede llamar a una función para cambiar el modelo de esta manera:
será bueno si hay una mejor solución para evitar este error.
fuente