Как вызвать функцию из компонента в другом компоненте? - PullRequest
0 голосов
/ 31 августа 2018

Моя проблема в том, что у меня есть два компонента (давайте назовем их comp1 и comp2 ), и мне нужно вызвать функцию show_it(list) в comp1 из comp2 с некоторыми данными из comp2 . Так что в настоящее время это работает, если я легко запускаю его кнопкой, которая реализована в comp2 . Но теперь я хочу вызвать функцию comp2 в comp1 , щелкнув метку с событием (click). У кого-нибудь есть решение моей проблемы?

Как я вызываю comp1 и comp2 в моем home.html:

 <comp1 [list]="lists" (emitList)="onListUpdate($event)"></comp1>
 <comp2 [list]="additionalInformationList"></comp2>

Функция onListUpdate моего home.ts:

onListUpdate(list: {item:string}[]){
    this.additionalInformationList=list;
    console.log(list);
}

Мой .html comp1:

div>
<ion-list>
    <ion-item *ngFor="let list of list">
        <ion-label (click)="updateList(list)">{{list.item.free_text}}</ion-label>
        <ion-checkbox *ngIf="list.item.checkbox==true"  disabled="false"></ion-checkbox>
    </ion-item>
</ion-list>

My .ts of comp1:

@Component({
  selector: 'caiditems',
  templateUrl: 'caiditems.html'
})
export class CaiditemsComponent {
  transformedList=[];

  @Input()
  list = []; 

  @Output() 
  emitList = new EventEmitter<{item:string}[]>();

  constructor() {
    this.emitList.emit(this.list);
  }

  updateList(list) {
     if(list.item.additional_information!=null){
       this.transformedList=[
        {item: {id: list.item.id, free_text: list.item.free_text, checkbox: list.item.checkbox, additional_information: list.item.additional_information}}]
      console.log("not empty")
     }
     else{
       this.transformedList=[{item: {id: list.item.id, free_text: list.item.free_text, checkbox: list.item.checkbox, additional_information: ""}}]
       console.log("empty")
     }
     this.emitAdditionalinformations(this.transformedList);
     console.log('additional information list updated')
  }

  emitAdditionalinformations(transformedList){
    this.emitList.emit(this.transformedList);
    console.log('list emited');
  }

Мой .html comp2:

<div>
  <button ion-button (click)="show_it(list)">show it to meeeeeee</button><br>
  <ion-label>{{additionalinformation}}<br><br></ion-label>
</div>

My .ts of comp2:

@Component({
  selector: 'caidadditionalinformations',
  templateUrl: 'caidadditionalinformations.html'
})
export class CaidadditionalinformationsComponent {
  additionalinformation="hi";

@Input()
list = []; 

constructor() {  
}

show_it(list){
  console.log(list);
  if(list[0].item.additional_information!=""){
      console.log(list[0].item.additional_information);
      this.additionalinformation=list[0].item.additional_information;
   }
  else{
      this.additionalinformation="no additional informations";
   }
}

1 Ответ

0 голосов
/ 31 августа 2018

Из этого кода вырвано:

 <comp1 [list]="lists" (emitList)="onListUpdate($event)"></comp1>
 <comp2 [list]="additionalInformationList"></comp2>

Я предполагаю, что и comp1, и comp2 являются детьми HomePage. Когда вы нажимаете на метку из comp1, метод onListUpdate($event) выполняется в HomePage, верно?

Вы можете получить ссылку на компонент comp2 в HomePage, а затем вызвать метод show_it() с этой ссылкой.

Это было бы что-то вроде этого:

@Component(...)
export class HomePage {

  // Get a reference of the component instance
  @ViewChild(CaidadditionalinformationsComponent) comp2: CaidadditionalinformationsComponent;

  onListUpdate(list: {item:string}[]){
    this.additionalInformationList = list;
    console.log(list);

    // Use the reference to call the public method
    this.comp2.show_it(list);
  }

} 

Пожалуйста, дайте мне знать, если это не имеет смысла в контексте вашего приложения, возможно, создание проекта stackblitz поможет нам немного лучше понять ваш конкретный сценарий.

Существует несколько других способов обмена данными между компонентами:

  1. Использование общего сервиса, где вы можете хранить данные, и оба компонента могут читать данные оттуда
  2. Использование Ионических событий , чтобы оба компонента могли публиковать / подписываться на изменения данных, без необходимости, чтобы HomePage был посредником.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...