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

服務構造已經被你注入到你的組件的運行時間 - 因爲你不初始化,'data'在該時間不確定。 –

+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); 
    } 
} 

的Component1(發送者):

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

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

COMPONENT2(接收器):

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! 
      } 
     ); 
    } 
} 

說明:

MyService是管理data。你仍然可以做的東西跟data,如果你想要的,但最好是留給Component2

基本上MyServiceComponent1收到data並將它發送給訂閱了方法myMethod()的任何人。

Component1發送dataMyService這就是他所做的一切。 Component2訂閱了myMethod(),所以每次調用myMethod()時,Component2都會聽取myMethod()返回的結果。

+0

組件2中的MyData來自哪裏? – TeodorKolev

+1

我剛剛從你的代碼中拿出來:'public data:Array = MyData;'。它也可以聲明爲'public data = {};',例如,取決於您正在使用的數據類型。我只是想讓它接近你的例子,所以對你來說更容易理解。 – SrAxi

+0

我可以設置兩個參數嗎?讓說兩個單獨的字符串?我需要兩個科目和兩個觀察對象嗎? – TeodorKolev