Доступ к свойствам компонента из другого компонента - PullRequest
0 голосов
/ 28 сентября 2019

Я новичок в angular и пытаюсь реализовать пользовательский компонент DatePicker (который позволяет выбирать только месяц и год), и у меня возникают проблемы с доступом к его значению из отдельного компонента.Я изменил один из примеров из https://v7.material.angular.io/components/datepicker/overview и пытаюсь использовать предложения из этого конкретного сообщения stackoverflow / ответ: https://stackoverflow.com/a/50723598 (раздел Angular 7+).

Вот мой месяц-year-datepicker.component.html:

<mat-form-field class="reporting-datepicker">
  <input matInput [matDatepicker]="dp" [(ngModel)]="inputValue" (ngModelChange)="inputValueChange.emit(inputDPValue)" [min]="minDate">
  <mat-datepicker-toggle matSuffix [for]="dp"></mat-datepicker-toggle>
  <mat-datepicker #dp
                  [startView]="viewMode"
                  (yearSelected)="chosenYearHandler($event, dp)"
                  (monthSelected)="chosenMonthHandler($event, dp)"
                  panelClass="">
  </mat-datepicker>
</mat-form-field>

Вот мой месяц-год-datepicker.component.ts (соответствующие части):

@Component({
  selector: 'month-year-datepicker',
  templateUrl: 'month-year-datepicker.component.html',
  styleUrls: ['month-year-datepicker.component.css'],
  providers: [
    {provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE]},
    {provide: MAT_DATE_FORMATS, useValue: MY_FORMATS}
  ],
})

export class MonthYearDatepicker {
  viewMode: string = "year";
  minDate: Moment;

  @Input() yearOnly: boolean = false;
  @Input() inputValue: Moment;
  @Output() inputValueChange: EventEmitter<Moment> = new EventEmitter<Moment>();

  constructor() {}

  ngOnInit() {
    if (this.yearOnly)
      this.viewMode = "multi-year"
    this.minDate = moment().subtract(5, 'months');
  }  

  chosenYearHandler(normalizedYear: Moment, datepicker: MatDatepicker<Moment>) {
    var ctrlValue = moment(this.inputValue);
    ctrlValue.year(normalizedYear.year());
    this.inputValue = ctrlValue;
    if (this.yearOnly) datepicker.close();
  }

  chosenMonthHandler(normalizedMonth: Moment, datepicker: MatDatepicker<Moment>) {
    var ctrlValue = moment(this.inputValue);
    ctrlValue.month(normalizedMonth.month());
    this.inputValue = ctrlValue;
    datepicker.close();
  }
}

А потом, в моем отдельномВ файл report.component.html я добавляю указатель даты, например:

<month-year-datepicker [yearOnly]="false" [(inputValue)]="datepickerValue" ngDefaultControl></month-year-datepicker>

Однако в моем отдельном файле reports.component.ts (упрощенно) я не могу получить доступ к значению datepickerValue:

export class ReportingComponent extends ComponentBase implements OnInit, OnDestroy {

  datepickerValue: Date;

  constructor() {}
  ngOnInit(){}

  getDate() {
    return this.datepickerValue; // <- this is undefined still
  }      

}

Я явно что-то упускаю или неправильно понимаю, как работает связывание между компонентами, и буду очень признателен за любую помощь!Спасибо!

1 Ответ

0 голосов
/ 28 сентября 2019

Обновление

(ngModelChange)="inputValueChange.emit(inputDPValue)"

до

(ngModelChange)="inputValueChange.emit($event)"

Также обновите эту опечатку [(ngModel)]="inputValue" до [ngModel]="inputValue", так как вы уже используете синтаксис (ngModelChange).Вряд ли что-то нарушит, но вы должны использовать один или другой синтаксис, а не оба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...