2017-02-23 3 views
2

Angular2에서 component1 (왼쪽 패널 탐색기로 사용)과 component2.이 두 구성 요소는 서로 관련이 없습니다 (형제, 부모 및 자식 ...) . 어떻게 component2에서 component1의 함수를 호출 할 수 있습니까? 여기서 이벤트 바인딩을 사용할 수 없습니다.다른 구성 요소의 구성 요소에서 함수를 호출합니다.

+0

당신은 아마 해당 연결을 관리하는 [서비스] (https://angular.io/docs/ts/latest/tutorial/toh-pt4.html)를 사용하는 것입니다. – ryannjohnson

+0

플럭스 패턴 사용 - 서비스는 이벤트의 디스패처이고 구성 요소는 가입자입니다. 구성 요소는 실제로 서로에 대해 알지 못합니다. 유용 할 수 있습니다. http://stackoverflow.com/questions/42219858/how-can-i-maintain-the-state-of-dialog-box-with-progress-all-over-my-angular-2-a/42221273 # 42221273 – pixelbits

+0

@ryannjohnson (component1)에서 보간 {{total}}을 업데이트해야하고 즉시 왼쪽 패널에 표시해야합니다. 방금 서비스를 호출하면 어떻게이 변수를 업데이트 할 수 있습니까? –

답변

2

공유 서비스는 비 관련 구성 요소 간의 일반적인 통신 방법입니다. 구성 요소는 use a single instance of the service이어야하므로 루트 수준에서 제공되는지 확인하십시오.

공유 서비스 :

@Injectable() 
export class SharedService { 

    componentOneFn: Function; 

    constructor() { } 
} 

구성 요소 하나를

export class ComponentOne { 

    name: string = 'Component one'; 

    constructor(private sharedService: SharedService) { 
     this.sharedService.componentOneFn = this.sayHello; 
    } 

    sayHello(callerName: string): void { 
     console.log(`Hello from ${this.name}. ${callerName} just called me!`); 
    } 
} 

구성 요소 2 :

export class ComponentTwo { 

    name: string = 'Component two'; 

    constructor(private sharedService: SharedService) { 
     if(this.sharedService.componentOneFn) { 
      this.sharedService.componentOneFn(this.name); 
      // => Hello from Component one. Component two just called me! 
     } 
    } 
} 

이 게시물뿐만 아니라 도움이 될 수 있습니다 Angular 2 Interaction between components using a service

+0

2011 년 10 월 24 일까지 계속 작동합니까? 지정한대로 정확히 시도했지만 comp2에서 호출하면 comp1의 이름이 정의되지 않은 것으로 나타납니다. – overboard182

0

관련되지 않은 구성 요소와 통신하는 데 각도 BehaviorSubject를 사용할 수 있습니다.

서비스 파일

import { Injectable } from '@angular/core'; 
import { BehaviorSubject } from 'rxjs/BehaviorSubject'; 


@Injectable() 
export class commonService { 
    private data = new BehaviorSubject(''); 
    currentData = this.data.asObservable() 

    constructor() { } 

    updateMessage(item: any) { 
     this.data.next(item); 
    } 

} 

첫 번째 구성 요소

constructor(private _data: commonService) { } 
shareData() { 
     this._data.updateMessage('pass this data'); 
} 

두 번째 구성 요소

constructor(private _data: commonService) { } 
ngOnInit() { 
    this._data.currentData.subscribe(currentData => this.invokeMyMethode()) 
} 

abov를 사용하여 e 접근 방식을 사용하면 비 관련 구성 요소를 사용하여 데이터를 쉽게 공유하고 메서드를 호출 할 수 있습니다.

More info here