Ich folge dem eckigen Tutorial. Ich konnte die Konzepte in diesem Tutorial-Kontext bis auf eines verstehen.
Wenn Sie auf die Schaltfläche Bestätigen klicken, wird das Ereignis confirm() ausgelöst.

confirm() {
this.confirmed = true;
this.missionService.confirmMission(this.astronaut);
}

Hier habe ich verstanden, dass mit missionService das astronaut zum Thema hinzugefügt wird. Daher ist der folgende Code offensichtlich, um ihn abzurufen.

constructor(private missionService: MissionService) {
missionService.missionConfirmed$.subscribe(
  astronaut => {
    this.history.push(`${astronaut} confirmed the mission`);
  });
}

Aber ich kann nicht verstehen, warum es im Konstruktor des übergeordneten Elements codiert wurde, und wird der Konstruktor jedes Mal aufgerufen, wenn das Ereignis ausgelöst wird?

Meines Wissens werden Konstrukteure nur bei der Komponentenbaumkonstruktion aufgerufen. Daher kann ich die Abläufe des Kontrollflusses nicht verfolgen. Lassen Sie mich wissen, wenn mir etwas fehlt.

0
Raida Adn 20 Jän. 2019 im 15:49

3 Antworten

Beste Antwort

Um dieses Beispiel zu verstehen, sollten Sie zunächst verstehen, wie die Observables funktionieren.

Kurz gesagt, die Observablen sind eine Implementierung des Beobachter-Entwurfsmusters, das zwei Akteure hat. Das Subjekt und die Beobachter . Ein Subjekt kann mehr als einen Beobachter haben. Damit jemand Beobachter werden kann, sollte er ein Thema abonnieren .

In Ihrem Beispiel ist das missionConfirmed $ das Thema und der Beobachter der Code:

astronaut => {
      this.history.push(`${astronaut} confirmed the mission`);
}

Der Beobachter wird jedes Mal aufgerufen, wenn der Betreff eine Nachricht sendet. Wie Sie sagten, wird der Konstruktor während der Klassenkonstruktion nur einmal aufgerufen. Der Teil im Konstruktor (der Beobachter) wird jedoch immer dann aufgerufen, wenn this.missionService.confirmMission(this.astronaut); eine Nachricht ausgibt

0
profanis 20 Jän. 2019 im 18:29

Innerhalb des Konstruktors des übergeordneten Elements "abonniert" es das Observable (missionConfirmed$) des Dienstes (missionService). Der "abonnierende" Teil wird einmal ausgeführt, aber der Code, der ausgeführt wird, wenn ein Wert durch Ausführen von missionConfirmed$.next(newAstronaut) an das beobachtbare Element übergeben wird, wird jedes Mal ausgeführt, wenn ein neues next() aufgerufen wird.

Für jeden next(newAstronaut) kommt also ein neuer Astronaut bei

  astronaut => { //<-- this will be the new astronaut
    this.history.push(`${astronaut} confirmed the mission`);
  }
0
Jelle 20 Jän. 2019 im 13:01

Nein, der Konstruktor wird nicht aufgerufen. Es ist der Beobachter darin, der gerufen wird.

constructor(private missionService: MissionService) {
  missionService.missionConfirmed$.subscribe(
    // This will be called on each next()
    astronaut => {
      this.history.push(`${astronaut} confirmed the mission`);
    }
  );
}
0
Dzhavat Ushev 20 Jän. 2019 im 13:39