Как вызвать метод родственного компонента в Angular?

У меня есть компонент заголовка, у которого есть автозаполнение поиска, когда пользователь что-то ищет и выбирает один элемент из раскрывающегося списка предложений, тело будет соответствующим образом изменено. В теле 3 раздела, которые отображаются на основе трех различных условий. Здесь заголовок и тело - это 2 разных компонента. Следовательно, как вызвать функцию в теле, которая имеет некоторую логику вместе с ложными и истинными переменными. когда пользователь выбирает что-то из раскрывающегося списка автозаполнения поиска.
Я пытаюсь общаться через сервисный подход.
Код заголовка

<div class="docs-example-viewer-body custom-search" *ngIf="showSearch">
  <select class="search-dropdown">
    <option value="1">All</option>
    <option value="2">Brand</option>
    <option value="3">Molecule</option>
  </select>
  <app-auto-complete [mySearchData]="mySearchData" (onchange)="onchange($event)" (onsearchKey)="getOnsearchkey($event)"></app-auto-complete>
  <i class="material-icons">search </i>
</div>


Основной код

<div *ngIf="aaa"> 123</div>
<div *ngIf="bbb"> 333</div>

компонент заголовка ts

onChange(value) {
  this.planningService.changeOccured(value);
}

служба планирования ts

@Output() change: EventEmitter<any> = new EventEmitter();
changeOccured(value) {
  this.change.emit(value);
}

и пытаемся поймать событие из такого компонента тела. Но это не срабатывает в компоненте тела. в чем проблема
компонент тела

onChange(value){
this.isSearchScreen = false;
this.isPlanListScreen = true;
this.isCreateScreen = false;
console.log('value',value)
this.myPlan.moleculeId = value.id;
this.selectedCombination = new SelectedCombination(value.brand,value.name);
this.planningService.getProductMapData(value.name).subscribe((data)=>{
  this.strengthANdPacks = data;
},(error)=>{
  console.log(error);
});
this.planningService.getAllPlans(value.id,false).subscribe((data)=>{
  this.allPlans = data;

},(error)=>{
  console.log(error);
});
}

ngOnInit(){
this.planningService.change.subscribe(value => {
  console.log('change occured')
 this.onChange(value)
});

}

Я не могу поймать событие из службы в компоненте тела. Может кто-нибудь мне помочь

Ссылка: https://medium.com/dailyjs/3-ways-to-communicate-between-angular-components-a1e3f3304ecb


person Thilak Raj    schedule 18.05.2018    source источник
comment
попробуйте это, вы можете добавить его как директиву и вызвать его методы stackoverflow.com/a/50268682/4399281   -  person Fateh Mohamed    schedule 18.05.2018
comment
Какая связь между вашими компонентами? Они разбиты? Они родитель / ребенок?   -  person    schedule 18.05.2018
comment
Извините, это на самом деле родственный компонент s   -  person Thilak Raj    schedule 18.05.2018
comment
comment
@Always_hungry Пожалуйста, проверьте мой отредактированный вопрос   -  person Thilak Raj    schedule 21.05.2018
comment
это ‹app-auto-complete› служба планирования ts?   -  person Mac_W    schedule 21.05.2018
comment
‹App-auto-complete› является компонентом   -  person Thilak Raj    schedule 22.05.2018


Ответы (1)


Чтобы вызвать метод дочернего компонента из родительского компонента, вы можете использовать ViewChild.

В родительском классе вы должны импортировать дочерний компонент

import { ChildComponent } from './child-component.ts';

а затем используйте что-то подобное:

@ViewChild(ChildComponent) childComponent: ChildComponent;

Тогда у вас будет доступ к методам и свойствам дочерних компонентов:

this.childComponent.myMethod()

or

this.parentComponentValue = childComponent.property
person Mac_W    schedule 18.05.2018
comment
Выдача ошибки AppHeaderComponent.html: 63 ERROR TypeError: невозможно прочитать свойство myMethod из undefined - person Thilak Raj; 18.05.2018
comment
Это плитка вашего вопроса - как вызвать метод в другом компоненте. Чтобы получить обновленное значение, вы можете затем вызвать в родительском компоненте обновленное свойство из дочернего компонента и присвоить его значение свойству родительского компонента. - person Mac_W; 18.05.2018
comment
@ThilakRaj - увидимся, вы обновили вопрос - не могли бы вы опубликовать еще код? Родительский и детский класс? - person Mac_W; 18.05.2018
comment
просто чтобы уточнить, используйте this.childComponent.myMethod () в компоненте, запускающем функцию для своего брата или сестры. - person artworkjpm; 20.01.2020