<router-outlet> weitergeleitet und dort angezeigt werden.
Dieses Beispiel ist so grundlegend, wie eine Komponente nur sein kann. Der Grund, warum wir eine solche Komponente erstellen, ist lediglich, um unsere Anwendung zu modularisieren – alles, was wir wirklich tun, ist, ein Template anzuzeigen und einige einfache Daten zu binden. Wir werden später noch mehr über Architekturkonzepte sprechen, aber die allgemeine Idee ist, dass es besser ist, viele Komponenten zu haben, die jeweils eine kleine/gezielte Aufgabe erfüllen, als Komponenten, die versuchen, zu viel zu tun. Allerdings fehlen hier zwei grundlegende Konzepte von Angular-Komponenten, die dabei helfen, die Beziehung zwischen über- und untergeordneten Komponenten zu steuern: Inputs und Outputs. Wenn wir
ComponentB in das Template von ComponentA einfügen:
ComponentA die übergeordnete Komponente und ComponentB die untergeordnete Komponente ist. Der Kerngedanke dabei ist, dass eine übergeordnete Komponente mit einer untergeordneten Komponente kommunizieren kann, indem sie ihr einen Input zur Verfügung stellt. Eine untergeordnete Komponente kann mit einer übergeordneten Komponente kommunizieren, indem sie ihr einen Output zur Verfügung stellt.
Inputs
Stellen wir uns nun vor, wir möchten eine Begrüssung für den Namen eines bestimmten Benutzers anzeigen, nicht nur fürLevin. Wie wir später noch sehen werden, möchten wir im Allgemeinen nicht, dass unsere untergeordneten/dummen Komponenten sich mit komplexer Geschäftslogik oder dem Abrufen von Daten befassen müssen. Daher möchten wir vielleicht, dass unsere übergeordnete Komponente der untergeordneten Komponente eine Eingabe zur Verfügung stellt, damit diese weiss, welcher Name angezeigt werden soll.
Levin, aber stell dir vor, dass unsere HomeComponent diesen Benutzerwert aus einer Art UserService abrufen könnte, der den angemeldeten Benutzer zurückgibt.
Um diesen Input zu akzeptieren, müssen wir einige Änderungen an der WelcomeComponent vornehmen.
Outputs
Nehmen wir an, dass wir in unsererWelcomeComponent eine dieser Cookie-Hinweise anzeigen möchten. Wir möchten eine Schaltfläche hinzufügen, auf die der Benutzer klicken kann, um die Cookies zu akzeptieren, und wenn dies geschieht, müssen wir auf unserem Server protokollieren, dass der Benutzer diese Schaltfläche angeklickt hat.
Auch hier möchten wir wieder, dass unsere untergeordneten Komponenten „dumm” sind. Wir möchten nicht, dass sie sich mit dem Aufrufen von Diensten zum Senden von HTTP-Anfragen befassen müssen, da sie dafür Kenntnisse über die Funktionsweise der Anwendung benötigen. Eine „dumme” Komponente sollte nichts über das wissen, was ausserhalb der Komponente selbst geschieht. Sie hat ihre Eingaben, ihre Ausgaben, sie zeigt einige Dinge an, und das war’s auch schon (wir werden später noch näher darauf eingehen).
Wir möchten, dass unsere übergeordnete Komponente, wenn der Benutzer auf die Schaltfläche klickt, die entsprechende Anfrage an einen Dienst sendet, um anzuzeigen, dass die Cookies akzeptiert wurden. Das bedeutet, dass wir eine Möglichkeit benötigen, mit der unsere untergeordnete Komponente die übergeordnete Komponente benachrichtigt, wenn die Schaltfläche angeklickt wurde.
emit-Methode darauf anwenden:
emit-Methode auslösen, wird dieses Event ausgelöst, und wir können das Event verarbeiten. In diesem Fall rufen wir eine Methode auf, die den entsprechenden injizierbaren Dienst aufruft.
Ohne Inputs und Outputs kommunizieren
Dieses Konzept der Eltern-Kind-Beziehungen und Inputs und Outputs ist wichtig. Es gibt jedoch auch andere Möglichkeiten, wie unsere Komponenten miteinander kommunizieren können. Ein Input oder Output funktioniert gut, wenn eine Komponente ein direktes Kind einer anderen Komponente ist, aber was ist mit einer Situation, in der unsere Komponenten Geschwister sind? Das heisst, eine Komponente befindet sich nicht innerhalb der anderen Komponente. Ein gutes Beispiel hierfür ist das zuvor betrachtete Beispiel der Startseite und der Einstellungsseite. Diese Komponenten werden über den<router-outlet> weitergeleitet. Die Startseite befindet sich nicht innerhalb der Einstellungsseite und die Einstellungsseite befindet sich nicht innerhalb der Startseite.
Möglicherweise müssen wir dennoch zwischen diesen beiden Komponenten kommunizieren. Vielleicht müssen sie denselben Datensatz gemeinsam nutzen. In diesen Fällen verwenden wir in der Regel einen injizierbaren Service, um Daten zwischen beiden Seiten auszutauschen. Es gibt noch andere Methoden, die wir verwenden können, auf die wir später noch eingehen werden.