#angular #typescript #angular9
#angular #typescript #angular9
Вопрос:
У меня есть вложенные компоненты. Я хочу вызвать метод в компоненте внука, когда я нажимаю на переключатель в главном родительском компоненте.
Большой родительский компонент
<div class="col text-right">
Show Values:
<ejs-switch
class="form-control form-control-sm"
(change)="displayGrillsValue($event)"
[checked]=true
></ejs-switch>
</div>
<div class="row">
<div class="col">
<div class="ContentControl">
<app-grills-kpi [isInEdit]="isInEdit" [maxWidth]="'450px'" [maxHeight]="'30px'" [controlName]="ControlName.GrillsKPI1"></app-grills-kpi>
</div>
</div>
<div class="col">
<div class="ContentControl">
<app-grills-kpi [isInEdit]="isInEdit" [maxWidth]="'450px'" [maxHeight]="'30px'" [controlName]="ControlName.GrillsKPI2"></app-grills-kpi>
</div>
</div>
</div>
Родительский компонент :
<app-grills-kpi-chart #chart [grillsKPIModel]="grillsKPIModel" [exportName]="formattedKPIName">
</app-grills-kpi-chart>
Большой дочерний компонент :
Это метод, который я хочу вызвать
displayGrillsValue = ($event) => {
this.chart.visibleSeries.forEach(element => {
if($event.checked){
element.marker = this.marker;
}else {
element.marker.dataLabel.visible = $event.checked;
}
});
this.chart.refresh();
}
Пожалуйста, подскажите мне, как лучше всего это сделать. Также, если вы заметили, что у меня есть 2 диаграммы в большом родительском компоненте. Поэтому, когда я нажимаю кнопку переключения, я хочу, чтобы обе диаграммы обновлялись методом большого дочернего компонента.
Ответ №1:
вы можете использовать BehaviorSubject или Subject для запуска вызова функции
TriggerService.ts
@Injectable()
export class TriggerService{
constructor(){}
private _trigger = new BehaviorSubject<string>('');
castTrigger = this._trigger.asObservable();
trigger(){
this._trigger.next('');
}
}
parent.component.ts
constructor(private triggerService: TriggerService){}
displayGrillsValue(){
this.triggerService.trigger();
}
child.component.ts
constructor(private triggerService: TriggerService){}
ngOnInit(){
this.triggerService.castTrigger.subscribe(data => // grand child component logic here);
}
Комментарии:
1. но в этом случае как мне вызвать большой дочерний компонент и обновить обе диаграммы? Нужно ли мне напрямую вызывать службу в большом дочернем компоненте?
2. нет, вы можете запустить метод дочернего компонента из родительского, потому что дочерний элемент подписан на эту тему.. пожалуйста, посмотрите демонстрацию stackblitz
3. я думаю, что в вашем примере это только родительский дочерний элемент, но в моем у меня тоже есть великий родитель, так что в этом случае, как сделать
4. это не имеет значения, у вас может быть n дочерних компонентов, если дочерние компоненты подписаны на эту тему
5. понял, вы имеете в виду, что в моем большом дочернем компоненте я могу подписаться на эту тему, я прав?