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.
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. –
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
Wie kann ich das beheben? – TeodorKolev