J'ai DatePickerRange of Angular Material et je veux exécuter une fonction lors de la modification de la valeur dans DatePicker J'ai essayé avec la fonction (changement) mais cela n'a pas fonctionné, je serais heureux de votre aide pour le faire. Merci!
Ceci est mon html:
@Output() newItemEvent = new EventEmitter<bookedDate>(); addNewDate() { this.dateRange.dateStart = this.range.get('start').value; this.dateRange.dateEnd = this.range.get('end').value; this.newItemEvent.emit(this.dateRange); }
Et c'est la fonction que je souhaite activer:
<mat-form-field class="form-field"> <mat-label>Enter a date range</mat-label> <mat-date-range-input [formGroup]="range" [rangePicker]="picker"> <input matStartDate formControlName="start" placeholder="Start date"> <input matEndDate formControlName="end" placeholder="End date"> </mat-date-range-input> <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle> <mat-date-range-picker #picker></mat-date-range-picker> <mat-error *ngIf="range.controls.start.hasError('matStartDateInvalid')">Invalid start date </mat-error> <mat-error *ngIf="range.controls.end.hasError('matEndDateInvalid')">Invalid end date </mat-error> </mat-form-field>
4 Réponses :
Essayez plutôt dateChange
<mat-date-range-input [formGroup]="range" [rangePicker]="picker" (dateChange)="addNewDate()"> <input matStartDate formControlName="start" placeholder="Start date"> <input matEndDate formControlName="end" placeholder="End date"> </mat-date-range-input>
Comme le dit la documentation, "L'événement (dateInput) se déclenchera chaque fois que la valeur change en raison de la saisie par l'utilisateur ou de la sélection d'une date dans le calendrier. L'événement (dateChange) se déclenchera chaque fois que l'utilisateur aura fini de taper l'entrée (sur <input> flou) , ou lorsque l'utilisateur choisit une date dans le calendrier. " Ou essayez (dateChange)="addNewDate($event)"
Pouvez-vous créer un exemple de stackblitz avec un code minimal?
Cela ne fonctionnera pas pour le moment car mat-date-range-input n'a pas d'événements de sortie
Comme indiqué dans la documentation, mat-date-range-input
a un événement de sortie @Output() dateChange: EventEmitter<MatDatepickerInputEvent<D, S>>
. Vous pouvez vous référer ici material.angular.io/components/datepicker/api
@Kirubel non, ce n'est pas le cas. les entrées à l'intérieur ont.
J'ai quelque chose de similaire à votre problème, cela fonctionne pour moi, alors j'espère que cela pourra vous aider ou vous donner un indice sur une solution, voici mon html:
saveDate(event: any) { // look at how the date is emitted from save console.log(event.target.value.begin); //this.session.dateDebut = event.target.value.begin; console.log(event.target.value.end); // change in view this.dateRangeDisp = event.target.value; // save date range as string value for sending to db // ... save to db }
et la fonction est:
<mat-form-field class="dialogform"> <mat-label>Duree du Session : </mat-label> <input matInput required placeholder="" [satDatepicker]="picker" [value]="dateRangeDisp" (dateChange)="saveDate($event)" > <sat-datepicker #picker [rangeMode]="true"></sat-datepicker> <sat-datepicker-toggle matSuffix [for]="picker"></sat-datepicker-toggle> </mat-form-field>
j'ai oublié cette déclaration: satDatePicker: {begin: Date; date de fin; }; dateRangeDisp: tout;
Cela ne fonctionne pas pour moi, cela n'entre pas du tout dans ma fonction AddNewDate. Merci quand même.
cela peut être basique mais appuyez sur F12 et voyez quelle est l'erreur s'il n'y a personne, cela signifie qu'il n'atteint même pas votre fonction et bonne chance
J'ai vérifié clairement ... mais je ne vois aucun problème.
@Kirubel et @Irad Amri Merci!
Cela fonctionne pour moi à la fin de cette façon:
HTML-
@Output() newItemEvent = new EventEmitter<bookedDate>(); addNewDate(type: string, event: MatDatepickerInputEvent<Date>) { this.dateRange.dateStart = this.range.get('start').value; this.dateRange.dateEnd = this.range.get('end').value; this.newItemEvent.emit(this.dateRange); }
TS-
<mat-form-field class="form-field"> <mat-label>Enter a date range</mat-label> <mat-date-range-input [formGroup]="range" [rangePicker]="picker"> <input **(dateInput)="addEvent('input', $event)" (dateChange)="addEvent('change', $event)"** matStartDate formControlName="start" placeholder="Start date"> <input **(dateInput)="addNewDate('input', $event)" (dateChange)="addNewDate('change', $event)"** matEndDate formControlName="end" placeholder="End date"> </mat-date-range-input> <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle> <mat-date-range-picker #picker></mat-date-range-picker> <mat-error *ngIf="range.controls.start.hasError('matStartDateInvalid')">Invalid start date </mat-error> <mat-error *ngIf="range.controls.end.hasError('matEndDateInvalid')">Invalid end date </mat-error> </mat-form-field>
Et encore une fois, merci beaucoup pour l'aide!
Mon approche consistait à ajouter des variables de référence de modèle aux entrées pour matStartDate
et matEndDate
. Il s'agit de dateRangeStart
et dateRangeEnd
dans l'exemple de modèle ci-dessous:
// Component dateRangeChange(dateRangeStart: HTMLInputElement, dateRangeEnd: HTMLInputElement) { console.log(dateRangeStart.value); console.log(dateRangeEnd.value); }
Les valeurs de ces entrées peuvent être accessibles par une fonction appelée par la dateChange
sortie sur matEndDate
.
// Template <mat-form-field appearance="standard"> <mat-label>{{reportField.value.label}}</mat-label> <mat-date-range-input [rangePicker]="dateRangePicker"> <input matStartDate placeholder="Start date" #dateRangeStart> <input matEndDate placeholder="End date" #dateRangeEnd (dateChange)="dateRangeChange(dateRangeStart, dateRangeEnd)"> </mat-date-range-input> <mat-datepicker-toggle matPrefix [for]="dateRangePicker"> </mat-datepicker-toggle> <mat-date-range-picker #dateRangePicker></mat-date-range-picker> </mat-form-field>
Cela évite la nécessité d'un événement dateChange
sur les deux entrées.