У меня 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>
ngOnChanges
в моем компоненте 2, и мне не нужно возвращать какое-либо событие из компонента 2. - person Hoàng Nguyễn   schedule 29.11.2017