Vous ne pouvez pas utiliser les opérateurs d'expression de modèle (tube, navigateur de sauvegarde) dans l'instruction de modèle:
(ngModelChange)="Template statements"
(ngModelChange) = "item.value | useMyPipeToFormatThatValue = $ event"
https://angular.io/guide/template-syntax#template-statements
Comme les expressions de modèle, les instructions de modèle utilisent un langage qui ressemble à JavaScript. L'analyseur d'instruction de modèle diffère de l'analyseur d'expressions de modèle et prend spécifiquement en charge à la fois l'affectation de base (=) et les expressions de chaînage (avec; ou,).
Cependant, certaines syntaxes JavaScript ne sont pas autorisées :
- Nouveau
- opérateurs d'incrémentation et de décrémentation, ++ et -
- affectation d'opérateur, telle que + = et - =
- les opérateurs bit à bit | et &
- les opérateurs d'expression de modèle
Vous devriez donc l'écrire comme suit:
<input [ngModel]="item.value | useMyPipeToFormatThatValue"
(ngModelChange)="item.value=$event" name="inputField" type="text" />
Exemple de Plunker
item.value
c'est un nombre, et que vous utilisezDatePipe
pour le convertir en une chaîne de date. Lorsque la date est modifiée, le$event
sera également une chaîne de date et ne rentrera pas dansitem.value
Vous devez inverser ce que le tube a fait dans votre(ngModelChange)
expression - c'est-à-dire ramener la chaîne de date à un nombre.(ngModelChange)="updateItemValue($event)"
, puis créez uneupdateItemValue(date: string)
méthode et à l'intérieur.item.value = someConversionFunction(date);
Maintenant, si vous demandez ce que vous devez utiliser comme fonction de conversion, je ne sais pas. PeutDate.parse()
- être pourrait fonctionner.La solution ici est de diviser la liaison en une liaison unidirectionnelle et une liaison d'événement - que la syntaxe
[(ngModel)]
englobe en fait.[]
est une syntaxe de liaison unidirectionnelle et()
une syntaxe de liaison d'événement. Lorsqu'il est utilisé ensemble -[()]
Angular reconnaît cela comme un raccourci et connecte une liaison bidirectionnelle sous la forme d'une liaison unidirectionnelle et d'une liaison d'événement à une valeur d'objet composant.La raison pour laquelle vous ne pouvez pas utiliser
[()]
avec un tube est que les tubes ne fonctionnent qu'avec des liaisons unidirectionnelles. Par conséquent, vous devez séparer le canal pour n'opérer que sur la liaison unidirectionnelle et gérer l'événement séparément.Voir Syntaxe du modèle angulaire pour plus d'informations.
la source
Je voudrais ajouter un autre point à la réponse acceptée.
Si le type de votre contrôle d'entrée n'est pas du texte, le tube ne fonctionnera pas.
Gardez cela à l'esprit et économisez votre temps.
la source
J'ai essayé les solutions ci-dessus, mais la valeur qui va au modèle était la valeur formatée puis retournée et me donnant des erreurs currencyPipe. Alors je devais
Et sur la fonction de addToAmount -> changer le flou car le ngModelChange me posait des problèmes de curseur.
Et en supprimant les autres valeurs non numériques.
la source
Ma solution est donnée ci-dessous ici searchDetail est un objet.
la source
vous devez utiliser [ngModel] au lieu d'une liaison de modèle bidirectionnelle avec [(ngModel)]. puis utilisez l'événement de changement manuel avec (ngModelChange). il s'agit d'une règle publique pour toutes les entrées bidirectionnelles dans les composants.
parce que le tuyau sur l'émetteur d'événement est faux.
la source
en raison de la liaison bidirectionnelle, pour éviter les erreurs de:
vous pouvez appeler une fonction pour changer de modèle comme ceci:
ce sera bien s'il existe une meilleure solution pour éviter cette erreur.
la source