wake-up-neo.com

Angular Material Datepicker: Das Ereignis wird nicht ausgelöst, wenn das Datum ausgewählt wird

Ich verwende den Datepicker von Angular und Angular Material. Meistens funktioniert alles gut, jedoch habe ich ein (change) -Ereignis hinzugefügt, das nur funktioniert, wenn der Benutzer manuell ein Datum eingibt. Es wird nicht ausgelöst, wenn der Benutzer ein Datum aus dem Datepicker-Popup anklickt. Um klar zu sein, der Wert für date ändert sich tatsächlich, wenn der Benutzer auf ein Datum klickt. Es ist nur das (change)-Ereignis und letztendlich meine updateCalcs()-Funktion, die aus irgendeinem Grund nicht ausgelöst wird. Wie kann ich ein Ereignis auslösen, wenn der Benutzer ein Datum aus dem Datepicker klickt?

<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>
12
Brett

Verwenden Sie selectedChanged in md-datepicker.

<md-datepicker #datePicker (selectedChanged)="updateCalcs($event)"></md-datepicker>

$event Gibt den neuen Wert aus, den Sie in Ihrer updateCalcs() -Funktion verwenden können.

updateCalcs(event){
  console.log(event);
}

Ähnliche Demo

5
Nehal

Ersetzen Sie change durch ngModelChange

Wechsel von

<input mdInput 
       [mdDatepicker]="datePicker" 
       placeholder="Choose Date" 
       name="date" [(ngModel)]="date" 
       (change)="updateCalcs()" required>

Zu 

<input mdInput 
       [mdDatepicker]="datePicker" 
       placeholder="Choose Date" 
       name="date" [(ngModel)]="date" 
       (ngModelChange)="updateCalcs()" required>
8
Long Field
<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>

Und .ts

addEvent(type: string, event: MatDatepickerInputEvent<Date>) {
    //console.log(event.value)
}

Überprüfen Sie hier

4
Frank Nguyen

Ich muss hinzufügen, dass (dateInput) nicht immer für mich ausgelöst wurde und am Ende (keyup) verwendet wurde.

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>

endgültiger Code 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()
    }
  }
0
bresleveloper

Es gibt ein dateChange-Ereignis, das sowohl beim Bearbeiten des Datums im Textfeld als auch beim Ändern des Datums über das Kalendersteuerelement ausgelöst wird . Siehe here

<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>
0
Stuart Hallows