J'utilise Datepicker de Angular and Angular Material. Tout fonctionne normalement, mais j’ai ajouté un événement (change)
qui ne fonctionne que lorsque l’utilisateur saisit manuellement une date. Il ne se déclenche pas lorsque l'utilisateur clique sur une date dans la fenêtre contextuelle Datepicker. Pour être clair, la valeur de date
change en fait lorsque l'utilisateur clique sur une date, il ne s'agit que de l'événement (change)
et finalement de ma fonction updateCalcs()
qui, pour une raison quelconque, ne se déclenche pas. Comment puis-je déclencher un événement lorsque l'utilisateur clique sur une date à partir du sélecteur de date?
<md-input-container>
<input mdInput [mdDatepicker]="datePicker" placeholder="Choose Date" name="date" [(ngModel)]="date" (change)="updateCalcs()" required>
<button mdSuffix [mdDatepickerToggle]="datePicker"></button>
</md-input-container>
<md-datepicker #datePicker></md-datepicker>
Remplacer change
par ngModelChange
Changer de
<input mdInput
[mdDatepicker]="datePicker"
placeholder="Choose Date"
name="date" [(ngModel)]="date"
(change)="updateCalcs()" required>
À
<input mdInput
[mdDatepicker]="datePicker"
placeholder="Choose Date"
name="date" [(ngModel)]="date"
(ngModelChange)="updateCalcs()" required>
<mat-form-field>
<input matInput [matDatepicker]="picker" placeholder="Input & change events"
(dateInput)="addEvent('input', $event)" (dateChange)="addEvent('change', $event)">
<mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
<mat-datepicker #picker></mat-datepicker>
</mat-form-field>
Et .ts
addEvent(type: string, event: MatDatepickerInputEvent<Date>) {
//console.log(event.value)
}
Vérifiez ici
Je dois ajouter que (dateInput)
n'a pas toujours tiré pour moi, a fini par utiliser (keyup)
code HTML
<mat-form-field>
<input #fromInput matInput [matDatepicker]="pickerFrom" placeholder="סנן תאריך התחלה"
(dateChange)="filterFrom($event)" (keyup)="filterInputKeyupFrom()">
<mat-datepicker-toggle matSuffix [for]="pickerFrom"></mat-datepicker-toggle>
<mat-datepicker #pickerFrom></mat-datepicker>
</mat-form-field>
code final TS
private parseInputDate(v):Date{
//this was a manual change in the input and needs to be parsed
let a:Array<any> = v.split('.')
a.forEach((v, i) => a[i] = parseInt(v) + (i == 1 ? -1 : 0))
console.log(new Date(a[2], a[1], a[0]))
return new Date(a[2], a[1], a[0])
}
//(dateInput) wasn't always firing for me, ended up using (keyup)
filterInputKeyupFrom(){
this.lastFrom = this.parseInputDate(this.fromInput.nativeElement.value)
if (this.lastFrom) {
this.lastFrom.setSeconds(-1)
}
this.filterDates()
}
filterInputKeyupUpTo(){
this.lastTo = this.parseInputDate(this.toInput.nativeElement.value)
if (this.lastTo) {
this.lastTo.setDate(this.lastTo.getDate()+1)
}
this.filterDates()
}
filterFrom(e:MatDatepickerInputEvent<Date>){
console.log('filterFrom')
//changing manually the input and then exit from it fires here
if(e.value){
//need to clone the date or changes are applied on the Picker
this.lastFrom = new Date(e.value)
if (this.lastFrom) {
this.lastFrom.setSeconds(-1)
}
this.filterDates()
}
}
filterUpTo(e:MatDatepickerInputEvent<Date>){
console.log('filterUpTo')
if(e.value){
this.lastTo = new Date(e.value)
if (this.lastTo) {
this.lastTo.setDate(this.lastTo.getDate()+1)
}
this.filterDates()
}
}
Il existe un événement dateChange
qui est déclenché à la fois lorsque la date est modifiée dans la zone de texte et lorsque la date est modifiée via le contrôle du calendrier . Voir ici
<mat-form-field>
<input matInput [matDatepicker]="datepicker" required placeholder="Choose a date" (dateChange)="valueChanged()">
<mat-datepicker-toggle matSuffix [for]="datepicker"></mat-datepicker-toggle>
<mat-datepicker #datepicker></mat-datepicker>
</mat-form-field>