Angular 2+ ngOnChanges конфликтует с eventEmitter

У меня 2 компонента в одних и тех же родителях. Когда я нажимаю кнопку onSubmit() в компоненте 1, он отправляет событие submittedPayment родителям, которые сохраняют событие в processingPayment, а затем компонент 2 получает это событие через родителей. Однако компонент 2 имеет функцию ngOnChanges, которая конфликтует с отправкой полученного события. Когда я нажимаю onSubmit(), консоль показывает ошибку «Невозможно прочитать свойство currentValue неопределенного» в функции ngOnChanges. Если я удалю директиву [disabledCancelBtn]="processingPayment", генерирующую это событие, код будет работать нормально, но компонент 2 не получит события от этого действия щелчка.

Вот мой код:

Компонент 1:

export class Component1 implements OnInit {

  @Input() openTransaction = <Transaction>{};
  @Output() submittedPayment = new EventEmitter<boolean>();

  submitted: boolean = false;
  disabledSubmitButton: boolean = false;  

  constructor() {}  

  onSubmit(formValues: any) {
    this.submitted = true;
    this.disabledSubmitButton = true;
    this.submittedPayment.emit(true);
    console.log(formValues);
  }

  ngOnInit() {}
} 

Компонент 2:

export class Component2 implements OnInit, OnChanges {

  @Input() openTransaction = <Models.Transaction>{};
  @Input() disabledCancelBtn: boolean = false;
  @Output() onUpdateTransaction = new EventEmitter<Models.Transaction>();
  editableBtc: any;
  editableUsd: any;
  editingBtc: boolean = false;
  editingUsd: boolean = false;
  cancelling: boolean = false;

  constructor(
    public timerService: RateTimerService,
    @Inject(PLATFORM_ID) private platformId: Object
  ) { }

  ngOnInit() { }

  ngOnChanges(changes: SimpleChanges) {
    if (isPlatformBrowser(this.platformId)) {
      if (changes.openTransaction.currentValue !== undefined) { // ERROR HERE 
        this.editableBtc = this.openTransaction.btcAmount;
        this.editableUsd = this.openTransaction.total;

        const timeLeft = moment.utc(this.openTransaction.validUntil).diff(moment.utc(Date.now()), 'seconds');
        this.timerService.startRestart(timeLeft);
      }
    }
  }
}

Родительский компонент:

export class ParentsComponent implements OnInit {

  openTransaction: Models.Transaction;

  processingPayment: boolean = false;

  constructor(private apiService: ApiService,
    @Inject(PLATFORM_ID) private platformId: Object) {
  }

  ngOnInit() {
    if (isPlatformBrowser(this.platformId)) {
      this.apiService.openTransactions()
        .subscribe(
        (pending: Models.Transaction[]) => {
          this.openTransaction = pending[0];
        },
        (err) => console.log('Error fetching Pending transactions: ', err));
    }
  }
}

Вид родителей:

<div class="col-sm-12 col-md-6 payment-section">
      <app-component1  [openTransaction]="openTransaction"
                            (submittedPayment)="processingPayment = $event">
      </app-component1>
    </div>

    <div class="col-sm-12 col-md-6 summary-section">
      <app-component2 [disabledCancelBtn]="processingPayment"
                      [openTransaction]="openTransaction">
      </app-component2>
    </div>

person Hoàng Nguyễn    schedule 28.11.2017    source источник
comment
Вы можете предоставить репродукцию   -  person amal    schedule 28.11.2017
comment
Я применяю аналогичный метод из этого (plnkr.co/edit/tXzr3XgTrgMWMVzAw8d7?p=preview ). Единственное отличие - это ngOnChanges в моем компоненте 2, и мне не нужно возвращать какое-либо событие из компонента 2.   -  person Hoàng Nguyễn    schedule 29.11.2017


Ответы (1)


Параметр changes содержит измененные свойства. Поэтому, когда изменяется только свойство processingPayment, вы не можете ожидать, что будет определено changes.openTransaction.

person Community    schedule 28.11.2017
comment
так каков наилучший способ исправить это? - person Hoàng Nguyễn; 29.11.2017
comment
Хорошо, я понял, что вы имели в виду, мне нужно проверить несколько входных данных в ngOnChanges на предмет изменения значений, тогда все работает нормально. Спасибо !!! - person Hoàng Nguyễn; 29.11.2017