This issue faced when using mat-datepicker
inside *ngFor
.
mat-datepicker
requires a template reference variable #test
in order to bind to the input
.
Is there a direct way to take reference variables when using inside *ngFor
, in general? I couldn't find a way.
Simple working example without *ngFor
<mat-form-field>
<input matInput [matDatepicker]="test" placeholder="Enter Date" [(ngModel)]="someDate" name="someDate">
<mat-datepicker-toggle matSuffix [for]="test"></mat-datepicker-toggle>
<mat-datepicker #test></mat-datepicker>
</mat-form-field>
But since template reference variables
must be unique for the whole template, you can't directly use the mat-datepicker
for scenario when the above block is repeated inside an *ngFor
, test
wouldn't be unique.
Any pointers will be helpful.
I would like to point out that you can use underscore "_" as a separator if you would like to give it a more meaningful name.
Here is a working example with two way model binding.
<div *ngFor="let patient of patients; let i = index;">
<input matInput [matDatepicker]="patientDueDate_i" placeholder="Due date"
[(ngModel)]="patient.dueDate">
<mat-datepicker-toggle matSuffix [for]="patientDueDate_i"></mat-datepicker-toggle>
<mat-datepicker #patientDueDate_i></mat-datepicker>
</div>
You could add an index variable to your ngFor and assign the value of that index as an identifier for you datepicker. You could also make a public array of values inside the component that have a meaning like ["dtPickerOne", "dtPickerTwo"] and use those as values.
<div *ngFor="let t of test; let i = index;">
<input matInput [matDatepicker]="i" placeholder="Choose a date" [attr.id]="dtPicker + i"
[formControl]="dateFrom">
<mat-datepicker-toggle matSuffix [for]="i"></mat-datepicker-toggle>
<mat-datepicker #i></mat-datepicker>
</div>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With