2

Mein Ziel ist es, Daten von Angular-Komponente zu Service und Service-Methoden zu senden, um daran zu arbeiten. Beispiel:Angular 2 senden Daten von Komponente zu Service

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

und Service:

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

Erste Daten ist nicht definiert. Wie funktioniert es?

+1

Der Dienstkonstruktor wurde bereits ausgeführt, als Sie ihn in Ihre Komponente injizieren. Da Sie ihn nicht initialisieren, ist "data" zu diesem Zeitpunkt nicht definiert. –

+0

Bevor Sie eine Methode für ein Objekt aufrufen können, muss sie konstruiert werden. Daher wird Ihr Konstruktor aufgerufen und die Daten sind nicht definiert. Danach greifen Sie auf das Member zu und ändern die Variable, aber der Konstruktor wurde bereits aufgerufen. – Akkusativobjekt

+0

Wie kann ich das beheben? – TeodorKolev

Antwort

3

Ein Beispiel, wenn die Interaktion zwischen Dienst und Komponente sein könnte:

Service:

@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 (Sender):

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

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

Component2 (Empfänger):

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

Erläuterung:

MyService ist die Verwaltung der data. Sie können immer noch mit data Sachen machen, wenn Sie wollen, aber es ist besser, dies zu Component2 zu lassen.

Grundsätzlich MyService erhält data von Component1 und sendet sie an jeden der Methode myMethod() abonniert ist.

Component1 sendet data an die MyService und das ist alles, was er tut. Component2 ist die myMethod() abonniert, so dass jedes Mal myMethod() abgerufen werden, Component2 wird zuhören und bekommen, was auch immer myMethod() zurückkehrt.

+0

Woher stammen MyData in component2? – TeodorKolev

+1

Ich habe es nur aus Ihrem Code genommen: 'public data: Array = MyData;'. Es könnte auch als 'public data = {};' deklariert werden, zum Beispiel, hängt von dem Datentyp ab, mit dem Sie arbeiten. Ich wollte es nur so nah an deinem Beispiel halten, dass es für dich verständlicher ist. – SrAxi

+0

Kann ich zwei Parameter einstellen? Sagen wir zwei getrennte Strings? Brauche ich zwei Fächer und zwei Observable? – TeodorKolev

Verwandte Themen