Sie können keine Template-Ausdrucksoperatoren (Pipe, Save Navigator) in der Template-Anweisung verwenden:
(ngModelChange)="Template statements"
(ngModelChange) = "item.value | useMyPipeToFormatThatValue = $ event"
https://angular.io/guide/template-syntax#template-statements
Vorlagenanweisungen verwenden wie Vorlagenausdrücke eine Sprache, die wie JavaScript aussieht. Der Parser für Vorlagenanweisungen unterscheidet sich vom Parser für Vorlagenausdrücke und unterstützt insbesondere sowohl grundlegende Zuweisungs- (=) als auch Verkettungsausdrücke (mit; oder,).
Bestimmte JavaScript-Syntax ist jedoch nicht zulässig :
- Neu
- Inkrement- und Dekrementoperatoren, ++ und -
- Operatorzuweisung wie + = und - =
- die bitweisen Operatoren | und &
- die Vorlagenausdrucksoperatoren
Sie sollten es also wie folgt schreiben:
<input [ngModel]="item.value | useMyPipeToFormatThatValue"
(ngModelChange)="item.value=$event" name="inputField" type="text" />
Plunker Beispiel
item.value
handelt sich um eine Zahl, mit der SieDatePipe
sie in eine Datumszeichenfolge konvertieren. Wenn das Datum bearbeitet wird, ist das$event
auch eine Datumszeichenfolge und passt nicht wieder hinein.item.value
Sie müssen umkehren, was die Pipe in Ihrem(ngModelChange)
Ausdruck getan hat - dh die Datumszeichenfolge wieder in eine Zahl umwandeln.(ngModelChange)="updateItemValue($event)"
, dann erstelle eineupdateItemValue(date: string)
Methode und darin.item.value = someConversionFunction(date);
Wenn du nun fragst , was du als Konvertierungsfunktion verwenden sollst, weiß ich es nicht. VielleichtDate.parse()
könnte es funktionieren.Die Lösung besteht darin, die Bindung in eine Einwegbindung und eine Ereignisbindung aufzuteilen - was die Syntax
[(ngModel)]
tatsächlich umfasst.[]
ist eine Einwegbindungssyntax und()
eine Ereignisbindungssyntax. Bei gemeinsamer Verwendung[()]
erkennt Angular dies als Abkürzung und verdrahtet eine bidirektionale Bindung in Form einer einseitigen Bindung und einer Ereignisbindung an einen Komponentenobjektwert.Der Grund, den Sie
[()]
mit einem Rohr nicht verwenden können, ist, dass Rohre nur mit Einwegbindungen funktionieren. Daher müssen Sie das Rohr aufteilen, um nur die Einwegbindung zu bearbeiten und das Ereignis separat zu behandeln.Weitere Informationen finden Sie unter Angular Template Syntax .
quelle
Ich möchte der akzeptierten Antwort noch einen Punkt hinzufügen.
Wenn der Typ Ihres Eingabesteuerelements kein Text ist, funktioniert die Pipe nicht.
Denken Sie daran und sparen Sie Zeit.
quelle
Ich habe die oben genannten Lösungen ausprobiert, aber der Wert, der an das Modell geht, war der formatierte Wert, der zurückgegeben wurde und mir CurrencyPipe-Fehler gab. Also musste ich
Und über die Funktion von addToAmount -> Änderung bei Unschärfe, weil ngModelChange mir Cursorprobleme bereitete.
Und Entfernen der anderen nicht numerischen Werte.
quelle
Meine Lösung ist unten angegeben. SearchDetail ist ein Objekt.
quelle
Sie müssen [ngModel] anstelle der bidirektionalen Modellbindung mit [(ngModel)] verwenden. Verwenden Sie dann das manuelle Änderungsereignis mit (ngModelChange). Dies ist eine öffentliche Regel für alle bidirektionalen Eingaben in Komponenten.
weil Pipe-on-Event-Emitter falsch ist.
quelle
wegen der Zwei-Wege-Bindung, um Fehler zu vermeiden von:
Sie können eine Funktion zum Ändern des Modells wie folgt aufrufen:
Es ist gut, wenn es eine bessere Lösung gibt, um diesen Fehler zu verhindern.
quelle