У меня была такая же проблема, и это простой, но не очень элегантный обходной путь, который я использую. Перейдите в другое свойство, чтобы заставить методу запуска ngOnChanges
<div poll-stat-chart [barData]="barData" [changeTrigger]="changeTrigger"></div>
В классе родительского компонента, каждый раз, когда вы хотите вручную огонь метод ngOnChanges на ребенка компоненте, просто изменить свойство «changeTrigger»
ParentComponent Class (poll- стат-диаграмма является дочерним компонентом)
@Component({
directives: [PollStatChartCmp],
template: `
<div poll-stat-chart [barData]="barData" [changeTrigger]="changeTrigger">
</div>
<button (click)="triggerChild()"></button>
`
}
export class ParentComponent {
changeTrigger = 1;
barData = [{key:1, value:'1'}, {key:2, value'2'}];
triggerChild() {
this.barData[0].value = 'changedValue';
//This will force fire ngOnChanges method of PollStatChartComponent
this.changeTrigger ++ ;
}
}
А потом в классе компонента ребенка, добавьте свойство [changeTrigger]
@Component({
selector: '[poll-stat-chart]',
inputs: ['barData', 'changeTrigger'],
template: `
<h4>This should be a BAR CHAR</h4>
`
})
export class PollStatChartCmp {
barData;
changeTrigger;
constructor(private elementRef: ElementRef) {
this.render();
}
ngOnChanges(changes) {
console.log('ngOnChanges fired');
this.render();
}
render() { console.log('render fired');}
}
Чтобы вручную запустить обнаружение изменений, попробуйте использовать ApplicationRef.tick(). Однако я не верю, что ngOnChanges() будет вызываться, поскольку свойство хоста не изменилось. Почему вы изменяете дочернее свойство в дочернем компоненте, являющемся входным свойством? –
Код выше не является фактическим кодом, я просто использовал его, чтобы продемонстрировать проблему. Мой реальный код - это единичный тест, и я получил экземпляр компонента с помощью 'TestComponentBuilder'. Я хочу, чтобы модульный тестовый код изменял значение свойства 'message' и проверял, что событие выдается из кода в' ngOnChanges'. Но через пару часов голова царапается, я не могу понять, как это сделать. Я также пробовал модифицировать 'nativeElement' на' DebugElement', чтобы не повлиять. – ovangle
Я искал такой метод, как 'ComponentFixture.modifyHostBinding (свойство: string, newValue: any)' или что-то подобное, но похоже, что ничего подобного не было, поэтому я задал более общий вопрос. – ovangle