Angular 5, Angular Material: Die Validierung des Datepickers funktioniert nicht

8

Ich verwende das neueste Angular und das neueste Angular Material. Ich habe einen Datepicker und möchte eine Bestätigung hinzufügen. Dokumente sagen, dass das required -Attribut out of the box funktionieren sollte, aber es scheint Fehler nicht in der gleichen Weise zu behandeln, wie andere Formularelemente.

Hier ist mein Markup:

%Vor%

Dies funktioniert auf dem Happy-Pfad. Wenn also ein Datum ausgewählt wird, endet das Datum in der erwarteten Eigenschaft in myService .

Die Validierung funktioniert nicht so, wie ich es erwarten würde; In diesem Fall, wenn ich in das Feld und dann aus dem Feld klicke, ohne ein Datum einzugeben, erhält die Eingabe , aber das übliche [controlName].errors -Objekt wird nicht ausgefüllt. Dies bedeutet, dass das Anzeigen einer Fehlermeldung in der üblichen Weise (die Art, die mit anderen Eingaben arbeitet, die keine Datumauswahl auf derselben Seite sind) nicht funktioniert:

%Vor%

Das *ngIf ist niemals wahr, da der Datepicker niemals dob.errors zu aktualisieren scheint. Daher wird die Fehlermeldung nie angezeigt, auch wenn die Eingabe als ungültig formatiert ist.

Stimmt das? Habe ich etwas verpasst?

Ich habe auch versucht, eine benutzerdefinierte Anweisung hinzuzufügen, um zu bestätigen, dass das Datum, das mit dem Datumsauswahl ausgewählt wurde, anzeigt, dass der Benutzer über 18 ist:

%Vor%

In diesem Fall versuche ich, eine ähnliche matError (außer Verknüpfung mit dob.errors.validateAdult statt dessen) zu verwenden, um den Fehler gegebenenfalls anzuzeigen.

Das Interessante daran ist, dass wenn ich ein Datum vor weniger als 18 Jahren auswähle, die gesamte Eingabe, das Label usw. den roten Standardfehler-Stil bekommt, also passiert etwas, aber ich sehe meinen Fehler immer noch nicht Nachricht.

Irgendwelche Vorschläge würden sehr geschätzt!

Genaue Versionen:

%Vor%     
danwellman 16.01.2018, 14:23
quelle

7 Antworten

0

Ich habe es geschafft, das ohne die ErrorStateMatcher funktionieren zu lassen, obwohl das mir geholfen hat, die Lösung zu erreichen. Verlassen Sie hier für zukünftige Referenz oder um anderen zu helfen.

Ich habe mein Formular in eine reaktive Form anstelle einer vorlagengesteuerten Form konvertiert und die benutzerdefinierte Validierer-Direktive in einen einfacheren Validator (nicht-direktivenbasiert) geändert.

Hier ist der Arbeitscode:

my-form.component.html:

%Vor%

note : Der obige Code befindet sich in einigen verschachtelten ngFor Schleifen, die den Wert von fieldset und control definieren. In diesem Beispiel wird control der Zeichenkette dob zugeordnet.

über-achtzehn.validator.ts:

%Vor%

my-form.component.ts:

%Vor%     
danwellman 30.01.2018, 15:04
quelle
2

Ich benutze ErrorStateMatcher in meinen Angular Material Forms, es funktioniert perfekt.

Sie sollten einen Code haben, der so aussieht:

%Vor%

Und Typoskript:

%Vor%

Sie können hier mehr darüber sehen: Ссылка

    
Manon Ingrassia 25.01.2018 14:52
quelle
1

Sie haben die # dob dupliziert. Das kann ein unerwünschtes Verhalten bei der Winkelvalidierung haben.

Sie haben

%Vor%

und

%Vor%

Bitte korrigieren Sie die Namenskonvention und sehen Sie was passiert.

    
Leonardo Neninger 25.01.2018 13:58
quelle
1

Fügen Sie dies in Ihrer Ansichtsseite hinzu:

%Vor%

Importieren Sie einfach MatDatepickerModule, MatNativeDateModule in Ihrem Modul

    
Ajai 20.02.2018 12:45
quelle
1

Sie können den Namen der Eingangsreferenz wie folgt ändern ..  Beachten Sie, dass das Eingabeelement #dobInput nur im Mat-Fehler referenziert wird.

%Vor%

Der Picker wird mit #dbo

referenziert %Vor%     
Leonardo Neninger 25.01.2018 16:04
quelle
0

Haben Sie versucht, den * ngIf wie folgt auf Ihren benutzerdefinierten Validator zu setzen:

%Vor%

Wenn das funktioniert, können Sie einen anderen Validator erstellen, um das erforderliche native Validierungsverhalten zu simulieren.

%Vor%

Und dann benutze die vorherige ngIf wie folgt:

%Vor%

Ich habe es nicht getestet, aber logisch sollte es funktionieren.

    
Nour 23.01.2018 12:09
quelle
-1

Sehen Sie sich das und dies . Und sehen Sie sich bitte ein funktionierendes javascriptbasiertes Beispiel hier an.

Sie können auch diesen (winkelbasierten) Datums-Picker testen:

HTML:

%Vor%

JS:

%Vor%     
A STEFANI 22.01.2018 02:14
quelle