2

목표는 앵귤러 구성 요소의 데이터를 서비스로 보내고 서비스 방법을 사용하여 작업하는 것입니다. 예 :각도 2가 구성 요소에서 서비스로 데이터를 전송합니다.

export class SomeComponent { 
    public data: Array<any> = MyData; 
    public constructor(private myService: MyService) { 
     this.myService.data = this.data; 
    } 
} 

및 서비스 :

@Injectable() 
export class TablePageService { 
    public data: Array<any>; 
    constructor() { 
     console.log(this.data); 
     // undefined 
    } 
} 

얻기 데이터는 정의되지 않습니다. 어떻게 작동 시키는가?

+1

서비스 생성자는 구성 요소에 삽입 할 때 이미 실행되었습니다. 사용자가 초기화하지 않았으므로 '데이터'는 그 당시 정의되지 않았습니다. –

+0

개체의 메서드를 호출하려면 먼저 개체를 생성해야합니다. 따라서 생성자가 호출되고 데이터는 정의되지 않습니다. 그런 다음 나중에 멤버에 액세스하여 변수를 수정하지만 생성자가 이미 호출되었습니다. – Akkusativobjekt

+0

어떻게 해결할 수 있습니까? – TeodorKolev

답변

3

서비스 구성 요소 간의 상호 작용을 할 수있는 경우의 예 :

서비스 :

@Injectable() 
export class MyService { 
    myMethod$: Observable<any>; 
    private myMethodSubject = new Subject<any>(); 

    constructor() { 
     this.myMethod$ = this.myMethodSubject.asObservable(); 
    } 

    myMethod(data) { 
     console.log(data); // I have data! Let's return it so subscribers can use it! 
     // we can do stuff with data if we want 
     this.myMethodSubject.next(data); 
    } 
} 

컴포넌트 1 (송신기)

export class SomeComponent { 
    public data: Array<any> = MyData; 

    public constructor(private myService: MyService) { 
     this.myService.myMethod(this.data); 
    } 
} 

컴포넌트 2 (수신기) :

export class SomeComponent2 { 
    public data: Array<any> = MyData; 

    public constructor(private myService: MyService) { 
     this.myService.myMethod$.subscribe((data) => { 
       this.data = data; // And he have data here too! 
      } 
     ); 
    } 
} 

설명 :

MyServicedata을 관리하고 있습니다. 원하는 경우 data을 사용하여 계속 할 수 있지만 그 값을 Component2으로 두는 것이 좋습니다.

기본적 MyServiceComponent1에서 data를 수신하고, 상기 방법 myMethod()에 가입 누구에게 보낸다.

Component1dataMyService으로 보내고 그게 전부입니다. Component2myMethod()에 가입되어 있으므로 myMethod()이 호출 될 때마다 Component2은 (는) myMethod()이 (가) 무엇이든 수신하고 수신합니다.

+0

여기서 component2의 MyData는 어디에서 왔습니까? – TeodorKolev

+1

난 그냥 코드에서 가져 왔어 :'public data : Array = MyData;'. 예를 들어, 작업중인 데이터 유형에 따라'public data = {};로 선언 될 수도 있습니다. 나는 그것을 당신의 모범과 가깝게 지키기를 원했기 때문에 당신에게 더 이해할 수 있습니다. – SrAxi

+0

두 개의 매개 변수를 설정할 수 있습니까? 두개의 분리 된 문자열을 보냅니 까? 두 개의 과목과 두 개의 Observables가 필요합니까? – TeodorKolev