Fullstack Trello Klon erstellen: WebSocket, Socket IO | Oleksandr Kocherhin | Skillshare

Playback-Geschwindigkeit


1.0x


  • 0.5x
  • 0.75x
  • 1x (normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Fullstack Trello Klon erstellen: WebSocket, Socket IO

teacher avatar Oleksandr Kocherhin

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Wähle aus einer Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Wähle aus einer Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Einheiten dieses Kurses

    • 1.

      Einführung

      1:25

    • 2.

      Welche Technologien verwenden wir?

      3:33

    • 3.

      Herunterladbare Ressourcen

      0:40

    • 4.

      Knoten & Winkelförmig installieren

      8:09

    • 5.

      Server konfigurieren

      5:05

    • 6.

      Datenbank installieren

      7:27

    • 7.

      Benutzst du einen guten Editor?

      2:19

    • 8.

      Sockel mit Express einrichten

      11:53

    • 9.

      Mongoose Benutzermodell erstellen

      22:20

    • 10.

      Anmeldung hinzufügen

      20:10

    • 11.

      Implementing implementieren

      11:03

    • 12.

      Erstellen von auth Middleware

      15:40

    • 13.

      Auth Modul erstellen

      18:59

    • 14.

      Registerseite - Markup + Formular

      12:55

    • 15.

      Anmeldeseite - Service + Validierung

      11:06

    • 16.

      Anmeldeseite

      10:00

    • 17.

      Startseite

      8:13

    • 18.

      Auth Abfänger

      8:05

    • 19.

      Auth

      13:52

    • 20.

      Gettings

      14:15

    • 21.

      Frontend für Gettings Boards

      10:00

    • 22.

      Inline-Formular

      15:27

    • 23.

      Umsetzung eines Vorstandes

      19:19

    • 24.

      Hinzufügen von Top und Logout

      7:38

    • 25.

      board erstellen

      8:58

    • 26.

      Ein einziges Board erstellen

      2:46

    • 27.

      board hinzufügen

      6:26

    • 28.

      socket erstellen

      9:55

    • 29.

      Verlassen und Verbinden von Bord

      17:19

    • 30.

      Authentifizierung in socket.io

      11:27

    • 31.

      Spalten erhalten

      9:14

    • 32.

      Spalte mit Websockets erstellen

      12:14

    • 33.

      Spalten erhalten

      11:36

    • 34.

      column erstellen

      15:57

    • 35.

      Grundlegende Aufgabe erstellen

      9:35

    • 36.

      Aufgaben erledigen

      11:42

    • 37.

      Aufgabenformular erstellen

      8:24

    • 38.

      board aktualisieren

      15:27

    • 39.

      Board löschen

      8:18

    • 40.

      Spalte löschen

      10:09

    • 41.

      Spalte aktualisieren

      8:54

    • 42.

      Abmelden

      6:54

    • 43.

      Aufgabenmodul und Grundkomponente

      15:54

    • 44.

      Aufgabe und Spalten abrufen

      13:57

    • 45.

      Aufgabe aktualisieren

      14:42

    • 46.

      Aufgabe löschen

      7:30

    • 47.

      Bereitstellung

      31:29

    • 48.

      Hausaufgaben

      2:02

  • --
  • Anfänger-Niveau
  • Fortgeschrittenes Niveau
  • Fortgeschrittenes Niveau
  • Jedes Niveau

Von der Community generiert

Das Niveau wird anhand der mehrheitlichen Meinung der Teilnehmer:innen bestimmt, die diesen Kurs bewertet haben. Bis das Feedback von mindestens 5 Teilnehmer:innen eingegangen ist, wird die Empfehlung der Kursleiter:innen angezeigt.

135

Teilnehmer:innen

--

Projekt

Über diesen Kurs

In diesem Kurs werden wir eine Trello Klone API mit Angular, Angular, NodeJS, Express, MongoDB und Socket IO erstellen. Dieser Kurs konzentriert sich voll auf die schnelle und tiefe Eintauche in die Erstellung einer Fullstack Anwendung mit diesen Tools. Wir beginnen von Grund auf und Schritt für Schritt werden Sie der fertigen echten Anwendung nahezukommen. Du wirst tief verstehen, wie du deine Anwendung strukturiert, wiederverwendbare und verständliche Module und Dienste erstellen und Code in kleinere Code-Stücke aufteilen kannst. Wir schreiben Code auf effiziente Weise, um es rein zu machen und Datenkomplexität zu vermeiden. Wir werden Echtzeitkommunikation durch die Implementierung von WebSocket mit Socket IO durchführen.

Unser Code wird mit Typescript auf dem Backend und auf dem Client geschrieben.

Am Ende des Kurses werden wir unsere Anwendung auf den realen Produktionsserver bereitstellen.

Für jeden Kurs erhältst du Quellcode des Kurses, sodass es ganz einfach ist, den Fortschritt zu sehen und eine funktionierende App für jeden Kurs zu erhalten, den du möchtest.

Was du in diesem Kurs lernen wirst:

  • Projekt strukturieren und konfigurieren

  • Hochwertiger Code mit Typescript in einem realen Projekt schreiben

  • Wiederverwendbare Module, Controller und Dienste erstellen

  • Authentifizierung sowohl in http als auch in Websockets implementieren

  • Verstehst winklige & Express

Kein Vorkenntnis außer Javascript ist erforderlich (weil ich dir alles aus den Grundlagen beibringen werde), aber wenn du mit einem dieser Erfahrung hast (Angular/Express/Typescript/MongoDB/Socket io, ist es für dich einfacher, diesen Kurs durchzulaufen.

Wenn du dich wie du das Internet gelernt hast, aber dir trotzdem noch fehlt, wie du deine eigene eigentliche Anwendung erstellen kannst, ist dieser Kurs genau das, was du brauchst.

Triff deine:n Kursleiter:in

Teacher Profile Image

Oleksandr Kocherhin

Kursleiter:in

I am a full-stack developer with a passion for learning and teaching what I know. I have been programming for around 10 years and teaching for almost 6 years.

I believe in learning through doing and this philosophy is present in every course that I teach. I love exploring new web & mobile technologies and my courses focus on giving you the edge in our fast-moving industry.

Vollständiges Profil ansehen

Level: All Levels

Kursbewertung

Erwartungen erfüllt?
    Voll und ganz!
  • 0%
  • Ja
  • 0%
  • Teils teils
  • 0%
  • Eher nicht
  • 0%

Warum lohnt sich eine Mitgliedschaft bei Skillshare?

Nimm an prämierten Skillshare Original-Kursen teil

Jeder Kurs setzt sich aus kurzen Einheiten und praktischen Übungsprojekten zusammen

Mit deiner Mitgliedschaft unterstützt du die Kursleiter:innen auf Skillshare

Lerne von überall aus

Ob auf dem Weg zur Arbeit, zur Uni oder im Flieger - streame oder lade Kurse herunter mit der Skillshare-App und lerne, wo auch immer du möchtest.

Transkripte

1. Einführung: Willkommen zu meinem Full-Stack-Kurs, in dem wir ein Schienenprojekt von Grund auf neu bauen. Es ist großartig, Sie in diesem Kurs hier zu haben, wir werden ein echtes Projekt umsetzen angefangen vom leeren Ordner bis zur fertigen, voll funktionsfähigen Produktionsanwendung , die auf der Schiene bereitgestellt wird -Server werden wir eine Funktion implementieren, die ein typisches Projekt benötigt, wie zum Beispiel Authentifizierung, Arbeit mit dem Pi, Verwaltung und Erstellung eines reaktiven Zustands, Arbeiten mit Formularen und vieles, vieles mehr. In diesem Kurs werden wir viele verschiedene Tools für unseren Kunden verwenden . Wir werden Angular verwenden, die beste Lösung für große skalierbare Produktionsanwendungen. Im Backend werden wir jetzt Schach verwenden um unsere API zum Speichern unserer Daten zu erstellen. Wir werden MongoDB verwenden , eine sehr beliebte Lösung zum Speichern von Daten in Ihrem Projekt. Außerdem verwenden die Leute Socket Layer, um Echtzeit-Updates in unserer Anwendung zu erstellen . Natürlich werden wir den bestmöglichen Code schreiben , der trocken, skalierbar und leicht zu verstehen ist. Am Ende dieses Kurses können Sie mit diesen Tools Ihre eigenen Projekte beliebiger Komplexität erstellen . Wer bin ich? Mein Name ist Alexander Cohesion und ich bin ein Webentwickler mit mehr als zehn Jahren Erfahrung sowie der professionelle Ausbilder mit verschiedenen Kursen zu Webtechnologien. Ich habe mein Bestes getan, um mein ganzes Wissen in diesen Kurs einzubringen , und sie wollen es mit dir sagen. Also willkommen an Bord und lass uns loslegen. 2. Welche Technologien verwenden wir?: In diesem Video möchte ich über Technologien sprechen , die wir in diesem Kurs verwenden werden. Und von Anfang an möchte ich realistische Erwartungen setzen. Wir werden hier ziemlich viele Technologien einsetzen. Es wird Angular, Node.js Express, MongoDB, TypeScript und Socket IO sein. Und das gibt eine Menge Dinge zu lernen. Und dann werde ich dir in diesem Kurs nicht alles von Anfang bis Ende beibringen. Es ist einfach nicht möglich. Die Menge an Wissen in jedem einzelnen Tool hier ist enorm. diesem Grund ist dieser Kurs fokussiert. Aufbau eines echten Projekts von Anfang bis Ende. Ja, sicher werden Sie all diese Technologien auf einer bestimmten Ebene verstehen und lernen. Aber hier benötigen Sie bei einigen Technologien möglicherweise grundlegendes Verständnis dafür, wovon wir überhaupt sprechen. Nachdem das gesagt ist, springen wir in die Liste. Und der erste in unserer Liste ist Angular. Wenn Sie es nicht wissen, ist Angular eines der drei beliebtesten Front-End-Frameworks, und wir werden es verwenden, um Front und Side unserer Anwendung zu erstellen . Angular ist ein wirklich strenger Rahmen , der für große Unternehmen geeignet ist. Und wir haben dieses TypeScript sofort einsatzbereit, was bedeutet, dass wir mit Angular größere Anwendungen erstellen, sie aufgrund von Tippvorgängen sicher machen und sie bei Bedarf skalieren können sie aufgrund von Tippvorgängen sicher machen . Wenn Sie Angular groß nicht kennen, empfehle ich Ihnen dringend, sich die Liste mit den Grundlagen von Angular anzusehen , wie Komponenten funktionieren, wie Module erstellt werden , wie man Routing hinzufügt und so weiter. Nachdem Sie diese Dinge verstanden haben, wird es für Sie viel einfacher sein, in den Kurs einzusteigen. Die nächste in der Liste kennen wir Schach und eigentlich NodeJS werden wir im Backend mit Framework verwenden , das Express heißt. Und wenn es es nicht ausdrückt, das beliebteste Framework für Node.js, ist es super klein, es ist nicht streng, es ist wirklich flexibel und wir werden es als eine sehr beliebte Lösung zum Erstellen verwenden Backend. Und in diesem Projekt müssen wir nicht nur eine, sondern auch verwaltete Socket-Verbindungen aufbauen . Das Backend, hier drückt hier eine wirklich gute Wahl aus, aber es wird nicht alles standardmäßig ausgedrückt, wir haben JavaScript. Natürlich ist das nicht der beste Ansatz. Wir wollen wirklich TypeScript verwenden, weil wir TypeScript auf dem Client mit Angular verwenden werden. Dies ist, wenn das Backend mit Express läuft. Wir wollen auch TypeScript verwenden. Warum ist das so? Denn eigentlich bringt TypeScript statische Statik zu JavaScript. Dies macht unseren Code viel sicherer und wir sehen alle unsere Probleme, nicht in der Laufzeit, sondern im Transpiler und in der Zeit. Offensichtlich müssen wir jetzt bei einem Projekt unsere Daten irgendwo speichern, was eigentlich bedeutet, dass wir für unser Backend eine Datenbank benötigen. Und die beliebteste Lösung hier ist MongoDB. Dies ist wirklich die beliebteste Datenbank der Welt, in der wir Daten speichern können, und sie passt sehr gut in unseren Stack mit Angular auf dem Client und NodeJS wurde im Backend ausgedrückt. Und zu guter Letzt steht Socket IO in der Liste. Wir möchten in unserer Anwendung WebSockets implementieren, um andere Benutzer zu benachrichtigen , wenn wir eine Aufgaben- oder Kreditspalte erstellen , wenn wir ein Teil wechseln Alle Benutzer in diesen Teilen müssen benachrichtigt werden. Und die beliebteste Lösung für WebSockets innerhalb des bekannten Wortes heißt Socket IO. Es ist die Bibliothek, die uns hilft, WebSockets im Backend und gleichzeitig auf dem Client zu verwalten WebSockets im Backend . Deshalb ist es wirklich eine gute Wahl. Noch einmal, wenn Sie mit einigen Tools hier nicht vertraut sind, ist es völlig in Ordnung. Wir werden bei Null anfangen, aber wir werden das Erlernen all dieser Tools nur auf die täglichen Bedürfnisse konzentrieren . Was eigentlich bedeutet, dass wir grundlegende Dinge lernen, Dinge korrigieren und Dinge, die für die Umsetzung dieses Eisenbahnprojekts benötigt werden. 3. Herunterladbare Ressourcen: In diesem Video möchte ich Sie an den Quellcode erinnern, denn tatsächlich finden Sie in diesem Kurs, in jeder einzelnen Vorlesung, in der wir etwas programmieren, in jeder einzelnen Vorlesung, in der wir etwas programmieren, den angehängten Code dieser speziellen Vorlesung , der tatsächlich bedeutet, dass jede einzelne Vorlesung einen Quellcode enthält. Und wenn Sie sich nur den Quellcode der Vorlesung holen möchten , können Sie das sicherlich tun. Wachsen Sie einfach unter das Video und überprüfen Sie das Archiv, das an das Video angehängt ist. Und anders wie immer, wenn Sie Probleme mit Ihrem Code haben, etwas nicht kompiliert wird oder Sie nur eine Frage zum Video oder zum Kurs im Allgemeinen haben , können Sie einfach Ihre Kommentare schreiben auf diesem Video, und ich werde sie auf jeden Fall beantworten. 4. Installieren von Node und Angular: In diesem Video installieren wir NodeJS Angular auf Ihrem Computer. Wie Sie hier sehen können, bin ich auf der offiziellen Website Node js.org, wo Sie jetzt Schach auf Ihren Computer herunterladen können. Wenn Sie es nicht installiert haben, können Sie überprüfen, ob es auf Ihrem Computer installiert ist. Wenn Sie nur eine Node Minus-Version in Ihre Konsole schreiben die Version wie 16 erhalten, ist es völlig in Ordnung, wenn Sie etwas älteres haben. Ich empfehle Ihnen dringend, Ihre Node-Version zu aktualisieren. Aber hier ist der wichtige Punkt: Sie können sehen, dass wir zwei Versionen haben. Zuallererst 16 LTS und 17 aktuell. Und du denkst vielleicht, okay, ich muss Strom installieren. Und sie können Ihnen nicht empfehlen, die aktuelle Version zu installieren, da Langzeit-Support-Version in der Regel viel stabiler ist. diesem Grund verwende ich für alle meine Projekte, insbesondere wenn sie in Produktion geliefert werden, insbesondere wenn sie in Produktion geliefert werden, die LTS-Knotenversion, was eigentlich bedeutet, wenn Sie zu dieser Website springen und LTS-Version sehen kann 17 oder 18 sein. Ich empfehle Ihnen immer noch, Ts herunterzuladen und nicht aktuell und es spielt keine Rolle, auf welchem Betriebssystem Sie arbeiten. Nein, das funktioniert überall. Sie laden es einfach hier herunter, installieren es auf Ihrem Computer und überprüfen dann in der Konsole mit der Node minus Version, die Node erfolgreich auf Ihrem Computer installiert hat . Sie können auch hier und Pm minus Version eingeben um zu überprüfen, ob npm auch für Sie verfügbar ist. Unser nächster Schritt ist die Installation Angular und die Arbeit mit dem Globus . Wir verwenden ein Tool namens Angular CLI, was bedeutet, dass dies das Tool ist, uns zunächst hilft , ein Angular-Projekt, dann generiere verschiedene Module oder Komponenten und mache eine Menge Sachen mit Angular. Wie wir Angular CLI auf Ihrem Computer installieren können , wie Sie hier sehen können, bin ich auf der offiziellen Website Angular Slash CLI, und hier ist der erste Schritt, um Angular CLI zu installieren. Und wir können diesen Befehl einfach kopieren, der Angular CLI global auf Ihrem Computer installiert. Und wie Sie dafür sehen können, verwenden wir npm, das nach der Installation von bekannten Stühlen vorhanden sein wird. Hier kann ich einfach Zahlungen einwerfen tau minus g Angular CLI. Und ich installiere global Angular CLI auf meinem Computer. Jetzt müssen wir überprüfen, ob unsere Angular CLI erfolgreich installiert wurde. Das können wir einfach in G minus Version schreiben und hier sind einige wichtige Informationen. Zunächst können wir sehen, dass Angular CLI Version 13 ist, was bedeutet, dass wir Angular 13 hier auf unserer Maschine installiert haben . Zweitens ist dies unsere Node-Version , die auf Ihrem Computer aktiviert ist. Das ist npm und das ist das Betriebssystem. Und einige Versionen von Angular, die Sie hier sehen können. Wenn Sie eine solche Ausgabe sehen, bedeutet dies, dass Sie Angular CLI erfolgreich auf Ihrem Computer installiert haben. Der nächste Schritt besteht darin, Front und Teil unserer Anwendung zu generieren . Wie Sie hier sehen können, bin ich in ihm gefaltet. Und sie haben unser Projekt hier nicht erstellt, was bedeutet, dass wir selten alles von Grund auf neu erstellen. Also was ich hier machen will, ich kann es einfach ausprobieren MK Deal und dann den Namen unseres Projekts, L Trello. Und tatsächlich implementieren wir in diesem Projekt den Klon des Trailers. Das ist y. Hier ist nur ein Name mit einem netten Präfix und WSSE, Sie können einen Ordner nicht aus dem Terminalbud erstellen, sondern nur in Ihrem Dateimanager. Jetzt möchte ich in unsere Ultra-Rechtsmappe springen. Und hier müssen wir zwei verschiedene Ordner erstellen , weil wir unser Backend von unserem Frontend trennen wollen . Und du fragst dich vielleicht, warum ist das so? Und eigentlich aus verschiedenen Gründen. Zunächst ist es einfacher, Ihr Front-End und Back-End aufzuteilen , wenn Sie sie aus bestimmten Gründen später in verschiedenen Repositorys oder vielleicht sogar in verschiedenen Teams platzieren möchten sie aus bestimmten Gründen später in verschiedenen Repositorys oder vielleicht sogar in verschiedenen Teams platzieren . Zweitens, wenn wir sie in verschiedene Ordner trennen, dann ist es kein Monolith, was eigentlich bedeutet, dass wir mit Sicherheit keine Sachen aus dem Backend in den Front-End-Ordner injizieren Sachen aus dem Backend in den Front-End-Ordner und umgekehrt. Sie sind wirklich isoliert und trennen es, da sie in der realen Anwendung enthalten sein müssen. Deshalb möchte ich hier zwei Ordner erstellen. Erstens wird es Client sein, und zweitens wird es Server und Insight Client sein. Wir werden unsere eckige Anwendung haben und dann sagen Server. Wir werden unsere bekannten gs mit Express haben, was unsere Backend-Anwendung sein wird. Jetzt können wir unsere eckige Anwendung generieren, wie Sie hier in der Dokumentation sehen können, wir führen einfach den Gen-Farbton und den Namen des Ordners aus. Dann springen wir einfach über den Ordner und starten unseren Server. Aber hier haben wir ein Problem, weil wir direkt unseren Kundenordner erstellt haben und wir können jetzt den Kundenordner einfügen, was bedeutet, dass wir unsere eckige Anwendung nicht mit erstellen können unsere eckige Anwendung nicht mit erstellen Engine Sie, weil der Ordner bereits existiert. Dafür können wir einen wirklich netten Befehl in Gene You verwenden. Und dann müssen wir hier das Verzeichnis des Anwendungsnamens bereitstellen, und hier ist ein Schrägstrich, was bedeutet, dass dieser Befehl für Sie in Ihrer Anwendung von Angular in Ihrem vorhandenen Verzeichnis erstellt wird . Wie Sie hier sehen können, bin ich im Kunden, wo genau wir unsere eckige Anwendung generieren möchten. Und sie können diesen Befehl hier in Gene Hue App Name, Verzeichnis Punkt Schrägstrich einfügen . Und natürlich wollen wir den Namen unserer Anwendungs-App nicht nennen. Hier können wir ELL Trello bereitstellen, so wie wir unser Projekt nach demselben versteckten Enter benannt haben . Und wir haben mit der Generierung eines neuen Angular-Projekts begonnen . Und hier bekommen wir ein paar Fragen von Angular CLI. Brauchen wir Angular Routing? Natürlich, ja, deshalb drücke ich ja, hier, welches Stylesheet wir verwenden müssen. Und hier wähle ich ein CSS. Danach wird unser Projekt generiert. Wie Sie hier sehen können, wurden alle Pakete erfolgreich installiert, aber danach erhalten wir eine Nachricht, die für Sie verwirrend sein könnte. Hier erhalten wir die Nachricht, dass jetzt der Branch-Master als unser Standard-Git-Zweig erstellt wurde . Und sie könnten den Namen später in einen Namen ändern, aber er ist noch nicht da. Und eigentlich egal welcher Branch für Sie generiert wurde, Master oder Main, es wird auf jeden Fall funktionieren. Sie können diese Warnung also einfach ignorieren. Und der letzte Schritt, den wir tun müssen, ist unsere Kundenbewerbung zu starten. Und wie Sie hier in der Dokumentation sehen können, befindet es sich in G serve. Also fügen wir einfach den Client ein, der es versuchen muss und einfach dienen, ohne etwas zu spezifizieren. Wie Sie hier sehen können, erhalten wir eine grüne Ausgabe. Die Nachricht, dass jetzt der eckige Live-Entwicklungsserver 1200 auf dem lokalen Host abhört. Jetzt können wir einfach localhost 4.200 öffnen. Und hier sehen wir die Standard-Winkelseite und fügen jetzt die Konsole ein. Unser Webserver muss während der Entwicklung der Anwendung ständig laufen . Schauen wir uns nun die Dateien an , die schnell generiert wurden. Wie Sie hier sehen können, habe ich meinen Editor geöffnet, ich bin im Ordner L Trello, und wir haben hier zwei Ordner, Server und Client und Insight Client. Alle diese Dateien wurden mit Angular CLI generiert. Und der interessanteste Teil für uns ist dieser Quellordner. Und in AB haben wir unsere App-Komponente. Genau das sehen wir hier auf dem Bildschirm. Dies ist die Standardkomponente von eckig. Hier möchte ich zunächst die App-Komponente, SCSS, App-Komponenten-Spezifikation entfernen . Und hier haben wir nur diese vier Akten. Jetzt können wir in das HTML der App-Komponente springen, und wir möchten wirklich alles außer dieser letzten Zeile, dem Router-Outlet, entfernen . Das ist schnell extrem wichtig. Also werde ich alles aus dieser Datei entfernen und einfach hier leben Dürre die Steckdose. Und ganz oben können wir es einfach versuchen. Hallo l Trello. Wir wissen also, dass es funktioniert. Danach müssen wir in unsere App-Komponente springen und sie ändern. Denn eigentlich verwenden wir hier Stil-URLs aus der Datei, die die entfernten ändern. Hier können wir diese Zeile einfach entfernen und verwenden hier einfach eine Vorlage. Und wir brauchen diesen Title-L-Trailer nicht einmal , weil wir ihn nicht benutzen. Wir haben einfach unsere App-Komponente und sie ist eine leere Komponente. Wenn ich jetzt zur Seite im Browser springe, kann ich sehen, dass alles entfernt wurde. Unsere Seite ist komplett gereinigt und jetzt haben wir nur eine kleine Trailer-Nachricht, was tatsächlich bedeutet, dass wir den Kundenteil unserer Anwendung erfolgreich vorbereiten , den Goodwill später implementieren. 5. Konfigurieren von Servern: In diesem Video möchte ich unseren Back-End-Teil unseres Projekts darauf vorbereiten , mit der Implementierung zu beginnen. Wie Sie hier sehen können, ist es völlig leer. Also was wir hier erstellen werden, was wir eigentlich tun müssen, müssen wir Paket-JSON-Datei mit bekannten initialisieren. Also hier können wir npm in Not schreiben und es wird für uns eine Paket-JSON-Datei erstellen. Hier müssen wir einige Fragen beantworten. Normalerweise drücke ich bei allen einfach die Eingabetaste. Für uns spielt es keine Rolle. Und am Ende drücken wir einfach auf Ja und wir sind bereit. Jetzt können wir springen und den Redakteur verlassen und außerhalb unseres Clients zu unserem Server gehen. Jetzt haben wir hier nur eine einfache Datei, Beckett Jason mit Namen, Versionsbeschreibung, Hauptskript, wo wir nichts im leeren Autor und der Lizenz haben . Jetzt müssen wir zwei Pakete installieren, die uns helfen, unser Backend-Projekt zu erstellen. Also hier können wir Impairments Stil schreiben. Und nach diesem Nicht-Dämon minus d, was bedeutet das? Zuallererst, was ist kein Dämon? Dass dies ein spezielles Paket ist , das uns hilft, jedes Mal neu zu laden , wenn wir eine Datei ändern , unsere Back-End-Anwendung. Und genau das macht Angular im Client schnell. Aber in unserem Back-End-Projekt gibt es keinen Webserver , der das schnell macht. Deshalb habe ich, als Stalin und ein Dämon, und wie Sie hier sehen können, die Option minus d verwendet, was eigentlich bedeutet, dass in unserem Paket Jason kein Dämon innerhalb der Entwicklungsabhängigkeiten installiert wurde. Und Entwicklungsabhängigkeiten sind Abhängigkeiten, die wir bei der Entwicklung eines Projekts verwenden. Wir brauchen keinen Dämon in der Produktion. Das ist nur für die Entwicklung gedacht. Und unser nächstes Paket heißt Ts node und dient auch nur zur Entwicklung. Hier schreiben wir den Knoten npm install Ts minus t, was bedeutet, dass es sich um eine Entwicklungsabhängigkeit handelt. Was macht Node also? Dies ist nur ein Prozess , der unseren TypeScript-Code im laufenden Betrieb in JavaScript-Code überträgt, der genau wie normaler JavaScript-Code innerhalb des Knotens ausgeführt wird. Das ist extrem effizient , da wir TypeScript-Code schreiben wollen. Deshalb müssen wir es zuerst von TypeScript in JavaScript umwandeln . Und dieses Paket hilft dabei auf sehr einfache Weise. Jetzt springen wir und sagen Beckett Json und überprüfen, was wir haben. Wir haben hier Abhängigkeiten zu entwickeln. Und hier möchte ich ein neues Skript erstellen, brauche aber den Skripttest nicht. Wir wollen hier unseren Webserver starten. Das ist y, hier ist ein Skriptstil, und hier können wir einem Dämon den Pfad zu unserer Datei nennen. Und hier möchte ich den Quell-Slash server.js schreiben. Und wie Sie hier sehen können, haben wir die server.js, die wir in einer Sekunde erstellen werden. Das ist also die TypeScript-Datei und der interessanteste Teil hier, den wir nicht angegeben haben, dass wir hier den Ts-Knoten in keinem Daemon verwenden . Daemon macht es automatisch aus der Box, wenn wir Tier snowwed installiert haben und hier keine JavaScript-Datei, sondern eine TypeScript-Datei angegeben haben. Und das Letzte , was wir tun müssen ist die Konfigurationsdatei zu erstellen, die eine Konfigurationsdatei für TypeScript ist. Das ist hier in einem Service-Ordner. Ich möchte eine neue Datei erstellen, ts config dot json. Hier werde ich einen solchen Konflikt einfügen und das ist ein super typischer Konflikt für Anwendung Node.js mit TypeScript. Also hier setzen wir Compiler-Optionen. Genau so wird TypeScript unseren Code von TypeScript nach JavaScript übertragen. Das Modul CommonJS bedeutet also, dass wir unser TypeScript im Backend innerhalb der Nomen-Truhe schreiben. Und unser Ziel ist atmosphärische Optik, weil Node an meinem Skript problemlos sechs Code lesen kann. Unsere Modusauflösung ist also node, weil wir in Substantivstühlen schreiben, bewegen Sie sich auf Quellkarten. Hier kommt die Quellzuordnung durch. Unser Deal ist Verzeichnis. Die Ausgabe wird generiert. Hier haben wir einen dist Ordner, automatisch erstellt wird. Wir haben hier auch strict true NDS module inter pop, und wir brauchen diese Option ja module inter Pope um korrekt zu konvertieren sind TypeScript-Eingaben innerhalb des bekannten Jazz erforderlich. Wir haben also erfolgreich unsere TypeScript-Konfiguration erstellt, und jetzt können wir unseren Quellordner und in dieser Datei erstellen , da sich unser Server, wie Sie hier sehen können, innerhalb des Quellservers Ts befindet. Also springe ich in eine solche Quelle und erstelle einen Dateiserver-Punkt ts. Und vergiss Ts NodeJS nicht. Jetzt können wir reinspringen und einfach den Konsolenprotokollserver schreiben , nur um zu testen, ob er funktioniert. Jetzt werde ich in die Konsole springen und hier im Serverordner kann ich npm start schreiben, wie Sie hier sehen können, haben wir eine Ausgabe von no demon, was völlig in Ordnung ist. Es werden TypeScript-Dateien hier und hier gewaschen. Kein Dämon hat unseren Ts-Knoten-Quellserver-Test gestartet, was eigentlich bedeutet, dass er einfach den Ts-Knoten darin verwendet, aber unseren Server neu startet. Und das ist der Ausgabeserver , den wir in diese Datei geschrieben haben. Und jetzt startet Demon Bull unseren Server jedes Mal neu , wenn wir einige Änderungen vornehmen. 6. Installieren von Datenbanken: In diesem Video werden wir über die Styling-Datenbank auf Ihrer Maschine sprechen . Und es gibt noch eine andere Dimension, in der wir MongoDB hier verwenden werden. Was war die Idee? Wir müssen auf unserer lokalen Maschinendatenbank installieren , damit wir dort speichern und von dort einige Daten lesen können dort speichern und von dort einige Daten lesen , die wir in unserer Anwendung verwenden werden. Diese Daten werden für uns lokal live verfügbar sein. In dem Moment, in dem wir unser Projekt für die Produktion bereitstellen möchten , müssen wir die Datenbank für die Produktion einrichten , und wir werden dies am Ende dieses Kurses tun. Jetzt stellt sich die Frage, wie wir MongoDB auf Ihrem spezifischen Computer installieren können und Sie in verschiedenen Betriebssystemen arbeiten können. Wir wollen also etwas, das überall problemlos funktioniert. Die Installation der Datenbank kann immer einige Schwierigkeiten haben. Wie Sie sehen können, habe ich bereits die offizielle MongoDB-Website mit der Installation von MongoDB geöffnet die offizielle MongoDB-Website . Dies ist die URL, mit der Sie sie überprüfen können, wenn Sie interessiert sind, und sie sieht wirklich einfach aus. Wir wählen hier einfach ein operatives System. Also hier klicke ich auf den Link MongoDB Download Center. Und ich bin jetzt hier auf dieser Webseite. Und an dieser Stelle ist schon nicht wirklich klar, welche MongoDB wir installieren müssen. Es gibt verschiedene Versionen davon. Es gibt kostenlose Versionen , die wir verwenden möchten, und die kostenpflichtigen Lösungen , die wir nicht benötigen. Und eigentlich müssen wir hier ein bisschen kriechen und hier den MongoDB-Community-Server sehen. Eigentlich ist diese MongoDB-Community der Name der kostenlosen Version von MongoDB, die wir verwenden möchten. Also hier rechts können wir die Version auswählen aktuell ist völlig in Ordnung. Jetzt ist hier Ihre Plattform, vielleicht Windows, und jetzt laden Sie sie einfach herunter und installieren sie. Also doppelklicken wir einfach hier rein und installieren es. Danach gibt es jedoch einige zusätzliche Schritte. Wir müssen das Datenverzeichnis einrichten. Hier können Sie sehen, dass sie es in der Befehlszeile wie dieser tun . Und dann können Sie MongoDB so installieren. Das ist völlig in Ordnung. Das ist der offizielle Weg, aber tatsächlich hatten meine Schüler viele Probleme bei der Verwendung von Datenbanken mit offizieller Installation. Warum ist das so? Denn tatsächlich jedem einzelnen Betriebssystem können Sie in jedem einzelnen Betriebssystem einige Probleme haben. Zusätzlich müssen Sie einen Ordner erstellen, dann müssen Sie den Pfad angeben usw. Es ist schwieriger. diesem Grund empfehle ich Ihnen dringend die zweite Möglichkeit in Betracht zu ziehen, wie Sie die Datenbank auf Ihrem Computer installieren können. Und dann spreche ich hier über DACA und über Docker Desktop. Was ist Docker? Dies ist ein spezielles zusätzliches Tool , das Sie nicht lernen sollten, aber Sie können es einfach verwenden. Die Hauptidee ist, dass Docker alles in den Container packt. Es ist vollständig isoliert und hat nichts mit Ihrem Betriebssystem zu tun. Docker funktioniert auf allen Betriebssystemen und ist kostenlos, was eigentlich die Idee bedeutet , dass wir Docker zunächst auf Ihrem Computer installieren . Und zweitens verwenden wir das offizielle Mongo-Image von Docker. Wie Sie hier sehen können, der Link für Mongo , der von MongoDB selbst unterstützt wird. Das ist also kein Tool von Drittanbietern. Das ist super offiziell und die Hauptidee ist, dass dieser Mongo in einem Container verpackt ist, sodass er vollständig isoliert auf Ihrer Maschine ist und Sie einfach aus dem Container, dem Hafen, in dem Sie können verbinden und Daten in diesen Container schreiben. Und so wird es aussehen, wenn du damit anfängst. Wie Sie hier links sehen können, muss es grün sein. Und an diesem Punkt, weißt du, okay, mein Docker läuft und für dich wird die Liste hier wahrscheinlich leer sein. Das ist völlig in Ordnung. Die Hauptidee ist, dass Sie Docker zunächst auf Ihrem Computer starten. Danach springen wir einfach zur Konsole und müssen einen solchen Befehl ausführen, wie Sie hier sehen können. Ich habe docker run geschrieben und nachdem Sie Docker Desktop auf Ihrem Computer installiert haben, können Sie Docker in die Konsole. Dies ist der bekannte Name, und hier schreiben wir docker run dann minus d, was bedeutet, dass dies ein abgetrennter Prozess sein muss, was eigentlich bedeutet, dass wir ihn nicht hier in diesem Terminal ausführen wollen . Wir wollen es nur vom Terminal trennen. Hier geben wir Ports an und danach geben wir den Namen mongodb an. Und hier, Mongo, dieser Name, ist mongodb der Name des Containers auf meinem Computer. Und hier, was wir herunterladen wollen, das ist genau das Bild, das wir verwenden werden. Hier verwenden wir Mongo 404. Sie können auch eine spätere Version verwenden, hier können Sie sie auf der offiziellen Website des Mongo oder hier im Docker überprüfen auf der offiziellen Website des . Wie Sie sehen können, können Sie hier klicken Tags, ein wenig scrollen. Sie können beispielsweise die neueste Version verwenden oder einfach die Version überprüfen, wie Sie hier sehen können, die neueste Version ist 507. In diesem Moment habe ich auf meinem Computer für 0 für installiert, aber das macht keinen großen Unterschied. Die Dinge, die wir in MongoDB ausprobieren werden, sind bei all diesen Versionen gleich. Jetzt schlage ich hier und Docker wird dieses Bild auf meinen Computer herunterladen. Wie Sie sehen können, habe ich außer einem Hash überhaupt keine Ausgabe erhalten . Und das liegt daran, dass MongoDB bereits von Docker auf meinen Computer heruntergeladen wurde. Das ist also kein Problem, und diese Linie hat Mongo DB einfach wieder auf meinem Computer gestartet. Und tatsächlich, wenn ich jetzt das Docker-Tool öffne, können Sie hier eine MongoDB sehen und sie ist grün weil sie gerade läuft und wir mit ihr sprechen können. diesem Grund müssen Sie, wie Sie sehen, keine zusätzlichen Dateien erstellen. Sie müssen sich nicht um einige Berechtigungen oder Ordner kümmern. Es funktioniert einfach. Und dies ist eine einzelne Linie , die für viele Projekte verwendet wird. Nun ist die Frage offensichtlich, wie wir in die Konsole von MongoDB springen können , wenn sie sich im Container befindet. Und dafür haben wir einen speziellen Befehl, docker exec, was bedeutet, IT ausführen. Und hier ist der Name unseres Containers. In unserem Fall war es MongoDB. Und danach schreiben wir unseren Befehl und wir wollen Mongo hierher kommen , weil dies im Container installiert ist. Innerhalb des Containers kann was auch immer installiert werden. In unserem Fall enthält dieses Mongo-Bild einfach Mongo. Deshalb drücken wir die Eingabetaste. Wir bekommen hier viele Nachrichten von MongoDB. Und wie Sie danach sehen können, bin ich jetzt hier im Terminal von Mongo innerhalb des Containers, und sie können hier einige Mongo-Befehle schreiben. Zeigen Sie zum Beispiel Datenbanken, Semikolon, ich drücke die Eingabetaste, und Sie können sehen welche Datenbanken ich hier habe. Nun könnte man sagen, okay, aber ich habe Docker nicht benutzt, MongoDB nur auf offizielle Weise installiert , was sollen sie tun? Und eigentlich musst du nur eine einzige Sache tun. Wenn Sie es auf offizielle Weise installiert haben, haben Sie zwei verschiedene Befehle in Ihrer Konsole. Zuallererst wird es ein Gottes Befehl sein, und dies wird genau so beginnen, wie wir es mit dem Docker Run MongoDB-Prozess auf Ihrem Computer getan haben , was tatsächlich bedeutet, dass die Datenbank ein Prozess ist läuft auf Ihrem Computer. Und der zweite Befehl, den Sie verwenden möchten, ist Mongo. Dieser Befehl springt direkt in die Konsole ein, genau wie wir es mit dem Drehmoment getan haben. Es wird genauso sein. Das Wichtigste in diesem Kurs ist, dass Ihre Datenbank Mongo während der Entwicklung des Projekts direkt auf Ihrem Computer ausgeführt werden muss direkt auf Ihrem Computer ausgeführt werden . Was bedeutet, dass du wirklich drei Dinge hast. Zuallererst haben Sie eine Standarddatenbank. Zweitens habe ich den Webserver für das Backend gestartet. Und der letzte ist der statische Webserver für das Frontend. 7. Benutzst du einen guten Editor?: Wir sind fast fertig mit der Subtypisierung all unserer Tools. Und die letzte Frage , die ich dir stellen möchte, benutzt du wirklich den richtigen Editor? Denn eigentlich werden wir eine Menge TypeScript in Ihren Editor schreiben . Und der Editor unterstützt TypeScript nicht so gut, dann denken Sie vielleicht darüber nach, einen anderen Editor zu verwenden. Wie Sie hier sehen können, bin ich in meinem Editor, das ist Vim, aber ich schlage es Ihnen nicht vor. Ich will nur zeigen, wovon ich spreche. Wie Sie hier sehen können, wo die Komponente in Angular eingefügt wird und hier haben wir die Eingabe unserer Komponente. Normalerweise, wenn wir den Code mit schreiben , invertiert nicht mit schreibe einfach etwas wie add component oder vielleicht einfach add than comp. Und dann haben wir eine automatische Vervollständigung. Und das kannst du hier sehen, wir können eine Menge Sachen auswählen. Wir wollen eigentlich eine Komponente von Angular eingeben. Er tendierte nicht nur dazu, hier zu sein. Und zuallererst wurde es bis zum Ende automatisch vervollständigt. Und zweitens habe ich diese äußere Eingabekomponente von Angular com bekommen. Und es ist äußerst wichtig , dass Ihr Redakteur dies kann. Sie benötigen wirklich Unterstützung für diese äußeren Eingaben, wenn Sie Code schreiben. Denn jedes Mal, wenn Sie eine Eingabe schreiben müssen, wenn Sie sie wirklich von Hand machen wie die Eingabekomponente aus, und Sie wissen nicht wirklich, aus welchem Paket Sie sie eingeben müssen. Das ist nicht effizient. Du verbringst einfach Zeit damit, Code für Ron-Dinge zu schreiben. Wir brauchen diese Funktion des äußeren Eingangs wirklich. Und das zweite Feature ist offensichtlich, dass Sie eine Unterstützung von TypeScript in Ihrem Editor haben möchten , was bedeutet, dass wir etwas schreiben, das nicht korrekt ist. Zum Beispiel, nicht hier auswählen, sondern nur auswählen, wo Sie direkt hierher gelangen, ein Nachrichtenargument vom Typ select existiert nicht für type component, was eigentlich bedeutet, aber keine Zeit verbringen etwas Magie debuggen. Wir sehen unseren Tippfehler einfach dort direkt im Editor. Sie können hier jeden Editor verwenden , der TypeScript unterstützt. Aber wenn Sie nicht wissen, welchen Editor Sie verwenden sollen, empfehle ich Ihnen dringend, sich VS Code anzusehen. Dies ist ein völlig kostenloser Editor , der auf jedem einzelnen Betriebssystem funktioniert. Sie installieren es einfach. Sie erhalten einen solchen Editor mit integrierter Unterstützung von TypeScript sofort, was bedeutet, dass Sie all diese Funktionen in Ihrem Editor haben. Und in diesem Fall ist es für Sie viel reibungsloser, Code zu schreiben. 8. Einrichten von Socket mit Express: In diesem Video beginnen wir mit der Entwicklung unseres Projekts. Und eigentlich ist das Ziel dieses Videos unseren Backend-Server mit Express, MongoDB und Socket IO einzurichten . Also lass uns anfangen. Hier. Wir müssen mehrere neue Pakete installieren. Zunächst möchten wir zum Ausdruck bringen, dass dies ein Rahmen ist. Deshalb möchte ich in die Konsole springen. Und wie Sie sehen können, wo innerhalb des Stammordners dies gezeichnet ist, wollen wir hier keine Pakete installieren , da wir zuerst in unseren Serverordner springen müssen in unseren Serverordner springen Boop will Pakete installieren. Hier bin ich in npm install express richtig. In diesem Fall installieren wir dieses Framework als Abhängigkeit. Hier können Sie sehen, dass wir jetzt eine neue Abhängigkeit haben, drücken Sie dies als unseren Rahmen aus. Das nächste, was wir installieren wollen, ist Mungo. Und wenn Sie nicht wissen, was Mongoose ist, ist dies das beliebteste Paket für die Arbeit mit MongoDB in bekannten Stühlen. Warum es am beliebtesten ist, weil Sie damit einfach Ihre Verbindung zur MongoDB einrichten können , können Sie Ihre Modelle erstellen und korrekter mit MongoDB arbeiten , indem Sie mit Modellen arbeiten. Sie haben also normalerweise so etwas wie ein RAM und wir werden in den nächsten Vorlesungen Mongoose steiler lernen. Und das Letzte , was wir hier installieren wollen, ist Socket IO. diesem Grund installiert npm Socket Dot Ion. Und das ist genau unsere Bibliothek, um mit WebSockets in bekannten Stühlen zu arbeiten. Wie Sie sehen können, sind alle unsere Abhängigkeiten installiert und jetzt können wir in set source, Server Ts springen , und wir haben hier nichts. Und wir können mit der Konfiguration unseres Sirups beginnen. Aber eigentlich ist hier die Frage. Es ist wirklich einfach, einfach Ihren Code für Stratton Express zu schreiben . Ihre Entität ist wirklich einfach, einen Webserver für Socket IO zu erstellen, aber eigentlich ist es nicht so einfach, MongoDB Express und Socket IO zusammen zu konfigurieren . Denn was wir von ausdrücken wollen, wollen wir normale Runden, genau wie in der normalen Anwendung, aber wir wollen auch an seine Socket-IO binden , damit wir mit WebSockets arbeiten können. Und zusätzlich zu all müssen wir unsere MongoDB irgendwie starten. Also wie gesagt, es ist nicht einfach, aber das ist die Produktion weg, denn eigentlich braucht niemand nur ein einziges Paket. Wir wollen wirklich die ausgewachsene produktionsbereite Anwendung. Also zuerst werde ich hier unseren Express eingeben. ausdrücken. Und tatsächlich denkst du in diesem Moment wahrscheinlich, okay, was er tut. Er hat versucht, innerhalb von Nomenstühlen eine Umkehrung durchzuführen. Und eigentlich ist das völlig in Ordnung, weil wir nicht richtig hier sind. Javascript, wo genau hier drin, TypeScript. Und es ist mit unserer Konfiguration passiert. Und nur um Sie daran zu erinnern, dass wir unsere TS-Konfiguration haben. Dies geschah in ECMO ScriptSig, das inzwischen gelesen werden kann, Jess. Am wichtigsten ist jedoch, dass CommonJS und Node eine höhere Auflösung ist. Hier wird es nach Bedarf umgewandelt und es wird wie ein Zauber im Jazz wirken. Für uns ist es jedoch äußerst komfortabel, da Verwendung von Eingaben viel besser ist als die Verwendung von Rechten. Und hier haben wir ein nächstes Problem. Wie Sie hier sehen können, habe ich einen Fehler. Die Deklarationsdatei für das Modul wurde nicht gefunden. Was bedeutet es? Typescript versucht uns bei der Umkehrung zu helfen. Er kann es nicht sofort machen, weil TypeScript nichts über Express-Paket weiß. Und hier ist eine Lösung, die wir mit npm install save-dev installieren müssen , Typen express. So können wir zusätzliche Installationstypen für Expresspakete installieren und dann kann uns das Typskript klein helfen. Und genau das wollen wir tun. Wir müssen springen und Konsole und Recht und Zahlungen Tau setzen . Und hier ist bei Typen Slash Express, und hier ist wichtig minus der Option, es einfach als Entwicklungsabhängigkeit zu installieren. Wir brauchen diese Bibliothek nicht für die Produktion. Und wie Sie nach der Installation sehen können, ist dieser Fehler behoben. Und jetzt kann uns TypeScript bei Express helfen. Hier haben wir unser Express-Paket erfolgreich importiert und können jetzt unsere Anwendung erstellen. Also kann ich einfach hier schreiben const ab equals, und hier rufen wir Express. Und wie Sie jetzt sehen können, wenn ich Halite und Express bin, können Sie alle Arten von Ausdrücken aus diesem speziellen Paket sehen . Zum Beispiel können wir hier lesen, dass es eine Express-Anwendung erstellt , was für Entwicklungszwecke äußerst hilfreich ist . Das zweite , was wir tun wollen, ist, dass wir einen HTTP-Server erstellen müssen und Sie werden gleich sehen, warum. Also hier möchte ich destrukturieren, Server erstellen, und hier wird http sein. Wie Sie sehen können, holen wir ATP aus der Box und erstellen auch Server, da dies das Standardknotenpaket ist. Es kann jedoch vorkommen, dass Ihnen Schreibweisen für bekannte Stühle fehlen . Hier können wir direkt in die Konsole springen und npm install types node minus t schreiben . Und in diesem Fall installieren wir mit Sicherheit alle Typings , die für Nomenstühle benötigt werden. Also hier haben wir create server von http importiert. Jetzt müssen wir es benutzen. Nach der App können wir also unseren HTTP-Server erstellen. Und hier wollen wir unseren Create Server aufrufen und in unserer App bereitstellen. Und nur um Sie daran zu erinnern, App, dies ist eine Instanz unseres Express. Das ist unser Express-Server. Wir erstellen hier einen HTTP-Server. Das nächste, was wir hier eingeben möchten, ist Socket. Dies ist hier, wo wichtiger Server mit großem S aus dem Socket-IO-Paket. Und jetzt können wir direkt unseren Socket-Server erstellen. Also hier const ion, und hier nennen wir uns Server. Und im Inneren stellen wir unseren HTTP-Server bereit. Genau aus diesem Grund haben wir diesen HTTP-Server zuerst erstellt und bevor er ausgedrückt wird. Jetzt haben wir in dieser Datei drei verschiedene Dinge. Zunächst haben wir unsere App, damit wir direkt mit Express arbeiten können. Zweitens haben wir unseren HTTP-Server , den wir mit einem Port beginnen können. Die dritte ist unsere IR, sodass wir einige WebSockets-Anfragen stellen können. Und nur um zu überprüfen, ob alles funktioniert, möchte ich hier unsere App verwenden und es einfach ausprobieren apt-get slash. Deshalb wollen wir unsere neue Route auf Schrägstrich erstellen. Und hier brauchen wir nichts, aber ich möchte nur mit einer Zeichenfolge antworten. Deshalb können wir hier Anfragen und Antworten schreiben. Und hier im Rest ist Dot Send API aktiv. Wenn Sie mit Express nicht vertraut sind, erstellen wir auf diese Weise nur Spielrouten innerhalb unseres Backend-Servers. Also hier sagen wir, okay, wir erstellen jetzt get route für Schrägstrich, was für die Homepage bedeutet. Und hier ist unser Kohlberg. Innerhalb unseres Kohlbergs bekamen wir Anfrage und Antwort. Und hier können wir dot send verwenden, um die Zeichenfolge an diese bestimmte Runde zu senden. Das Letzte, was wir hier tun müssen, ist unseren Server zu starten. Also hier können wir einen HTTP-Server schreiben. Höre nicht zu und höre nicht. Wir stellen einen Port bereit, zum Beispiel für 1001. Danach haben wir einen Rückruf. Der Tower-Webserver ist ebenso erfolgreich wie talentiert. So können wir zum Beispiel in ein Konsolenprotokoll schreiben, dass unsere API auf dem Port lauscht. Und hier wird unser Teil sein. Und eigentlich wäre es isoliert gewesen, den Sport in eine zusätzliche Konfigurationsdatei zu legen , aber im Moment wird es auch gehen. Prüfen wir also, ob es funktioniert. Ich habe hier eine Registerkarte mit offenem API-Server. Und wie Sie hier sehen können, kein Dämon diesen Webserver immer wieder neu gestartet. Und irgendwann bekommen wir jetzt unsere Konsolenprotokoll-API hört auf Port 4.001, was tatsächlich bedeutet, dass sogar der Browser lokalen Host für 1001 öffnen wird. Sie können hier sehen, dass unsere Nachrichten-API aktiv ist, aber nicht tolerierbar ist. Ich möchte auch überprüfen, ob unsere Socket-Layer-Verbindung funktioniert. Deshalb können wir hier nach EB ir dot schreiben und hier haben wir einen. Und wie Sie sehen können, holen wir zunächst alle Typisierungen mit Socket Layer aus der Box. Wir müssen kein zusätzliches Paket installieren. Zweitens können Sie das in der Listener-Funktion zu unserem Socket-IO sehen , was eigentlich bedeutet, dass wir hier auf schreiben können, und wir stellen hier als ersten Parameter eine Verbindung zur Verfügung. Und tatsächlich ist dies die Standardaktion , die innerhalb von Socket IO ausgeführt werden kann. Und hier haben wir unseren Rückruf. Wir wollen hier vorerst nichts, aber wir können einfach console.log verbunden schreiben. Und wir können nicht wirklich sehen, dass die Socket-Layer für uns funktioniert , weil wir nur eine Registerkarte im Back-End gesetzt haben, aber nicht auf dem Client. Aber auf diese Weise schreiben wir unseren Socket Layer-Code das Backend und wir sind voll darauf vorbereitet. Also hier zappen wir, wir arbeiten mit Express mit einem Yard, wir arbeiten mit Socket Layer und HTTP-Server, die wir zum Starten des Servers verwenden. Und das Letzte , was wir hier tun müssen , ist unseren Mungo aufzustellen. Und nur um Sie daran zu erinnern, dass Mungos das Paket für die Arbeit mit MongoDB verwenden. Also hier oben möchte ich eingeben, dass man von Mungo geht. Und jetzt ist hier ein wirklich wichtiger Punkt. Sie möchten Ihre Webserver niemals starten bevor Sie eine Verbindung zur Datenbank hergestellt haben. Die Hauptidee ist, dass Sie in Ihrem Beobachter einige Anfragen an die Datenbank stellen werden und die Datenbank noch nicht bereit ist Dann können wir diese Anfrage ausführen, was eigentlich jedes einzelne Mal bedeutet wir wollen sicher sein , dass MongoDB ist, ihre Verbindung ist hergestellt. Und erst danach starten wir unseren Webserver. Das ist y hier was ich nach unserem Socket IO schreiben möchte, wir können hier Mongoose dot schreiben und wir haben hier eine Methode connect. Und eigentlich wollen wir im Inneren unsere Mongodb-URL angeben. Also was ich hier einfügen möchte ist dieses Jahr, es ist MongoDB Doppelpunkt zwei Schrägstriche, lokaler Host 27017 Port-Schrägstrich l Trello. Und tatsächlich ist dieser Teil auf der linken Seite der Standardpfad von MongoDB. Und es spielt keine Rolle, wie Sie Mongo DB auf offizielle Weise oder mit Docker-Container installiert haben, es wird genauso funktionieren. Entweder haben Sie einen laufenden MongoDB-Prozess auf Ihrem Computer, auf dem Sport, oder Sie haben eine laufende MongoDB innerhalb des Containers mit dem Sport, der draußen auf unserem lokalen Computer verfügbar ist. Hier nach dem Schrägstrich ist dies nur der Name, wie eine Datenbank Sie hier schreiben können, beliebiger Name und sie wird erstellt. Ich habe gerade hier l Trailer geschrieben, wie der Name unseres Projekts. Diese Zeile ist also eigentlich ein Versprechen. Deshalb können wir hier dot schreiben. Nachdem wir uns erfolgreich mit unserer MongoDB-Datenbank verbunden haben, wird dann ausgelöst. Und jetzt können wir zunächst schreiben , dass wir uns erfolgreich mit unserer Datenbank verbunden haben. Also kann ich hier in Verbindung mit MongoDB schreiben. Und ich möchte auch diesen HTTP-Listener hineinverschieben. In diesem Fall wird zunächst unsere Verbindung zu MongoDB hergestellt. Und danach starten wir unseren Server. Jetzt möchte ich in unseren Webserver springen und überprüfen, ob er funktioniert. Wie Sie jetzt sehen können, erhalte ich eine Nachricht mit MongoDB und nach dem Semester , dass unsere API erfolgreich war, der Standard, was bedeutet , dass dies genau unser Ziel ist. Zuallererst MongoDB. Zweitens unser Webserver. In diesem Moment erhalten Sie möglicherweise etwas Azure bezüglich der Verbindung hier. Und das beliebteste Problem , das Sie möglicherweise haben, ist, dass Sie Ihren MongoDB-Prozess nicht auf Ihrem Computer gestartet haben. Wenn es nicht gestartet wird, können wir keine Verbindung zu einer MongoDB-Datenbank herstellen. Dann werden Sie hier wahrscheinlich einen Fehler bekommen, z. B. kann keine Verbindung zu Mongo DB herstellen oder Verbindung ist fehlgeschlagen. Wenn Sie jedoch auf Ihrem Bildschirm eine Verbindung zu MongoDB sehen und die Zahlung gestartet ist, bedeutet dies, dass Sie alles erfolgreich konfiguriert haben. Und wir haben unseren Webserver im Backend mit MongoDB und Socket IO gestartet . 9. Erstelle eines Mongoose: In diesem Video werden wir über die Erstellung unseres Benutzermodells sprechen . Eigentlich wird jetzt Application Boot registrierte Benutzer starten. Damit wir uns als aktueller Benutzer mit dem Benutzer anmelden können, was bedeutet, dass wir unsere Benutzer im Frontend, im Backend und in der Datenbank irgendwie behandeln müssen unsere Benutzer im Frontend, im Backend und in der Datenbank irgendwie behandeln . In diesem Video konzentrieren wir uns also auf Mungo und Datenbank. Wieder einmal, was ist Mungo wurde dieses Paket bereits in R-Paket JSON installiert. Sie können Mongoose hier sehen, aber was es im Wesentlichen tut, ist die offizielle Website von Mongoose. Sie können das Beispiel hier sehen. Also injizieren wir menschliche Güter und wir stellen Mongoose Dot Connect her. Und hier ist eine MongoDB-Datenbank. Danach können wir das Mungo-Modul cat schreiben, und wir definieren, dass unsere Katze einen benannten String hat, was tatsächlich bedeutet, dass cat unsere Entität ist. Und jetzt können wir diese Entität direkt in JavaScript erstellen. Hier sind wir direkt in Großbritannien, und wir geben innerhalb des Namens an. Also haben wir hier eine Katze geschaffen, die nur ein Objekt ist. Aber jetzt haben wir in Katie eine Speichermethode. Und diese Methode wird als Versprechen zurückgegeben, was tatsächlich bedeutet, dass wir den Datensatz auf diese Weise in MongoDB speichern. Jetzt fragst du dich vielleicht, okay, warum brauchen wir Mungo? Warum wir nicht einfach den offiziellen MongoDB-Treiber wie mongodb dot save verwenden und in ein Objekt werfen können , das wir speichern möchten. ist nicht angenehm, in dem riesigen Projekt zu arbeiten, selbst im mittleren Projekt, es ist nicht so bequem weil Sie keine Abstraktion haben. Sie schreiben Super-Low-Level-Code, wie Sie Daten in der Datenbank speichern müssen oder wie Sie sie lesen werden. Aus diesem Grund bevorzugen wir die Verwendung Rampen in unseren Backend-Projekten. Was sind Ram Dass schnell, wir definieren so etwas wie Modelle, die unsere Entitäten in unserem Projekt sind. Zum Beispiel haben wir einen Benutzer , der vielleicht Aufgaben hat, oder Sie haben Boards, wenn wir über Trail-Anwendungen sprechen und so weiter. Und dann können wir definieren , welche Beziehungen zwischen diesen Modellen bestehen. Und dann werden all diese Beziehungen auf viel einfachere Weise hergestellt. Wir können es selbst mit MongoDB machen, was bedeutet, dass wir einfach weniger Code schreiben. diesem Grund möchten wir uns in diesem Video auf unser Benutzermodell konzentrieren. Und das erste, was ich innerhalb der Quelle tun möchte, möchte ich den Typenordner erstellen. Und eigentlich sind wir hier drin TypeScript, was bedeutet, dass wir es nutzen müssen. Und das ist extrem wichtig , um mehr Zeit in TypeScript zu investieren als in das Schreiben Ihres Codes. In diesem Fall ist es für Sie einfacher , Ihre Anwendung zu entwickeln. Hier in Quelltypen möchte ich Benutzeroberflächenpunkte erstellen. Und wie Sie hier sehen können, habe ich diese Notation, in der wir ein Postfix dessen haben , was genau es ist. Im Inneren möchte ich unseren neuen Interface-Benutzer erstellen. Und wenn Sie TypeScript nicht wirklich gut kennen, ist dies nur eine Definition des Objekts, die wir überall verwenden können. In diesem Fall verwenden wir hier die Word-Schnittstelle, die ein reserviertes Wort in TypeScript ist. Und hier definieren wir einen Schnittstellenbenutzer und wir können definieren, welche Felder wir in unserem Benutzer haben. Zunächst müssen wir eine E-Mail erstellen, da wir in der Anwendung E-Mail verwenden , um den Benutzer zu registrieren, diesen Benutzer zu validieren und dann eine E-Mail an den Benutzer zu senden. Außerdem benötigen wir hier einen Benutzernamen und dieser wird gestreamt und ein Passwort wird ebenfalls benötigt. Und natürlich müssen wir ein Passwort hashen und niemals Passwörter stoppen, nur als eine Flugzeugbelastung. Und zu guter Letzt wird hier erstellt, wir müssen dieses Feld nicht verwenden, aber es ist wirklich schön, es zu haben, allem für Debugging-Zwecke. Und zweitens können wir es von Mongoose sofort nach dem Auspacken bekommen und es wird ein Datum sein. So sieht also eine Benutzeroberfläche aus. Jetzt können wir in unserer gesamten Anwendung, unserer Backend-Seite, auf unserer Backend-Seite, diese Benutzeroberfläche verwenden. Jetzt auf der rechten Seite möchte ich ein Modell für diesen Benutzer erstellen. diesem Grund können wir in der Quelle einen neuen Ordner erstellen , der als Modelle bezeichnet wird. Und im Inneren können wir Benutzerpunkte registrieren, und das ist unser Modell. Das ist genau etwas für Mongoose. Was ich hier schreiben möchte, ist unser Benutzerschema. Und was es hier bedeutet, definieren wir ein Schema unseres Modells. Und dafür verwenden wir ein neues Schema. Und wie Sie sehen können, habe ich keine automatische Vervollständigung. Versuchen wir also, das Schema hier zu importieren. Und wie Sie sehen können, habe ich hier keine korrekte Eingabe. Ich habe eine weitere Eingabe von Inspector, und das ist nicht korrekt. Also tippe ich hier ein Eingabeschema von Mungo. Prüfen wir, ob wir einen Fehler haben. Wir haben keinen Fehler, was bedeutet, dass dies nur ein Problem meines Redakteurs war. Hier kann ich das Schema überprüfen, was bedeutet, dass es wirklich mit TypeScript verfügbar ist. Hier sind wir genau in deinem Schema. Und jetzt können wir in runden Klammern unser Objekt definieren, aber das Schema ist nicht das, was wir in der Anwendung verwenden werden. Es sollte ein Modell sein. diesem Grund können wir hier schreiben , dass dann das Standardmodell exportiert wird. Und dieses Modell stammt auch von Mongoose. Also lass uns hier ein Komma-Modell setzen. Und hier ist model eine Funktion , bei der wir unsere Saite bereitstellen. Es wird mit großem Farbton verwendet. Und es gibt ein zweites Argument. Wir stellen hier ein Benutzerschema zur Verfügung. So definieren wir ein Modell in Mongoose. Hier können wir also das Standardmodell, das wir hier angeben, sowie den Namen und unser Schema exportieren . Und hier müssen wir unser Schema definieren. Aber wir haben Recht mit TypeScript. Und eigentlich ist es nicht der beste Weg, ein neues Schema zu erstellen. Warum ist das so? Hier heben wir unser Schema hervor und Sie können sehen, dass eine Menge n hier ist und das ist schlecht. Warum ist das so? Weil wir keinen Typ unseres Schemas definiert haben. Deshalb wollen wir das tun. Wir möchten eine Definition des Schemas für einen Benutzer erstellen. Also möchte ich hier links springen und hier eine Expertenschnittstelle erstellen. Es ist also eine neue Oberfläche für Benutzerdokumente. Hier ist ein riesiger Unterschied, wir haben hier eine Schnittstelle für den Benutzer. Dies ist nur ein Benutzer mit den Feldern und dies ist ein Dokument verwenden. Das verwenden wir nur für Mungo. Und hier möchte ich x tans schreiben. Und wenn Sie nicht wissen, womit es erweitert wird, nehmen Sie einfach alle Felder von unserem Benutzer hier. Also möchte ich hier schreiben erweitert Benutzerkomma-Dokument. Und eigentlich muss dieses Dokument von Mongoose geladen werden. Also hier oben muss ich ein Eingabedokument von Mungo schreiben. Und eigentlich müssen wir vorerst nichts im Inneren bereitstellen. Und du fragst jetzt vielleicht, okay, aber es ergibt keinen Sinn Was ich getan habe, war hier draußen. Wir haben ein Benutzerdokument für die Benutzeroberfläche erstellt. Hier sind wir einfach erweiterter Benutzer und Dokument. Und ja, das ist sinnvoll, denn zuallererst haben wir unseren Interface-Benutzer. Wir können es überall benutzen. Das ist unser Teil, aber wir mischen es auch mit dem Dokument. Und das Dokument kommt von Mongoose. Dies ist die Definition des Dokuments und ein schneller wichtiger Teil ist zum Beispiel dieses AD, da jedes einzelne Dokument in mongodb NAD hat. Und in diesem Fall müssen wir hier nicht angeben, dass der Benutzer AD hat, es stammt aus dem Dokument des Mungos. Und jetzt können wir hier rechts springen und oft das Schema verwenden. Wir können in Tanks ein Benutzerdokument bereitstellen , das wir gerade erstellt haben. Und jetzt kann ich es hier oben eingeben. So ist es von unserer Typen-Benutzeroberfläche. In diesem Fall sagen wir hier, dass unser Benutzerdokument das ist, was wir innerhalb unseres Benutzerschemas bereitstellen müssen . Und genau das Gleiche können wir mit unserem Modell machen , hier können wir unser Benutzerdokument bereitstellen. Und wenn Sie nicht wissen, was dieser Teil bedeutet, ist dies eigentlich ein generischer Typ, was eigentlich bedeutet, dass wir hier einen generischen Typ anbieten. Es kann alles sein, was standardmäßig es war. Aber wenn wir jetzt unser Schema überprüfen, können Sie sehen, dass es kein Schema mehr ist. Hier haben wir unser Benutzerdokument, und das ist extrem wichtig für uns und für die TypeScript-Validierung. Denn eigentlich hier, jetzt in dem, was ich tun möchte, möchte ich etwas werfen , das nicht innerhalb des Benutzers existiert. Nehmen wir zum Beispiel an , wir haben innerhalb des Benutzereigenschaftsformulars. Und hier drinnen wollen wir den Typ is string angeben. Und ich speichere das und gehe dann hier rein und schränke das Argument vom Typ foo ein, das nicht dem Parameter des Typs zugewiesen werden kann. Und hier können wir unseren E-Mail-Benutzernamen sehen, Passwort erstellt, Unterstrich-ID hinzufügen, die aus dem Dokument und hier zur Unterstreichung der Version kommt . Was eigentlich bedeutet, wenn wir dieses Benutzerdokument hier nicht mit ausprobieren , erhalten Sie keine Validierung von TypeScript. Es ist äußerst wichtig , dass wir es bekommen. Stellen Sie jetzt in der Maske alle Felder bereit. Chairman d'etre für unseren Benutzer. Und fangen wir mit der E-Mail an. Also hier ist unser Feld E-Mail und dann gesagt, Wir müssen den Typ angeben, es ist eine Zeichenfolge. Zweitens können wir hier die erforderliche Eigenschaft sagen und wie Sie sehen können, hilft uns TypeScript und zeigt welche Eigenschaften wir Einsicht bieten können Mongoose. Also eigentlich innerhalb erforderlich, kann aber ein Array mit einigen gültigen Daten und Nachrichten bereitstellen . Denn eigentlich wollen wir im Frontend eine nette Nachricht zeigen , wenn unsere E-Mail nicht gültig ist. Es ist also nicht nur eine Zeichenfolge. Dies ist eine ungültige E-Mail. Und dafür können wir hier auf dem Top-Validator eingeben. Also hier möchte ich gültige Daten für John Validator eingeben. Und wie Sie sehen, bekommen wir ein Fehlermodul. Validator ist nicht installiert, also müssen wir in unseren Server springen. Hier stoppe ich Webserver und sie werden hier Beeinträchtigungen tau gültige Daten schreiben , aber das ist nicht tolerierbar. Ich möchte auch Typen für dieses Paket erhalten. Dies ist hier bei Typen Schrägstrich gültige Daten, aber es muss im Entwicklungsmodus installiert werden. Also hier, vergiss nicht, minus t. Wir können jetzt auf der rechten Seite öffnen, sind JSON gepackt und wie Sie hier in den Entwicklungsabhängigkeiten sehen können, habe ich Typenvalidator und Abhängigkeiten validiert. Jetzt haben wir hier keinen Fehler für die gültigen Daten, sodass wir sie innerhalb von required angeben können. Und eigentlich liege ich hier ein bisschen falsch. Dies ist kein erforderliches Feld, da stattdessen mit einfach angeben erforderlich ist, ob es erforderlich ist oder nicht. In unserem Fall ist eine E-Mail erforderlich. Hier können wir als zweiten Parameter eine Fehlermeldung ausgeben, wenn sie leer ist. Und hier können wir E-Mail angeben, ist erforderlich. Und danach haben wir unsere Bestätigung. Hier haben wir eine Eigenschaft validieren, und genau hier wollen wir unseren Validator verwenden. Also hier kann ich validator dot schreiben und wir bekommen wegen der Typen eine nette automatische Vervollständigung. Und hier schreibe ich seine E-Mail. Also hier haben wir viele Validierungen. Und wo ich sofort eine E-Mail-Bestätigung erhalte. Und es gibt ein zweites Argument, das wir hier angeben können , die ungültige E-Mail. guter Letzt möchte ich Indizes erstellen. Und wenn Sie nicht wissen, was Indizes sind, sind dies Dinge, die Ihre Datenbankanforderungen beschleunigen können . Und zweitens kann es beispielsweise ein E-Mail-Feld eindeutig machen . In diesem Fall möchte ich Create-Indizes schreiben. Und hier als Objekt biete ich Einblicke, einzigartig, wahr, was es tut, es liest unsere E-Mail ist ein eindeutiger Index in diesem Fall, aber kann nicht zwei Personen mit derselben E-Mail retten. Also stellen wir innerhalb des Mungo-Schemas wieder alle Felder bereit , die wir für unseren Benutzer benötigen. Und das erste Feld war hier eine E-Mail, muss aber einen Typ enthalten. Und das ist genau die Onload-Leitung , die wir standardmäßig benötigen. Aber eigentlich können wir hier erforderlich angeben , was wir in true oder false setzen können , hier können wir einige Validatoren bereitstellen und wir können Indizes erstellen. Und tatsächlich können wir all diese Sachen einfach innerhalb des MongoDB-Treibers der Ebene machen. Deshalb bevorzuge ich die Verwendung von Mongoose, weil es sich in einem Bereich befindet , in dem wir all diese Dinge aus der Box holen . Unser nächstes Feld ist unser Nutzername. Hier können wir also unseren Benutzernamen angeben und es wird einfacher. Erstens ist der Typ string, und zweitens muss required true sein. Und hier möchte ich auch den Validierungsfehler angeben. diesem Grund verwenden wir dieselbe Notation mit dem Array. Hier ist true und der Benutzername ist erforderlich. Jetzt können wir diesen Benutzer kopieren und einfügen , da es derselbe sein wird. Und das letzte, was wir hier haben, ist unser Passwort und unser Passwort ist Typ string, und es ist auch erforderlich, aber hier ist ein Passwort erforderlich. Und das Letzte, was wir tun wollen, ist falsch auszuwählen. Und was select false tut, wird dieses Feld niemals auswählen , wenn wir eine Anfrage stellen. Zum Beispiel möchten wir einen Benutzer nach ID aus der Datenbank abrufen . Wir werden dieses Feld nicht zurückbekommen. Und das ist äußerst wichtig, da unsere Anwendung dadurch sicher ist. Es spielt keine Rolle, welche Fragen wir schreiben. Wir wissen immer, dass wir kein Passwort zurückbekommen, was bedeutet, dass wir standardmäßig auf der sicheren Seite sind. guter Letzt wollen sie hier Zeitstempel bereitstellen. Also können wir hier innerhalb eines Objekts bereitstellen und hier Zeitstempel schreiben, und hier setzen wir es auf true. In diesem Fall wird unsere createDat-Eigenschaft direkt von mangoose generiert. Aber wie Sie hier sehen können, gibt es einen Tippfehler. Wir müssen das Thema hier nicht angeben. Es ist ein zweites Argument nach unserem Objekt, was eigentlich bedeutet, dass wir im neuen Schema als Funktion erstens dieses Objekt mit all unseren Feldern zur Verfügung stellen , und zweitens das Objekt mit timestamps wahr. Dies ist also das zweite Dokument darüber, wie das neue Schema aussieht. Wir sind also bereit mit dem ersten Teil unseres Modells. Aber wir haben hier ein wirklich großes Problem, wenn wir einfach versuchen, unseren Benutzer so zu benutzen. Zum Beispiel können wir hier einen neuen Benutzer schreiben und wurden in einem Objekt mit E-Mail-Benutzernamen-Passwort versehen. Und danach rufen wir sicher auf, dann speichert unser Benutzer dieses Passwort direkt als einfache Zeichenfolge. Das ist verboten, das ist falsch und wir sollten das niemals tun. Deshalb müssen wir dieses Problem beheben. Was wir dagegen tun können, müssen wir unser Passwort hashen bevor wir es in der Datenbank speichern. Und dafür können wir eine wirklich nette Bibliothek benutzen, die Krypta genannt wird. Und das ist die beliebteste Lösung. Hash das Passwort. Hier müssen wir in die Konsole springen und dieses Paket installieren. Also npm installiert sei crypt jazz und wir wollen auch Typings installieren. Also hier bei Typen Slash Crypt Jazz sein, aber offensichtlich muss es Breite minus t sein. Also lasst uns den Sound überprüfen. Ich springe zum Paket JSON. Und hier sehe ich Typen sind Christen in Entwicklungsabhängigkeiten und Krypto-Unabhängigkeiten. Das ist völlig richtig. Was wir nun hier tun können, können wir das Benutzerschema dot Prayer definieren. Und das ist die Möglichkeit, eine Funktion vor etwas auszuführen . Hier sind wir daran interessiert, einen Safe bereitzustellen, was bedeutet, dass wir unsere Funktion direkt vor dem Safe ausführen . Also hier möchte ich eine sinc-Funktion schreiben und sie werden sagen, warum ich hier Funktion und nicht Pfeilfunktion verwende in einer Sekunde sagen, warum ich hier Funktion und nicht Pfeilfunktion verwende. Es ist wirklich wichtig , es so zu schreiben. Und hier kommen wir als Nächstes. Und jetzt haben wir hier eine Klammer und wir können etwas drinnen machen. Die Hauptidee ist, dass wir hier mit unserem Objekt machen können, was wir wollen. Und danach, wenn wir zum Beispiel das Thema wechseln, müssen wir als nächstes anrufen und dann wird Mungo mit dem Speichern unserer Daten fortfahren. Und Pre-Sales bedeutet, dass diese Funktion zuerst nach Create und zweitens nach dem Update aufgerufen wird. Und genau das wollen wir. Zum Beispiel möchten wir nicht nur ein Passwort für den Benutzer erstellen, sondern auch später im Aktualisierungsformular aktualisieren. Und die erste Bedingung, die ich hier schreiben möchte , ist so. Wenn nicht, wird dieser Punkt geändert. Und wie Sie sehen können, haben wir eine Funktion geändert und wir können Einblickwort, Passwort zur Verfügung stellen , und dann wollen wir einfach nichts tun und als nächstes zurückkehren. Was wir also hier machen, wir prüfen, ob unser Passwortfeld geändert wurde. Es ist nicht der Fall wurde erstellt weil wir dort ein Passwort haben werden, aber es ist der Fall mit update wenn Vorschläge user und wir das Passwort nicht geändert haben, dann macht es keinen Sinn, sich zu bewerben diese Funktion. Das ist hier, wo Hühnchen, okay, wenn das Passwortfeld nicht geändert wird, dann sagen wir einfach für Mungo, mach weiter. Wie Sie hier sehen können, haben wir eine sinc-Funktion geschrieben und keine Fehlerfunktion. Und es ist wichtig hier, weil wir diese Eigenschaft hier nutzen wollen. Und um diese Referenz korrekt zu haben, müssen wir sie als Funktion schreiben und nicht als Pfeilfunktion, denn in einem anderen Fall wird dies ausgeführt und wir verwenden hier auch eine sinc-Funktion, weil Die Crypt-Operation wird synchron sein. Danach möchte ich try-catch schreiben. Und wenn wir einen Fehler bekommen, wird es Krypta sein, dann kommen wir in den Käfig. Hier, wir bekommen unseren Fehler und wir wollen diese Sarah als nächstes zurückgeben. Hier werfen wir als Fehler in Azure. Und du fragst vielleicht, okay, aber warum ist dieser seltsame Notationsfehler als Ära? Wenn Sie versuchen, einfach so zu schreiben, erhalten wir einen Fehler. Das Argument vom Typ unknown kann nicht einem Parameter vom Typ Callback error oder undefined zugewiesen werden, was tatsächlich bedeutet, dass innerhalb eines Käfigs jedes Azure unbekannt ist, was offensichtlich ist, weil dies skizzieren und wir wissen nicht, was passiert ist. Deshalb schreiben wir catch, aber eigentlich können wir einen solchen Pfeil nicht verwenden und wir können ihn als nächstes im Inneren bereitstellen Deshalb müssen wir einen Typ unserer Ära in etwas Sinnvolles umwandeln . In diesem Fall verwende ich den S-Pfeil und wir können Fehler in der nächsten Funktion bereitstellen. Das ist genau das, was wir hier machen. Jetzt müssen wir es mit unserer Logik versuchen, das Passwort zu hashen. Und dafür möchte ich oben unser großes geripptes js-Modul eingeben. Also gebe ich be Crypt Jazz von Big Rip Jazz ein. Und jetzt können wir in unserem Versuch zuerst ein Salz bekommen. Und wenn Sie nicht wissen, wo Sie Crypt generieren und zuerst salzen und dann haben wir eine Entschlüsselungsfunktion bereitgestellt , um das Passwort zu hashen. Das ist so, wir brauchen ein Salz. Und dafür sind wir Colin, der sein Dot Gen Salz gecrimpt hat. Wie Sie sehen können, ist dies eine Funktion, die synchron schnelles Salz erzeugt. Und hier können wir zum Beispiel zehn bereitstellen. Und das ist eine asynchrone Funktion. Hier müssen wir versuchen zu warten, damit es schnell Salz bekommt. Und jetzt müssen wir hier unser Passwort aktualisieren. Und tatsächlich wird diese Funktion aufgerufen, bevor wir diesen Datensatz gespeichert haben, was bedeutet, dass wir damit einen Verweis auf alle Felder haben , die wir speichern möchten. Und hier schreibe ich dieses Punkt-Passwort, um unser Feld zu ändern, das wir speichern möchten. Hier wollen wir einen Weight B Creep Chess Dot Hash und tatsächlich Hash zuweisen , wie Sie hier sehen können, haben wir unser Passwort und im Inneren müssen wir zunächst unser Passwort, dieses Passwort, angeben. Und zweitens salt, in diesem Fall wird unser Passwort gehasht und wir speichern nur einen Hash in unserer Datenbank. In diesem Fall wird dieses Passwort aktualisiert, nachdem wir das nächste Mal anrufen und es sicher tun müssen, dieses Passwort aktualisiert und wir werden den sauberen Datensatz speichern. diesem Grund wollen wir im Inneren return als nächstes schreiben und wir nennen es einfach, dies wird das Speichern für einen Datensatz in der Datenbank auslösen. Und der wichtigste Teil, der diese Logik innerhalb von Modal neu zeichnet , verkaufte diese Logik mit Speichern ist innerhalb des Modells vollständig isoliert. Und wenn wir Code schreiben , der sich auf den Benutzer bezieht, werden wir nicht einmal über diese Logik Bescheid wissen. Es ist alles im Modell enthalten. Es hat nichts damit zu tun, einen Benutzer zu finden oder den Benutzer zu retten. Es ist das, was innerhalb des Modells passiert. Das Letzte, was wir für die Zukunft benötigen ist die Funktion Passwort validieren. Warum brauchen wir es? Denn wenn wir versuchen, den Benutzer anzumelden, möchten wir nicht nur die E-Mail, sondern auch das angegebene Passwort vergleichen . Und wir haben eine wirklich nette Sache, die Methoden in Mongoose genannt wird. Hier können wir also Benutzerschema-Methoden schreiben, und hier möchten wir eine neue Methode erstellen, zum Beispiel das Kennwort validieren. Und tatsächlich funktioniert es genauso, wie zum Beispiel Methoden innerhalb von Klassen. So können wir unsere Instanz unseres Benutzers aufrufen. Diese Methode validiert das Passwort. Und hier müssen wir die Funktion bereitstellen. Und wieder schreibe ich hier nicht die Pfeilfunktion, sondern nur eine Funktion hier, indem ich ein Passwort als Parameter erhalte. Denn wenn wir ein Passwort vergleichen wollen, werden wir tatsächlich etwas bereitstellen , das wir vergleichen möchten. Dies ist y hier password ist eine Zeichenfolge, und hier drinnen möchten wir das angegebene Passwort mit unserem Passwort in unserer Instanz vergleichen das angegebene Passwort mit . Also hier können wir einfach zurückkehren be grip js dot compare. Und dies ist eine Funktion, um zunächst ein Flugzeugpasswort zu vergleichen, das von außen bereitgestellt wird. Und zweitens unsere Zeichenfolge, und das ist dieses Punktpasswort, das wir als Hash in unserem Datensatz speichern. Unsere letzte Nutzung wird also so aussehen, wo wir zum Beispiel hier drin einen Benutzer haben und ihn speichern wollen. Also hier haben wir einen neuen Benutzer. Wir müssen in unserer E-Mail angeben. Dann müssen wir hier einen Benutzernamen angeben, und dann geben wir hier ein Passwort. Danach werden wir versuchen, einen Benutzer zu speichern. Also hier werden wir use nennen. Es spart. Und tatsächlich, nachdem Colin so dünn ist, wird unsere Presse Save aufgerufen und wir werden das korrekte Passwort speichern. Aber nach dieser Zeile können wir auch ein Benutzerpasswort zur Punktvalidierung schreiben. Und hier können wir jedes Passwort angeben , das wir vergleichen möchten. Diese Funktion gibt für uns je nach Richtigkeit des Passworts true oder false zurück je nach Richtigkeit des Passworts true oder false . Und das ist völlig richtig, um all diese Dinge innerhalb des Benutzermodells zu erledigen all diese Dinge innerhalb des Benutzermodells und nicht in einigen Controllern , in denen wir einfach mit Benutzern arbeiten. Denn in diesem Fall ist unsere Logik innerhalb des Benutzers vollständig isoliert. Und jetzt fehlt uns nur noch eine einzige Zeile in unserer Typen-Benutzeroberfläche mit definiertem Benutzerdokument. Aber eigentlich müssen wir in diesem Benutzerdokument angeben , dass wir hier eine neue Methode geschrieben haben , das Kennwort validieren. diesem Grund möchte ich, was ich hier tun möchte, eine neue Methode innerhalb des Validate-Passworts erstellen. Und wir wissen, dass wir im Inneren einen Parameter bekommen, wir können ihn einfach param1 nennen, und das ist eine Zeichenfolge, und wir wissen, dass wir zurück eine Zeichenfolge bekommen. In diesem Fall werde ich verwenden, dass ein Dokument vollständig korrekt typisiert ist und wir es später in TypeScript verwenden können , um diese Methode zum Überprüfen des Passworts aufzurufen und eine automatische Vervollständigung zu erhalten. 10. Hinzufügen von Registrierung: Im vorherigen Video haben wir unser Benutzermodell erfolgreich erstellt. Und sie können verstehen, dass das vorherige Video wirklich trocken war, weil wir gerade ein Modell erstellt haben und Sie nicht gesehen haben, wie wir dieses Modell in einer echten Anwendung verwenden. diesem Grund besteht das Ziel dieses Videos darin, unsere Registrierungsmethode zu erstellen, was bedeutet, dass wir den Benutzer registrieren, und genau so werden wir unser Benutzermodell verwenden. Schauen wir uns also unseren Code an. Im Moment haben wir nur ein Modell in Quellmodellen. Und was wir bauen wollen, ist MVC-Architektur. Was hat es eigentlich ein Mittelwert innerhalb eines Frameworks ausgedrückt. Keine Architektur , die mit einfach definierten Routen zum Ausdruck gebracht einfach definierten Routen starten den Webserver und wir sind startklar. Wir haben nicht viele Regeln, die innerhalb von express definiert sind. Deshalb müssen wir selbst etwas tun. Und die wirklich beliebte Architektur, die unser Back-End-Projekt gut nutzt , ist MVC, was eigentlich Modellansicht und Controller bedeutet. Und tatsächlich werden wir in 90 Prozent der Fälle nur Modelle und Steuerungen verwenden. Wir werden keine Ansichten verwenden, nur weil wir gerade arbeiten und eine EPI erstellen und dort keine Ansichten rendern müssen. Wir antworten nur mit den Keuschern und das ist es. diesem Grund ist es meine Idee, einen neuen Ordner zu erstellen , der Controller genannt wird. Die Hauptidee ist , dass hier stattdessen Sorority S alle unsere Routen registriert. Zum Beispiel haben wir hier eine Route für die Homepage. Die Hauptidee ist, dass wir die Logik dieser Route hier nicht direkt als Callback schreiben , sondern in einen standortspezifischen Controller schreiben, was eigentlich alle unsere Anfragen bedeutet in die wir uns aufteilen möchten verschiedene Controller. Zum Beispiel haben wir einen Benutzercontroller und es gab Unruhen bei all unseren Aktionen in Bezug auf Registrierung, Anmeldung, Benutzerabmeldung usw. Dann haben wir einen Board-Controller, in den wir alles schreiben , was mit Board zu tun hat. Der wichtigste Teil ist, dass das interne Modell definiert wie wir mit der Datenbank arbeiten. Also erstellen wir unsere Entity wie user, aber innerhalb des Controllers , indem wir diese Entität verwenden. Und wir erstellen einige Antworten unserer API, was bedeutet, dass wir unsere Logik trennen. Alles war Datenbank wird zu Modellen gehen, aber wir verwenden Modelle in solchen Controllern. Das war also die Theorie. Erstellen wir nun unseren ersten Controller. Und dafür möchte ich mich hier in Ihrer Route registrieren, und es wird eine Route für die Registrierung sein. diesem Grund haben wir hier einen App-Beitrag und die URL wird Slushy Pie Slash-Benutzer sein. Hier wird unser Benutzer-Controller-Punktregister sein. Also unsere erste Regel hier ist, dass wir alle unsere URLs mit Slash-API beginnen, denn eigentlich ist es wirklich schön, einen Namespace für unsere API zu haben. Zweitens, wie Sie sehen können, wo es nicht wichtig ist, so etwas wie registrieren, wo Eingaben hier die gesamte Benutzersteuerung und wir einige gute Namen haben müssen. Der typische Name und für Controller ist immer mit Asset als beispielsweise Controller eines Benutzers und nicht der Benutzercontroller. Jetzt importieren wir Stern, während die Benutzer es kontrollieren. Und wenn Sie nicht wissen, was das bedeutet, ist die Hauptidee, dass wir im Inneren eine Reihe von Funktionen haben werden. Und dieses Mal als Gruppen, all diese Funktionen in diesem Objekt. Und dann können wir so etwas wie user controller dot register schreiben . Also hier wollen wir es importieren, und hier haben wir unseren Controller-Schrägstrich, und hier werden wir Dateibenutzer erstellen. Und wie Sie sehen können, macht es keinen Sinn, diese Datei als Controller zu bezeichnen, da sich diese Datei direkt in Controllern befindet . Das ist so hier, Lass uns reinspringen, damit es kontrolliert. Und hier ist users.js. Und das ist unsere Akte , die ein Controller ist. Und dann sagen wir, es war richtig, alle Aktionen, die sich auf die Benutzerentität beziehen. Jetzt auf der rechten Seite möchte ich unseren Server Ts öffnen. Und wie Sie sehen können, ist dieser Teil, den Sie hier sehen können, das , was wir innerhalb des Controllers schreiben. Das ist also unser Rückruf. Und wie Sie sehen können, ist dies nur eine einfache Funktion mit der Anforderungsantwort. Und der dritte Parameter hier kann der nächste sein. Deshalb möchte ich, was ich hier machen möchte, eine Funktion erstellen , die register heißt. Und das ist eine asynchrone Funktion. Warum wir hier in einer synchronen Funktion brauchen, weil wir mit der Datenbank und diesen Anfragen für unsere Datenbank oder als synchron arbeiten werden . Und hier bekommen wir als Argument zuallererst Anfrage, zweitens Antwort, und das letzte ist das nächste. Und das ist nur eine Funktion. Das ist also genau das, was wir hier direkt eingefügt haben, aber wir haben es einfach nach draußen verschoben, in unseren Controller. Aber dieser Code ist schlecht. Warum ist das so? Denn eigentlich haben wir hier unsere Anfrage-Antwort nicht eingegeben. Und als nächstes, also hier kann ich Doppelpunkt schreiben, und hier haben wir unsere Anfrage. Und das ist der wichtigste Teil. Hier haben wir eine Anfrage, die von der Fetch API stammt. Wir brauchen es nicht, aber wir brauchen eine Anfrage, die von ausgedrückt wird. Das ist y hier, Importanfrage von Express. Und wie Sie jetzt sehen können, haben wir eine völlig andere Definition. Wir haben hier drinnen Kleid, Körper, Wunschkörper. Und genau das brauchen wir. Außerdem brauchen wir hier nicht nur eine Anfrage, sondern eine Antwort, und ich bin hier in Großbritannien auch eine Antwort. Geben Sie hier die Antwort als Antwort ein. Und die letzte ist nicht die nächste, sondern die nächste Funktion. Hier sind unsere beiden Eingaben korrekt. Es ist von ausgedrückt. Auf diese Weise werden wir normalerweise eine neue Aktion des Controllers erstellen. spielt keine Rolle, ob es sich Benutzercontroller oder um einen Artikelcontroller handelt, es wird immer derselbe sein. Jetzt wollen sie direkt im Inneren try-catch schreiben. Warum ist das so? Denn tatsächlich werden wir in dieser Funktion einen synchronen Code mit async await schreiben . Und wir wollen mit allen Fehlern umgehen. Und der einfachste Weg , um einen Fehler zu behandeln, ist die Verwendung von next, und wir haben es bereits zuvor in unserem Modell verwendet. Hier funktioniert es genauso. Also können wir hier schreiben, versuchen und wir haben einen Käfig und wir bekommen einen Fehler. Was wir tun wollen, das, was wir als nächstes aufrufen und den Fehler hineinwerfen. Das ist es tatsächlich, dies ist eine einzelne Zeile, die unseren Fehler zum Ausdruck bringt, und dann wird Express die Sarah auf dem Bildschirm zeigen. Jetzt im Inneren möchten wir einen Benutzer erstellen, da dies tatsächlich die Registrierung ist und die Registrierung bedeutet, einfach einen Benutzer zu erstellen. diesem Grund möchte ich hier das Benutzermodell importieren. Und hier haben wir unsere Modelle Slash-Benutzermodell, das wir zuvor erstellt haben. Und wie Sie hier sehen können, habe ich es nicht als Benutzer mit Großbuchstaben U bezeichnet, sondern das Modell verwendet. Dies soll nur kristallklar in unserem Code sein , mit dem wir arbeiten, model. Und jetzt können wir dieses Modell drinnen verwenden. Also können wir hier const schreiben, und hier ist neuer Benutzer, denn hier wollen wir einen neuen Benutzer registrieren und wir sind genau hier im Hue User Model. Und jetzt müssen wir ein paar Daten weitergeben. In unserem Fall müssen wir hier männlich als Benutzername und Passwort übergeben . Also hier wollen wir das schreiben. Wir möchten eine E-Mail einrichten, und dies ist eine Anfrage Punkt Body Dot E-Mail. Dann wollen wir hier den Benutzernamen festlegen, und das ist request dot, dot username. Und das letzte ist Passwort, und es ist Anfrage Dot Body Dot Passwort. Aber hier haben wir ein riesiges Problem. Standardmäßig kann Express nicht mit Kochen arbeiten und Express übergibt es standardmäßig kein Tau. Deshalb müssen wir, was wir tun müssen, ein zusätzliches Paket dafür installieren. Und dieses Paket heißt BodyParser. Deshalb werde ich in die Konsole springen und mir bewusst sein, dass ich hier im Server bin. Ich werde npm install schreiben. Und hier wollen wir BodyParser installieren. Ich drücke die Eingabetaste und das Paket ist installiert. Jetzt können wir unseren Server erneut starten und zurückspringen. Die Hauptidee ist also, dass ich hier anstelle der Schwesternschaft S meinen Körperparser importieren werde. Also hier nennen wir es BodyParser mit camelCase und wir importieren es aus dem Paket bodyParser. Jetzt irgendwo hier, bevor wir unsere Routen machen, können wir eine Verwendung schreiben und drinnen wollen wir es versuchen bodyParser dot json. Und tatsächlich können Sie hier direkt überprüfen, was BodyParser Jason macht und es wird eine Middleware zurückgegeben, die Tonlippe parst JSON und genau das wollen wir. Wir wollen unseren JSON weitergeben, aber es ist nicht nur das, sondern wir wollen auch einen weiteren Körperparser für IPOs. Und hier wird Punkt-URL codiert sein. Und im Inneren bieten wir erweiterte Informationen über das, was diese beiden Linien tun. erste Zeile sucht nur nach Anwendung json des Inhaltstyps und dann nach den Eltern eines Körpers im JSON. So können wir mit unserem Körper als Objekt arbeiten und das ist extrem einfach. der nächsten Zeile machen wir genau das Gleiche aber für URL-codierte Strings. Und dann bekommen wir auch unseren Körper. Mit dieser Konfiguration in jedem Projekt können Sie also normal mit der API arbeiten, können Sie also normal mit der API arbeiten bei der Sie Körper als angrenzend haben. Und genau das machen wir hier. Wir lesen den Text von Anfrage. Jetzt möchte ich hier unseren neuen Benutzer protokollieren , damit wir überprüfen können, wie es aussieht. Und danach möchte ich versuchen, den Benutzer zu retten. Also hier können wir versuchen , den Benutzer zu speichern, und hier können wir ein Gewicht in Ihrem Benutzerpunkt speichern. Diese einzelne Zeile wird Frankreich einen neuen Benutzer in der Datenbank schaffen . diesem Grund möchte ich hier gespeicherten Benutzer, Koma, gespeicherten Benutzer in der Konsole protokollieren . Jetzt möchte ich ein solches Tool namens Postman verwenden, um eine Anfrage zu stellen. Und wenn Sie keinen Postboten auf Ihrem Computer haben, können Sie einfach zu Postman springen. Laden Sie es nicht hier. Es ist völlig kostenlos. Es hat kostenpflichtige Stufen, aber wir brauchen sie nicht für unseren Kurs. Hier sieht es aus wie. Und was wir eigentlich tun wollen, wollen wir eine Post-Anfrage an unsere URL stellen. Und hier haben wir unseren lokalen Host für 1001 Slash-Slash-Benutzer. Jetzt müssen wir hier zum Körper springen und hier falsch wählen. Und rechts können wir sagen, dass dies angrenzend ist. Was wir nun übergeben wollen, ist ein Objekt mit drei Feldern. Zunächst einmal haben wir hier E-Mail, zum Beispiel foo at gmail.com. Dann haben wir unser Benutzername-Feld, zum Beispiel foo, und wir haben unser Passwortfeld, zum Beispiel 123. Jetzt senden wir eine Anfrage und prüfen, ob sie funktioniert. Wie Sie sehen können, hängt die Anfrage. Und das ist völlig normal, weil eigentlich hier aber nicht zum Beispiel Jason genannt wurde. Deshalb ist es eine Handfeuerwaffe. Aber jetzt können wir in die Konsole springen und das ist unsere Ausgabe. Zuallererst können wir hier unseren neuen Benutzer sehen. Dies ist vor dem Speichern. Das ist also das, was wir nach Colin haben, ein neues Benutzermodell, was eigentlich bedeutet, dass wir in diese drei Felder werfen und Benutzer von einer Goose bekommen. Und wie Sie sehen können, besteht der Hauptunterschied unseres Objekts darin, dass wir hier NAD haben , ein MongoDB AD, und es wurde automatisch schnell generiert. Und danach können wir diesen neuen Benutzer verwenden und ihn beispielsweise mit der Punktspeichermethode in der Datenbank speichern, was extrem einfach ist. Und der wichtigste Teil ist hier gespeicherter Benutzer. Dies ist unser gespeicherter Benutzer , der aus der Datenbank stammt. Woran wir erkennen können, dass es bereits gespeichert ist. Zunächst sehen wir hier unser Passwort und eigentlich unser Passwort hier. Wir haben 123 gegeben, aber hier haben wir es nicht wie 123 gespeichert. Es ist ein gehashtes Passwort. Warum passiert es? Denn eigentlich definieren wir das Modell und hier haben wir eine Methode drücken Save. Und nur um Sie daran zu erinnern, wir hier einen Hash aus unserem Passwort generiert haben und diesen Hash mit der Krypta anstelle des Passworts speichern. Und das ist ein extrem wichtiges Muster. Wir wollen hier keine Logik bezüglich der Änderung des Passworts für den Hash schreiben . Es ergibt keinen Sinn, weil wir ein Modell mit einer gewissen Logik definieren wollen. Und dann passiert es auf magische Weise , weil es definiert ist. In diesem Fall speichern wir hier, wir haben nur unser Passwort und Hash geändert und innerhalb unseres Controllers wissen wir nichts darüber. Die gleichen Ziele in Bezug auf diese Felder wurden um erstellt und aktualisiert um. Diese beiden Felder wurden für uns hinzugefügt, da wir hier timestamps true definiert haben. Unser Benutzer wurde also erfolgreich in MongoDB gespeichert. Aber eigentlich können wir den gespeicherten Benutzer nicht einfach als Antwort werfen. Ist das zuallererst, wir brauchen nicht alle Felder und natürlich sollten wir dieses Passwort niemals draußen geben. Und eigentlich nur um Sie hier daran zu erinnern, innerhalb unseres Modellbenutzers gesagt wurde, dass das Passwort nicht ausgewählt ist, sondern falsch ausgewählt ist. Aber tatsächlich, nachdem wir den Benutzer hier gespeichert haben, wird dieses Passwort schnell zurückgegeben. Und wenn es uns gut geht, bekommen wir das Passwortfeld nicht. Aber nach dem Speichern wird der Benutzer es offensichtlich bekommen. Deshalb müssen wir eine nette Antwort finden, die unseren Bedürfnissen entspricht. Deshalb möchte ich hier eine zusätzliche Funktion erstellen , den Benutzer normalisieren. Und hier bekommen wir Benutzer und wir wissen, dass dies ein Benutzerdokument ist. Und wie Sie in unserem Benutzerdokument sehen können, können wir Eingaben von Typen benutzeroberfläche. Nur um Sie daran zu erinnern, ein Dokument zu verwenden, ist genau wie ein Benutzerobjekt mit ID und validierter Kennwortmethode. Und wie Sie hier sehen können, können wir neuen Benutzer untersuchen und sehen, dass dies ein Dokument und die Eigenschaft verwendet, genau das übergeben wir hier und hier in dieser Funktion, wir wollen den normalisierten für API-Benutzer zurückgeben. Also zuerst, hier werden wir eine E-Mail haben, das ist User Dot E-Mail. Dann wollen wir unseren Nutzernamen. Es wird ein Benutzername verwendet, und der letzte ist 80, es ist die Benutzerpunkt-ID. Und nur um Sie daran zu erinnern, in MongoDB oder Ladies werden mit Unterstrich-ID gespeichert. Aber tatsächlich können wir sie hier in Mongoose auf beide Arten verwenden, wie Unterstrich-ID und wie Punkt AD. Diese Methode existiert bereits und sie ist einfach als Referenz Unterstrich id. Also werde ich die Verwendung einer Funktion normalisieren komplett fertig ist und jetzt können wir hier eat aufrufen, wenn wir mit diesem gespeicherten Benutzer antworten. Also kann ich hier einfach als Sand schreiben und drinnen passieren wir normalisierten Benutzer und hier ist unser gespeicherter Benutzer. Prüfen wir, ob es funktioniert. Wir haben hier im Webserver keine Fehler. Ich werde hier Postman öffnen und erneut auf Senden klicken. Und wie Sie sehen können, ist unser Benutzer erfolgreich normalisiert und wir sind nicht hier angekommen, zum Beispiel Passwort zurück, was extrem wichtig ist. Aber hier ist etwas, das mir an unseren Antworten nicht gefällt. Tatsächlich haben wir einige Validierungen innerhalb eines Modells durchgeführt. Aber wenn ich hier den Benutzernamen entferne und auf Senden klicke, bekommen wir hier 500. Und das ist eigentlich eine HTML-Seite mit einiger Validierung hier. Das ist nicht das, was wir wollen, was wir hier tun können, wir können die Skizze verwenden und Botschaften aus unserer Zeit lesen. Das Hauptproblem ist jedoch, dass unser Fehler nicht immer ein Validierungsfehler ist. Es können zum Beispiel 500 sein, aber wir können auch Validierungsfehler bekommen. Und der richtigste Weg, es in TypeScript zu überprüfen , ist so, wo genau hier, wo Azure eine Instanz des Azure DOD-Validierungsfehlers ist . Aber hier ist es wichtig , den Fehler korrekt einzugeben da wir diesen Fehler von Mongoose importieren wollen. Also hier gebe ich unsere Ära von Mongoose ein. In diesem Fall wird es korrekt behandelt, da dieser Validierungsfehler in dieser Ära tatsächlich eine Klasse von Mungo ist. Und wenn wir irgendwelche Validierungsfehler von Mongoose haben, können wir hier mit ihnen arbeiten. Jetzt versuchen wir es einfach innerhalb Konsolenprotokolls und schauen uns an, was wir hier bekommen. Ich werde erneut auf Senden klicken. Und wie Sie in der Konsole sehen können, bekommen wir hier Fehler. Und das ist ein Objekt. Was bedeutet, dass wir Nachrichten aus dem Betreff lesen und auf dem Bildschirm anzeigen können . Hier möchte ich eine Immobiliennachricht erstellen. Und hier können wir Objektpunktwerte schreiben, die Werte aus unserem Objekt ablesen. Und im Inneren werfen wir Fehlerfehler. Das ist genau das, was wir von Mungo bekommen und wir wollen jedes einzelne Feld durchgehen. Und hier bekommen wir einen Fehler und wir brauchen nur eine Fehlermeldung. Das wird also ein Array von Strings sein. Jetzt können wir einfach den Status des Rückgaberisikos schreiben, zum Beispiel vier bis zwei, was bedeutet, dass die Einheit nicht verarbeitet werden kann. Und hier Punkt JSON-Nachrichten, was eigentlich bedeutet, dass hier, wenn wir irgendwelche Validierungsnachrichten erhalten mit diesem Status geantwortet und wir diese Fehlermeldungen anzeigen, wir haben keine irgendwelche Fehler in der Konsole. Also lass es uns noch einmal versuchen. Ich schlage hier Sand und wir bekommen eine nette Fehlermeldung. Dabei ist ein Benutzername erforderlich , da wir hier zum Beispiel in den Käfig der Klasse eingecheckt haben, unsere Nachrichten hier normalisiert und mit ihnen geantwortet haben. Und tatsächlich ist es sehr sinnvoll, diese Funktion später auf einen Helfer zu verschieben , da wir immer wieder genau das Gleiche tun werden , wo wir eine Validierung haben. Und hier ist der letzte Schritt, den wir machen wollen. Wir müssen unseren Kunden tatsächlich ein Token bereitstellen, was bedeutet, dass wir, wenn unser Benutzer Logger Tin ist, ein eindeutiges Token generieren, um eine DVT-Authentifizierung durchzuführen. Was heißt das? Wir haben einen speziellen String-Token, der auf den Client geworfen wurde. Und dann kann der Kunde dies als t an den Header anhängen. Und später werden wir prüfen, ob die Anfrage authentifiziert ist und der Diffusor einige Änderungen vornehmen darf. Aber in diesem Video müssen wir einfach in unsere Antwort werfen, den GBT-Token, den wir generieren werden. Und dafür müssen wir ein zusätzliches Paket installieren. Hier werde ich npm install JSON-Web-Token schreiben. Und es ist nicht nur, es wird auch tippen wollen. Also hier wird bei Typen Slash JSON-Web-Token sein. Also haben wir zwei Pakete installiert und dann meinen Webserver neu gestartet. Jetzt lasst uns wieder einsteigen. Hier wollen wir jetzt unser JSON Web Token oder einfach nur DVT importieren . Versuchen wir es hier in der Produktivität von JSON-Web-Token. Und jetzt, was wir hier innerhalb von normalisieren wollen, und das ist der beste Ort dafür, denn hier haben wir den gesamten Benutzer und wir bauen etwas, das nicht mit der Datenbank zusammenhängt. Also wollen wir hier unser Ziel generieren. Und dafür sind wir nur Colin, GBT-Punkte signieren das Innere. Wir müssen eine Nutzlast und einen geheimen Schlüssel bereitstellen. Was zeigen wir Insight Payload hier? Zunächst möchten wir eine AD erhalten und dies ist eine Benutzerpunkt-ID und dann eine E-Mail. Es ist user.email. Eigentlich reicht es für uns, nur eine ID anzugeben , damit wir sie später anhand eines Ausweises verwenden können. Aber E-Mail ist auch schön für eine Bestätigung und ein Verständnis mit Susan und was hier geheim ist. Es ist nur eine zufällige Zeichenfolge, die uns hilft, Tokens zu dekodieren und dann aufzurufen. Was wir also eigentlich tun wollen, wollen hier in diesen Diensten eine neue Datei erstellen. Beispiel: config dot ds. Hier speichern wir alle benötigten Eigenschaften wie zum Beispiel geheim. Also hier möchte ich nur unser geheimes Eigentum exportieren, const, und sie werden es Secrets nennen, offensichtlich aus Produktionsgründen möchten Sie hier etwas Sicheres haben. Vielleicht sind ein langer Hash wie 12 Symbole. Jetzt können wir das Geheimnis hier nutzen indem wir einfach unser Geheimnis für John umkehren. Und hier haben wir unsere Konfigurationsdatei. Jetzt schreibe ich statt dieses geheimen oder privaten Schlüssels einfach ein Geheimnis. Was diese Zeile also macht, sie generiert ein Token , das nur eine Zeichenfolge ist. Und jetzt müssen wir hier zu unserer Antwort dieses Token hinzufügen. Prüfen wir, ob es funktioniert, aber keine Fehler haben. Lass uns reinspringen. Postbote, klicken Sie auf Senden. Wie Sie hier sehen können, muss ich meinen Benutzernamen angeben. Schauen wir uns das zum Beispiel an. Hier bekommen wir alle unsere Bereiche und reden auch. Und wie Sie sehen können, ist unser Token nur eine einzigartige Zeichenfolge , die wir an alle Ihre Anfragen an den Client anhängen an alle Ihre Anfragen und im Backend wieder dekodieren, was wir in unseren nächsten Videos tun werden. Deshalb haben wir unsere Registrierungsmethode auch mit Validierung und Normalisierung für unsere API erfolgreich implementiert unsere Registrierungsmethode auch . 11. Implementierung von Anmeldung: In früheren Videos, aber unsere Registermethode in diesem Video vollständig implementiert, wollen wir den Anfang unseres Benutzers implementieren, aber eigentlich möchte ich, dass Sie versuchen, es selbst zu tun, weil es so sein wird super ähnlich wie Registrierung und wir sind schon alles vorbereitet. Also was brauchst du, um einen Zeh zu machen? Zuallererst, insights server.js, Sie möchten eine neue Route erstellen. Und eigentlich haben wir hier schon unsere Route zur Registrierung. Jetzt müssen wir eine für die Anmeldung erstellen. Zum Beispiel können wir einen String Slash API Slash Benutzer Slash-Anmeldung erstellen . Jetzt muss hier in einer solchen steuerbaren neue Methode Login erstellt werden. Die Frage ist offensichtlich, was wir dort erreichen werden und was diese Methode leisten muss. Und tatsächlich Postman einfügen, wir können einfach versuchen, es zu benutzen. Also hier haben Sie Slash-Login und anstelle von E-Mail, Benutzername, Passwort werfen wir einfach auf unsere Anfrage E-Mail und Passwort. Wir haben keinen Benutzernamen, da dies ein Login ist und die E-Mail-Adresse eindeutig ist. Und hier haben Sie zwei mögliche Abweichungen, wie Sie sie implementieren können. Die erste Variante ist einfacher. Sie möchten einfach eine E-Mail aus dem Text lesen. Sie möchten versuchen, den Benutzer in der Datenbank zu finden und diesen Benutzer zurückzugeben. Und vergessen Sie nicht, normalisierte Benutzer zu verwenden , weil wir dieses Gespräch brauchen. Und wenn Sie einen schwierigeren Ansatz wünschen, können Sie auch versuchen, nicht nur E-Mails, sondern auch das Passwort für diese Validierungsmethode in unserem Modell zu validieren. Aber selbst wenn Sie versuchen, den ersten Schritt alleine zu machen, ist das völlig in Ordnung. Wenn Sie eine davon implementieren möchten, halten Sie das Video jetzt einfach an, und jetzt machen wir es gemeinsam. Unser erster Schritt wird also sein, in unsere Schwesternschaften zu springen. Hier wollen wir eine neue Route erstellen. Also haben wir hier einen Beitrag weil dies eine Post-Anfrage ist, die Guinean folgt. Und hier haben wir den CPI-Slash-Benutzer Slash-Login. Und hier ist die Dot-Login-Methode für den Controller unserer Benutzer, die wir in einer Sekunde erstellen werden. Jetzt werde ich in den Speicher-Controller-Benutzer springen und sie werden nichts kopieren und einfügen, weil wir versuchen wollen , es von Grund auf neu zu schreiben. Hier haben wir also unsere Anmeldemethode und wir wissen, dass dies eine asynchrone Methode ist , bei der wir unsere Anfrage erhalten, die genau wie oben in der Registrierung angegeben ist . Zweitens haben wir hier unsere Antwort, die Typantwort ist. Die letzte ist die nächste, das ist die nächste Funktion. Und jetzt wollen wir hier in unserer Funktion schreiben, versuchen und fangen. In den Käfigen hier werden wir also unsere Ära bekommen und sie wollen sie nur in die nächste Ära propagieren. Warum ist das so? Denn eigentlich haben wir hier keine Validierungsregeln, aber wir werden nur die Validierung in unserem Versuch überprüfen und nicht innerhalb von catch. Was müssen wir drinnen machen? Hier erhalten wir unseren Anfragetext mit E-Mail und Passwort. Und unser erster Schritt ist der Versuch, diesen Benutzer in die Datenbank aufzunehmen. Hier können wir ein K schreiben Wir brauchen unseren Benutzer und versuchen es erneut mit einem Gewicht Benutzermodell zu finden. Und wie Sie hier sehen können, haben wir einen Ausweis finden, finden und finden. Verwendung von model.fit find versucht also , alle Dokumente durch ein Prädikat als Array zu finden. Hier finden wir zum Beispiel eine Liste nach dem aktiven Feld. Hier, finde einen. Wir machen dasselbe, aber gut, nur eine einzige Platte. Das wollen wir verwenden und manchmal müssen wir ein Element anhand der ID finden. Hier haben wir eine nette Geldstrafe nach der Methode. Und wie Sie hier sehen können, haben wir auch viele andere Methoden, wie zum Beispiel eine finden und löschen und aktualisieren und so weiter. Aber jetzt werden wir find one verwenden und dann sagen Wir müssen ein Prädikat als Objekt angeben. Und hier haben wir unsere E-Mail und dies ist eine E-Mail mit dem Anforderungstext. Tatsächlich wird dieser Single-Liner versuchen, durch diese E-Mail unseren Datensatz in der Sammlung des Benutzers zu finden . Hier können Sie sehen, wo Sie das Benutzerdokument erhalten. Aber eigentlich stimmt das nicht, weil wir jetzt hierher kommen können und kein Dokument weil das Weibchen vielleicht nicht existiert. Das ist so hier. Ich möchte überprüfen, ob wir keinen Benutzer bekommen, dann wollen wir einen Fehler auslösen. Und dafür können wir einfach unseren Antwortpunktstatus zurückgeben . Hier haben wir ein Foto zum Status wie zuvor. Und hier wollen wir etwas JSON zurückwerfen. Und eigentlich haben wir hier keine anderen Validierungen. In jedem Fall werfen wir einfach einen ungültigen Login oder ein ungültiges Passwort. Das ist ganz oben. Ich kann unsere Fehler erstellen und in dem Objekt speichern. Also hier möchte ich Fehler erstellen. Dies ist zum Beispiel ein Objekt mit Feld, E-Mail oder Passwort. Und hier ist der Wert falsche E-Mail oder Passwort. Der Hauptpunkt ist also, dass wir genau die gleiche Struktur unserer Fehler haben, genau wie an allen anderen Orten. Hier geben wir nur unsere Fehler innerhalb von JSON zurück. Wenn wir keinen Benutzer haben. Danach können wir mit unseren Benutzern antworten. Also hier ist Sand und hier können wir unseren normalisierten Benutzer anrufen und wurden Benutzer einfügen, den wir gefunden haben. Und wenn Sie diesen Code auch ohne diesen Fehler geschrieben haben , überprüfen Sie Ihr Golden, weil Sie versucht haben, selbst etwas zu tun. Prüfen wir nun, ob dieser Code funktioniert. Wir haben also keine Fehler hier im Webserver. Öffnen wir unseren Postboten und klicken auf Senden. Und wie Sie hier sehen können, funktioniert es tatsächlich schon. Hier ist unser Slash-API-Slash-Benutzer Slash-Login. Dies ist eine Post-Anfrage mit unseren beiden Feldern. Hier holen wir Bank den richtigen Benutzer mit dem Tonkin. Und tatsächlich, wenn hier unsere E-Mail nicht existiert, versteckt gesendet und wir bekommen ein Objekt mit E-Mail und Passwort, falscher E-Mail oder Passwort, was tatsächlich bedeutet, dass wir erfolgreich implementierte unsere Lunge Kenianer des Benutzers. Aber hier fehlt uns nur eine Kleinigkeit, und diese ist für das Passwort validiert , aber das ist extrem einfach zu bedienen Nur weil wir bereits alles in unserem Modell vorbereitet haben. Und nur um Sie in unserem Benutzermodell unten daran zu erinnern , dass wir diese Methode zur Kennwortvalidierung haben und wir verwenden hier be crypt compare, wo wir das Passwort von vergleichen der Benutzer mit einer Zeichenfolge. Das ist genau das, was wir hier tun wollen. Wir können einfach eine Variable mit demselben Passwort erstellen. Hier wollen wir user dot validate password aufrufen. Und wie Sie sehen können, haben wir hier unsere automatische Vervollständigung des TypeScripts. Und tatsächlich bekommen wir diese automatische Vervollständigung nur weil wir in unserem Benutzeroberflächendokument diese Zeile geschrieben haben. Wenn Sie diese Zeile hier nicht geschrieben haben, erhalten Sie diese automatische Vervollständigung nicht. Hier haben wir also unser validiertes Passwort und im Inneren möchten wir eine Zeichenfolge angeben, um zu überprüfen, ob es korrekt ist. Und das ist das Anforderungstextpasswort. Und tatsächlich, wenn diese Passwörter gleich sind, dann werden wir hier Boolean bekommen. Aber wie Sie sehen können, bekommen wir eine Zeichenfolge, was bedeutet, dass etwas nicht stimmt. Schauen wir uns unsere Oberfläche an. Validate password gibt eine Zeichenfolge zurück, sie ist falsch, sie sollte hier boolescher Wert sein. Jetzt gibt dasselbe Passwort einen falschen booleschen Wert zurück. Und hier können wir eine Bedingung schreiben. Wenn zum Beispiel nichts dasselbe Passwort ist, wollen wir genau den gleichen Fehler auslösen. Also werde ich hier einfügen. seit dem Status wir uns das an, seit dem Status der beiden JSON-Fehler. Ich sitze hier und wir bekommen diesen netten Benutzer. Aber was passiert, wenn wir hier ein falsches Passwort werfen? Ich drücke hier senden und wir bekommen einen Fehler. Schauen wir uns also in die Konsole. Hier bekommen wir eine ziemlich seltsame Nachricht, illegales Argument, Zeichenfolge undefiniert. Und wie Sie hier in unserem Stack-Trace sehen können, kommt es von unserem Controller und hört standardmäßig von unserer Quellmodell-Ts-Linie. Also lasst uns in unser Modell Ts line 44 springen. Wie Sie sehen können, ist dies unser großer Kryptovergleich. Die Frage ist, was ist das Problem? Deshalb können wir hier das Passwort validieren schreiben. Und hier haben wir zunächst unser Passwort und dieses Passwort. Und eigentlich will ich das hier nur sehen, um zu wissen, dass wir auf der sicheren Seite sind. Unser Server wurde neu gestartet. Schauen wir uns den Sound an. Ich drücke endlosen Blick in die Konsole senden. Und wie Sie hier sehen können, desto feiner sehen wir zunächst das Passwort. Dies ist eine Zeichenfolge und hier ist unser Objekt. Aber wie Sie in diesem Betreff sehen können, mit Don't have password können wir mit Don't have password das Objekt nicht mit dem Passwort vergleichen Objekt nicht mit dem Passwort weil wir kein Passwort haben. Warum haben wir es nicht? Denn eigentlich haben wir hier oben für das Passwort gesagt, wähle falsch, was völlig richtig ist. In 99 Prozent der Fälle möchten wir kein Passwort wählen, da dies sicher ist. Aber in diesem speziellen Fall, bei dieser Anmeldemethode, können wir ohne Passwort nicht arbeiten, da wir unser Passwort des Benutzers vergleichen müssen. Deshalb müssen wir davon ausgehen, dass wir einen finden, was wir tun können . Also bekommt es auch ein Passwort. Und dafür können wir dot select schreiben. Hier ist eine Zeichenfolge in der wir schreiben plus Passwort. Und eigentlich ist das eine wirklich nette Notation weil wir hier plus Passwort, minus Biographie und so weiter verwenden können . Wenn wir bestimmte Felder entfernen oder hinzufügen möchten , erhalten wir in diesem Fall nur für diese spezielle Anfrage nur für diese spezielle Anfrage nicht nur den gesamten Benutzer, sondern auch das Passwortfeld. Und wenn wir es jetzt noch einmal versuchen, stoße ich auf Sand. Wir können nachsehen und die Konsole sagen. Und jetzt bekommen wir unseren Benutzer mit Passwort, das Hash ist, und dann haben wir keinen Fehler, aber es funktioniert nicht richtig, weil ich hier ein falsches Passwort habe und wir immer noch Benutzer bekommen, warum es passiert. Und wenn wir uns hier unsere Methode zur Kennwortvalidierung ansehen , verwenden wir hier Big Crypt Compare. Die Frage ist, was wir hier wieder reinbekommen, wir können in den Taipings sehen, dass wir Versprechen bekommen Boolean. Und das ist extrem wichtig. Dies ist eine asynchrone Operation. Sie ist nicht synchron. diese Weise müssen wir hier zurück in unsere Typen-Benutzeroberfläche springen . Und hier können wir sagen, dass wir den Boolean bekommen. Es ist eigentlich Ramis vom Boolean. Und jetzt ist es völlig richtig, denn jetzt, wenn wir in unseren Controller springen hier in unseren Controller springen, haben wir das Validate-Passwort verwendet. Wir sehen, dass wir das Versprechen Boolean zurückbekommen Jetzt ist dasselbe Passwort versprochen Boolean, was nicht das ist, was wir wollen. Hier können wir ein Gewicht schreiben und dies wird unser Versprechen lösen. Und hier bekommen wir unseren Boolean. Wie Sie sehen können, hilft uns TypeScript sehr dabei korrekte Eingaben zu verstehen. Und wir können immer überprüfen , welchen Typ wir haben. Hier. Wir bekommen das gleiche Passwort und jetzt sollte es funktionieren. Schauen wir uns das in Boltzmann an. Ich schlage auf Sand und wir bekommen eine Nachricht, E-Mail ein Passwort oder nicht korrekt. Hier mit dem richtigen Passwort, 123, erhalten wir unseren Benutzer zurück und dies ist genau die implementierte Login-Anfrage. 12. Erstellen von auth: In diesem Video möchte ich über Middlewares sprechen. Was ist Middleware? Wenn wir eine Anfrage vom Kunden an das Backend stellen, werfen wir diese Anfrage normalerweise eine Anfrage vom Kunden an das Backend stellen, einfach innerhalb unserer Route. Und dann innerhalb des Controllers, genau das haben wir hier in unserem Quellserver gemacht . Hier haben wir also zwei Post-Requests, Register und Login, und wir springen einfach in unseren Controller, was eigentlich bedeutet, dass wir hier Controller einfügen , Anfrage und Antwort erhalten. Middleware ist etwas, das aufgerufen werden kann , bevor wir hier ankommen, was eigentlich bedeutet, dass Middleware im Back-End angewendet wird , aber bevor unsere Anfrage ein Doppelpunkt in unserem ist Controller oder innerhalb unserer Route, Kohlberg, indem wir es überhaupt Middlewares machen. Wenn Sie etwas mit request machen müssen , bevor diese Anfrage in den Controller gelangt, benötigen Sie genau hier eine Middleware. Middleware, brauchen wir in unserem Projekt? Dies ist die Authentifizierungs-Middleware. Warum brauchen wir es? Stellen Sie sich vor, dass wir jedes Mal, wenn wir etwas mit Stratege at user machen müssen, sein Token überprüfen müssen, was in jeder einzelnen Methode bedeutet, wie zum Beispiel hier register, wir bekommen das Token des Benutzers. Wir müssen dieses Zeichen weitergeben. Wir müssen dieses Token validieren und wir müssen den aktuellen Benutzer mit diesem Token finden. Und es macht keinen Sinn , diesen Code in jede einzelne Controller-Aktion zu schreiben . diesem Grund müssen wir eine Middleware entwickeln , die wir überall wiederverwenden werden. Deshalb möchte ich hier in den Quellordner springen und hier einen neuen Ordner erstellen , der Middle heißt. Während wir hier alle unsere Middlewares lagern können. Und die erste Middleware , die wir erstellen müssen , ist owls dot ts. Und was ist eigentlich Middleware? Das ist nur eine Funktion. diesem Grund möchte ich hier die Standardfunktion und die synchrone Funktion exportieren . Und du fragst dich vielleicht, okay, aber warum ist es ein Synchron? Wir bekommen einfach hier unsere Anfrage und machen etwas damit. Denn eigentlich wollen wir hier auch mit der Datenbank arbeiten. Wenn wir ein Token haben, ist dieses Token gültig. Wir wollen eine Vorstellung des Benutzers aus diesem Token lesen und diesen Benutzer aus der Datenbank holen. So können wir diesen Benutzer verwenden, der später in unserem Controller vorbereitet wird . diesem Grund handelt es sich um eine asynchrone Funktion. Hier erhalten wir eine Antwort auf eine Anfrage. Und als nächstes, genau wie zuvor, geben wir hier unsere Anfrage ein, dann haben wir unsere Antwort. Die letzte hier ist unsere nächste Funktion, die nächste Funktion von R ausgedrückt wird. Und hier werde ich oben unsere Anfrage und Antwort umkehren . Und diese Funktion gibt nichts zurück. diesem Grund handelt es sich um eine Void-Funktion. Und innerhalb dieser Funktion wollen wir das Token aus unserer Anfrage lesen, aber ich werde nicht direkt unseren gesamten Code mit try catch umschließen. Warum ist das so? Weil wir versuchen werden, eine asynchrone Anfrage an unsere Datenbank zu stellen , die möglicherweise fehlschlägt. Deshalb ist es hier ein guter Ansatz, try-catch zu schreiben , wo wir unseren Pfeil und dann den Seitenfang bekommen . Wir wollen nur Risiken und Status eingehen und hier wird 401 sein. Du fragst dich vielleicht, okay, aber warum haben wir hier keinen Fehler angezeigt? Weil es uns eigentlich egal ist. Dies ist eine Middleware zur Überprüfung unserer Authentifizierung. Wenn wir aus irgendeinem Grund das Gespräch nicht analysieren und sprechen und zuhören können , ist dies gültig. Wir konnten diesen Benutzer auf keinen Fall finden, das bedeutet, dass unser Benutzer nicht angemeldet ist. Hier befinden wir uns direkt in unserem 401-Status. Jetzt müssen wir hier unseren Status lesen. Also hier möchte ich unseren Header erstellen und wir können unseren Header von Anforderungs-Punkt-Headern, Punkt-Autorisierung, erhalten . Eigentlich bedeutet das, dass wir unser Token in unserem Autorisierungsheader speichern . Und eigentlich ein typischer Ansatz, hoffe wir implementieren unsere Pflicht Autorisierung ist hier Autorisierungsschlüssel, das ist unser Header und der Wert hier wird Bearer Space Token sein. Also hier werden wir einen einzigartigen Stream haben. Deshalb müssen wir unser Token entsprechend aufteilen. Aber zuerst lesen wir hier unseren Header und es könnte sein, dass er nicht gesetzt ist. In diesem Fall können wir einfach für 01 sagen, das ist y hier. Wenn wir unseren Header nicht haben, können wir diese Zeile einfach kopieren und mit Pausen und Status für 01 einfügen. Danach müssen wir unser Token wirklich analysieren. Also hier werden wir uns unterhalten und das ist unser Header-Split, und das ist nur eine Zeichenfolge , die durch Leerzeichen geteilt wurde. Also bekommen wir ein Array mit zwei Elementen. Wie Sie hier sehen können. In der ersten Position werden wir besser sein. Und auf der zweiten Position wird es unsere Saite sein. Was wir bekommen wollen, hier nehme ich das zweite Element des Arrays und es wird unser Token sein. Aber wie Sie hier sehen können, erhalten wir die Nachricht vom TypeScript. Dieses Objekt ist möglicherweise undefiniert. Und deshalb mag ich TypeScript so sehr. Es hilft sehr bei der Entwicklung. Was ist das Problem? Eigentlich haben wir hier unsere IV und Kleidung und unseren Status, was eigentlich bedeutet, dass wir nicht hierher kommen werden. Aber TypeScript versteht, dass wir hierher kommen werden , weil wir es hier eigentlich nicht versucht haben, kehren Sie zurück. Und aus diesem Grund ist dieser Code ungültig, da in diesem Fall unser Header belastet oder undefiniert sein kann. Aber nach dieser korrekten Überprüfung mit return kann es sich nur um eine gültige Zeichenfolge handeln. Der nächste Schritt, den wir tun müssen, ist also die Überprüfung unseres Tokens. Durch die Verwendung von GBT möchte ich auf diese Weise DVT aus JSON Web Token importieren. Und nur um Sie daran zu erinnern, dies eine Bibliothek ist, mit der wir ein Token im Backend generiert haben, und jetzt müssen wir es validieren. Deshalb können wir hier einfach versuchen , dass wir einige Daten von unserem Token erhalten. Und hier wird GBT das Innere überprüfen. Nun Python, zuallererst ein Zeichen. Zweitens unser geheimer Schlüssel. Und nur um dich hier in unserer Konfiguration daran zu erinnern, dass wir unser Geheimnis haben. Deshalb werde ich es hier einfach geheim versuchen und es wird aus unserer Konfiguration heraus eingegeben. Und wir müssen keine zusätzlichen Optionen für das Hören bereitstellen. Aber wenn wir hier unseren Datenstamm oder das TVT-PE-Los überprüfen, aber tatsächlich wissen wir, dass dies nicht korrekt ist, beginnen wir nicht damit. Wenn wir hier in unseren Controller-Benutzern nachschauen , wir hier unser Token generiert und im Inneren haben wir ID und E-Mail, was eigentlich bedeutet, dass es hier gültig ist, um nach der Ableitung als zu sagen. Und hier können wir sagen, dass wir ein Objekt mit einer D-Zeichenfolge und auch unsere E-Mail, die eine Zeichenfolge ist, zurückbekommen einer D-Zeichenfolge und auch unsere E-Mail, die eine Zeichenfolge ist, die eine Zeichenfolge ist In diesem Fall erhalten wir jetzt in den Daten . In diesem Fall erhalten wir jetzt in den Daten die richtige Datenbank. Dies ist ein Objekt mit einer D- und D-Mail. Wir bekommen hier also die Idee des Benutzers und können jetzt versuchen, sie aus der Datenbank zu holen. Aber dafür müssen wir unser Modell verwenden. Das ist ganz oben. Wir können unser Benutzermodell aus unseren Modellen importieren. Hier können wir also wieder in den Schrägstrich unserer Modelle springen, und hier haben wir unseren Benutzer. Jetzt können wir nach unseren Daten eine Anfrage stellen, um einen Benutzer zurückzuholen. Und eigentlich verwenden wir hier ein Gewicht. Hier haben wir einen Modellpunkt verwendet. Und hier wollen wir den Benutzer von AD finden, und wir haben diese Funktion standardmäßig in Mungo. Und hier können wir anstelle eines div data dot AD schreiben, und dieser Benutzer wird da sein, oder es könnte jetzt sein, müssen wir es auch überprüfen. Wenn wir keinen Benutzer zurück haben, möchten wir auch sagen, dass der Benutzer nicht angemeldet ist. Aber wenn alles in Ordnung ist, dann wollen wir Inside Anfrage an unseren Benutzer stellen. Die Hauptidee ist also, dass diese Anfrage hier von uns aktualisiert wird. Und später, wenn wir das nächste Mal anrufen, wird diese Anfrage an unseren Controller weitergeleitet und dann haben wir direkten Zugriff auf diesen Benutzer. Das ist so hier, ich möchte Anfrage schreiben Benutzer ist gleich Benutzer. Und das ist dieser Benutzer, den wir aus der Datenbank bekommen haben. Und nach dieser Romanze rufen Sie einfach als nächstes an. Und diese Zeile besagt , dass wir mit unserer Middleware bereit sind und unsere Anfrage an unseren Controller weitergeleitet werden kann. Aber hier haben wir ein Problem, wie Sie hier sehen können, wo ich eine Fehlereigenschaft bekomme, die Benutzer auf Typanfrage nicht existiert und tatsächlich vollständig gültig ist. Diese Anfrage kommt von Express und innerhalb wird ausgedrückt, dass es keinen Feldbenutzer gibt. Was wir also hier tun können, der Ron Ansatz wird sein, hier irgendwas zu schreiben , und ich empfehle Ihnen dringend , keine in Ihren Projekten zu verwenden , da TypeScript Ihnen dann nicht wirklich helfen kann. Sie haben einfach Ihren Code mit Löchern aus einfachem JavaScript. Das ist y hier, Ras wie jeder andere, wird ein super schlechter Ansatz sein. Warum ist das so? Denn hier sagen wir einfach, dass uns egal ist, was mit Anfragen zu tun hat. Wir sagen einfach, es ist ein beliebiger Punkt-Benutzer und es funktioniert. Das ist der Anfänger-Ansatz. Wir schreiben keinen solchen Code. Hier. Anfrage Benutzer ist völlig in Ordnung, aber diese Anfrage sollte keine ausdrückliche Anfrage sein. Wir müssen es erweitern. Und tatsächlich können wir hier innerhalb von Typen einen neuen Typ erstellen und nennen wir ihn Express Request dot interface, dot ds. Jetzt kann ich im Inneren dieses neue Interface erstellen. Und nennen wir es Express Request Interface und eigentlich muss es erweitert werden. Also hier ist Anfrage verlängern. Und tatsächlich wird diese Bitte direkt von ausgedrückt kommen. Also hier oben kann ich eine Importanfrage von ausgedrückt schreiben . Was wir hier machen, eigentlich haben wir einfach eine Schnittstelle erstellt und wir haben alles, was wir innerhalb unserer Anfrage hatten, auf unsere Schnittstelle erweitert . Und jetzt können wir hier einfach sagen, dass wir ein Feld haben, den Benutzer, das möglicherweise nicht definiert ist, und dies ist unser Benutzerdokument. Hier könntest du eine Aufgabe stellen oder k, Aber warum kann der Benutzer undefiniert sein Aber warum kann der Benutzer undefiniert sein? Hier haben wir keinen Fall in dem der Insider-Request-Benutzer definiert ist und Sie völlig Recht haben, aber wir verwenden keine Middleware bei jeder einzelnen Anfrage. Manchmal haben wir keinen Benutzer in unserer Anfrage da nicht jede einzelne Anfrage autorisiert werden muss. Und jetzt können wir diese Express-Anforderungsoberfläche einfach kopieren diese Express-Anforderungsoberfläche einfach kopieren und unsere Middleware einstellen und sie hier anstelle von Anfrage ablegen. Also muss ich jetzt Express-Request-Middleware importieren. Wir verwenden keine Anfragen von Express mehr. Wir verwenden die reguläre erweiterte Version. Und jetzt haben wir keine Fehler mehr. Und was wir hier bekommen, ist vollständige Anfrage von Express plus unser Benutzerfeld. Und das ist genau der richtige Ansatz , um TypeScript zu verwenden. Deshalb haben wir erfolgreich unsere Middleware entwickelt. Jetzt müssen wir es benutzen. Und dafür möchte ich eine neue Route erstellen. Nun, wir werden den aktuellen Benutzer durch Gespräche erreichen. Also springen wir zurück und sagen Quellserver. Und hier haben wir zwei hintere Schienen hier. Jetzt möchte ich apt-get erstellen und wir haben hier einen Slash-API-Slash-Benutzer. Dies ist die Route, um den aktuellen Benutzer abzurufen. Jetzt danach mit Komma möchte ich Middleware ausschreiben. Und tatsächlich haben wir in dieser Datei nicht deklariert, was unsere Middleware ist. Also müssen wir hier unsere Middleware aus unseren Middlewares eingeben . Also hier haben wir Middlewares-Stunden. Und genau das werden wir tun. Wenn Sie so schreiben, wenden Sie diese Middleware bevor wir hier als Doppelpunkt Controller arbeiten. Und hier bekommen wir unseren Benutzercontroller dot, zum Beispiel die aktuelle Benutzeraktion, was eigentlich bedeutet, auf dieser Route diese Owls Middleware ausgeführt wird, wenn wir eine Benutzeranfrage wird in den Controller gehen, dann wo Champion hier ist. Und wie Sie mit Express sehen können, ist es ziemlich einfach zu lesen und zu verstehen. Jetzt möchte ich in den Benutzercontroller springen und diese neue Methode erstellen. Also lasst uns ganz unten unsere neue Funktion erstellen, unsere neue Funktion erstellen, die ein aktueller Benutzer sein wird. Und hier wissen wir , dass wir Anfrage und Antwort erhalten , aber wichtig, aber hier verwenden wir keine Anfragen von Express, unsere erweiterte Version. Also hier werde ich so schreiben , dass ich ein Express-Request-Interface bekomme . Und der nächste Parameter hier wird eine erhöhte Antwort sein. Es bleibt genauso wie zuvor. Und hier in unserer Funktion müssen wir eine gewisse Logik anwenden. Was wir hier tun wollen, tatsächlich innerhalb des aktuellen Benutzers, können wir diesen Benutzer direkt aus der Anfrage abrufen. Hier können wir Dress Dots sagen und den Benutzer normalisieren, genau wie wir es oben getan haben. Und hier werden wir diesen Benutzer anfragen. Und tatsächlich wird es hauptsächlich funktionieren , weil wir, was wir hier tun, unseren Benutzer aus der Anfrage verwenden, indem wir ihn in einen normalisierten Benutzer werfen. Und nur um Sie daran zu erinnern, wir haben den Benutzer hier oben normalisiert. Und das ist nur ein normales Benutzerdokument. Und wir generieren hier unsere Antwort und senden sie zurück. Aber eigentlich haben wir hier TypeScript. Was heißt das? Hier erhalten wir ein Fehlerargument vom Typ Benutzerdokument oder undefiniert. Er ist nicht befugt, ein Dokument zu verwenden. Und das ist völlig gültig, weil wir gesagt haben, dass in unserer Anfrage nicht immer einen Benutzer haben. Und tatsächlich ist der Punkt, dass diese Logik niemals passieren wird, weil wir in unserem Server hier diese Middleware rollen, was bedeutet, dass diese Haus-Middleware dies tun wird, wenn wir keinen Benutzer haben kehre für 01 zurück. TypeScript kümmert sich jedoch nicht um unsere Middleware, da es einfach unsere Funktion liest. Und wenn ich nur auf unsere Funktion ohne unsere Middleware schaue , dann ist unser Code dadurch ungültig, weil wir hier versuchen, undefiniert in einen normalisierten Benutzer zu werfen . Und um das für TypeScript zu handhaben, müssen wir es hier versuchen. Wenn wir keinen Benutzer haben, wollen wir 401 werfen. Also hier können wir return, res, send status und hier drinnen für 01 schreiben . In diesem Fall ist es für TypeScript vollständig gültig , da es hier in request user nicht undefiniert sein kann. Hat das hier überprüft? Und tatsächlich ist dieser Code viel besser, denn in diesem Fall haben wir hier diese einzelne Funktion und wir können vollständig isoliert testen, aber es ist uns egal in dieser Funktion, was wir draußen gemacht haben mit zusätzlichen Funktionen, Middleware über Terror mit einfacherem Hinweis, dass diese Funktion in jedem einzelnen Fall korrekt funktioniert, da wir hier alle Fälle behandelt haben, muss unsere Funktion korrekt implementiert sein. Prüfen wir, ob es funktioniert. Ich springe zum Server und wir haben einen Fehler. Schauen wir mal, was wir haben. Und tatsächlich können Sie hier sehen, dass es die Ära von TypeScript war und die letzte Kompilierung erfolgreich war. Wir haben den mit MongoDB verbundenen Observer gestartet und hier ist unsere API. Wir können also direkt zu Postman springen und versuchen, eine GET-Anfrage zu stellen. Aber in unserer Anfrage müssen wir ein Token bereitstellen. Das ist so hier. Ich werde Paste kopieren, um zu sprechen , weil wir es benutzen müssen. Und dafür erstelle ich hier GET-Anfrage. Und das ist Slash API Slash User. Ich schlage gerade her geschickt. Und wie Sie sehen können, kommen wir unautorisiert hierher. Warum ist das so? Weil die interne Autorisierung mit kein gültiges Token geliefert hat. Aber wenn statt dieser Saite, werde ich unser Gespräch so Birra als Raum einfügen. Und dann haben wir unsere Saite, ich drücke hier senden, und es hat auf magische Weise funktioniert. Und hier bekommen wir unseren normalen Benutzer mit dem Tonkin. Aber am wichtigsten ist , dass wir es nicht versucht haben. All diese Logik, die den aktuellen Benutzer in diese Methode bringt , ist in Middleware geschrieben. Und jetzt können wir unsere Middleware an jedem einzelnen Ort verwenden , an dem wir nach aktuellen Benutzern suchen möchten oder ob wir die aktuellen Benutzerinformationen in unserem Controller benötigen . 13. Erstellen von auth: In früheren Videos werden immer einige Anfragen von Pi für unseren registrierten Benutzer und den aktuellen Benutzer vorbereitet . Jetzt wäre es also nicht schön, etwas im Frontend zu implementieren. Deshalb möchte ich hier in unseren Kunden einsteigen. Und hier möchte ich mit unserem Benutzermodul beginnen. Und was wir in unserem Benutzermodul haben werden zwei Seiten, die sich anmelden und registrieren. Es reicht jedoch nicht aus, nur zwei Seiten für die Registrierung und Anmeldung in unserem Modul zu haben , wir benötigen auch einen Dienst, um mit dem aktuellen Benutzer zusammenzuarbeiten. Zum Beispiel müssen wir den Benutzer registrieren, Benutzer anmelden, den aktuellen Benutzer abrufen usw. In dieser Schleife benötigen wir auch eine Schnittstelle für unseren aktuellen Benutzer Darauf konzentrieren wir uns in diesem Video die Grundlagen unseres Authentifizierungsmoduls zu erstellen. Dafür möchte ich in unseren Quell-App-Ordner springen. Und hier möchte ich einen neuen Ordner erstellen. Hier wollen wir alles isolieren, was über Authentifizierung spricht , die Registrierung beginnt. Unser erster Schritt besteht darin , ein Modul zu erstellen. Und wenn Sie mit Angular nicht so vertraut sind, nur zwei Worte zu Modulen in Angular, innerhalb der anderen Frameworks wie zum Beispiel React, verwenden wir einfach Importe und Exporte, Bot Insight angular, wir haben viel mehr, wir haben Abhängigkeitsinjektionen, was bedeutet, dass die gesamte Anwendung in verschiedene Module aufgeteilt ist. In unserem Fall definieren wir beispielsweise das Modul „Hier und Jetzt“. Jetzt können wir verschiedene Dinge in diesem Modul erstellen und sie werden in diesem Modul isoliert. Und wir können definieren, was wir für die Verwendung im Freien verfügbar machen möchten. Und wenn wir nichts für die Verwendung im Freien verfügbar gemacht haben, können wir nicht einfach die Sachen aus diesem Modul verwenden. Und das ist wirklich ein netter Ansatz für riesige Anwendungen. Lassen Sie uns zunächst unser Modul erstellen. Dazu müssen wir unsere Klasse, unser Modul, exportieren. Zu Beginn dieser Klasse wollen wir nun einen NG-Modul-Decorator bereitstellen. Und drinnen werden wir verschiedene Dinge passieren, aber im Moment müssen wir hier noch nichts registrieren. Was ich jetzt machen möchte Ich möchte zurück in unser App-Modul springen, denn eigentlich müssen wir dieses Modul in unserem App-Modul registrieren . In einem anderen Fall ist dieses Modul nicht an unsere Anwendung gebunden, da wir nur ein Modul laden und alle untergeordneten Module auch darin laden müssen . Hier drinnen in den Vögeln können wir einfach unser Modul schreiben. Und mit dieser Zeile, wo man hier oben eine automatische Eingabe bekommt. Und jetzt sind wir sicher, dass unser Modul geladen ist. Unser nächster Schritt besteht darin, eine aktuelle Benutzeroberfläche zu erstellen. Und aus meiner Sicht es nichts mit dem Eulen-Modul zu tun. Also hier können wir einen neuen Ordnertyp erstellen und uns hier registrieren, aktuelle Benutzeroberfläche dot ts. Und innerhalb unseres Express-Projekts hatten wir keine Regeln für die Benennung von Dateien da wir dort gerade ausgedrückt hatten und alles , was wir schreiben, einfach mit unseren eigenen Richtlinien schreiben In sagen wir den Winkel, es wird dringend empfohlen, alle unsere Dateinamen zu benennen, Start und dann Postfix der Entität. Zum Beispiel haben wir hier das Punktmodul geschrieben, weil es ein angekündigtes Modul ist. In diesem Fall sind wir genau hier, dot interface, weil es eine Schnittstelle sein wird und genau das Gleiche gilt für Klassen. Hier schreiben wir keine Klassen-Eulen, sondern unser Modul. Und hier in CurrentUser sind wir genau hier, Experten-Oberfläche, und hier haben wir unsere aktuelle Benutzeroberfläche. Jetzt ist die Frage, was wir hineinbekommen werden? Und es ist leicht zu beantworten, dass wir nur in unseren Postboten schauen müssen. Hier kommen wir also zurück für unseren aktuellen Benutzer, unsere E-Mail-Adresse, unseren Benutzernamen, unsere ID und unser Token. Also können wir hier einfach schreiben , dass wir einen DStream bekommen. Wir haben unser Token, das ist string. Wir haben den Namen unseres Benutzers. Es ist auch eine Zeichenfolge, und die letzte ist unsere E-Mail. Und damit sind wir erfolgreich mit der Definition unserer aktuellen Benutzerentität für unseren Kunden. Und jetzt können wir an jedem einzelnen Ort, an dem wir über aktuelle Benutzer sprechen, diese Schnittstelle verwenden. Unser nächster Schritt besteht darin, eine Klasse zu erstellen, denn eigentlich, bevor wir mit der Erstellung von Komponenten für die Registrierung und Leukämie beginnen , müssen wir einen Dienst erstellen , der mit unserer API kommuniziert. Und der Service gehört mit Sicherheit in unser Modul. diesem Grund werde ich hier einen neuen Ordner erstellen, services, und ich möchte hier out dot services.js erstellen. Eigentlich ist es wirklich eine nette Benennung wenn Sie nicht wissen, wie Sie Ihren Service benennen sollen. Wenn Sie nur einige Methoden in Ihr Service-Inside-Modul packen möchten und nicht wirklich wissen, worum es bei Methods II geht. Sie können den Dienst einfach wie ein Modul benennen. In unserem Fall haben wir hier unser Modul und unseren Service. Aber wenn Sie irgendwann Service sind, wird es zu groß sein. Du kannst immer trennen. Es kann sich um den Anmeldedienst, die Registrierung, Dienst oder den aktuellen Benutzerdienst handeln, was auch immer Sie bevorzugen. Im Moment ist unser Service völlig in Ordnung. Hier möchte ich neue Unterrichtsstunden exportieren. Jetzt ist es sehr wichtig, nicht zu vergessen, auf das obere injizierbare zu schreiben. Wenn Sie möchten, probieren Sie diese einzelne Zeile aus. Es wird sehr schwierig sein, ein Problem zu debuggen. Ihre Eingaben werden funktionieren, aber Sie werden etwas Magie in der Konsole bekommen. Vergessen Sie deshalb niemals injizierbar, wenn es sich um Dienste handelt Jetzt müssen wir den Dienst innerhalb eines Moduls registrieren. Und genau das geht in Richtung von Abhängigkeitsinjektionen und Modulen innerhalb von Angular. Was wir also hier tun wollen, wir wollen ein neues Feld schaffen , das Anbieter genannt wird. Und hier ist es ein Array und wir schreiben in unserem, unserem Service. Das ist also genau der richtige Weg, um alle Dienste innerhalb unseres Moduls zu registrieren . Jetzt wollen wir hier unsere erste Methode erstellen und sie wird vom aktuellen Benutzer abgerufen. Nun, hier können wir einfach schreiben, dass wir erstellen wollen, aktuelle Benutzerfunktion abrufen und es wird schnell vom aktuellen Benutzer beobachtbar sein. Und an dieser Stelle könnten Sie Fragen haben, könnten Sie Fragen haben wenn Sie Angular nicht so tief kennen, und wenn Sie nicht wissen, wofür unsere Observables überhaupt und dieses Thin mit Generika hier verwirrend sein könnten Sie. Was ist also beobachtbar? Dies ist nur eine Darstellung des Streams. Was ist Stream? Das hat sich im Laufe der Zeit geändert, was bedeutet, dass wir den Stream abonnieren können. Und wenn die Änderung im Stream stattfindet, erhalten wir einen neuen Wert. Dann sag der Winkel, alles arbeitet an der Liebe mit Streams, wenn du keine Versprechungen benutzt. Das, was eigentlich Streams und Observables bedeutet, ist ein bestimmtes Muster, wie wir unseren Code schreiben werden. Also was wir hier sagen, dass wir ein Observable zurückbekommen. Und hier geben wir an welchen Datentyp wir zurückbekommen. Und in unserem Fall sagen wir hier, dass diese Funktion eine beobachtbare aktuelle Benutzeroberfläche vom Typ zurückgeben muss . aktuelle Benutzeroberfläche ist genau unser aktuelles Benutzerobjekt. Jetzt wollen wir einige Daten holen, und dafür haben wir in Angular HTTP. Deshalb schreibe ich hier Konstruktor und innerhalb des privaten, http ist gleich HTTP-Client. Also, was diese Zeile oben macht, diese Notation mit Konstruktor, dann private eine Variable entspricht einer Klasse ist, wie wir einige Abhängigkeiten innerhalb eines Dienstes injizieren. Und es ist völlig in Ordnung, wenn es für dich ein bisschen beängstigend ist , solchen Code zu sehen, wir werden in jedem einzelnen Video immer wieder genau den gleichen Code schreiben . Im Moment müssen Sie nur verstehen, dass wir HTTP hier in unserem Service verwenden müssen. Hier müssen wir diesen HTTP-Client injizieren. Und jetzt hier in unseren Methoden können wir diesen Punkt HTTP verwenden und dynamic ist hier wollen wir die GET-Methode verwenden , um unseren Benutzer zu bekommen. Also was ich jetzt machen möchte Ich möchte eine URL erstellen. Und eigentlich können wir hier einfach http localhost 4.001 slash api slash user einfügen , und wir werfen einfach hier unsere URL. Und jetzt müssen wir diese HTTP-GET-URL zurückgeben. Aber hier bekommen wir einen Fehler. Observable Observable ist dem Typ beobachtbare aktuelle Benutzeroberfläche nicht zuweisbar , warum passiert das? Weil sie tatsächlich HTTP GET standardmäßig beobachtbares Off-Objekt zurückgeben , weil unser HTTP GET Cantril und wissen welche Daten wir zurückbekommen, wenn nein, es ist nur uns selbst in unserer Anwendung, aber wir können das hier tun, wir müssen angeben, was wir zurückbekommen. Und in diesem Fall sagen wir hier, okay, dieses spezifische HTTP-GET von dieser URL wird eine falsche aktuelle Benutzeroberfläche zurückgeben falsche aktuelle Benutzeroberfläche und nicht nur ein zufälliges Objekt. diesem Grund wird in diesem Fall kein Fehler angezeigt, da diese einzelne Zeile schnell von der aktuellen Benutzeroberfläche beobachtbar ist . Und Sie müssen sich nur daran erinnern , dass all diese HTTP für uns immer beobachtbar von etwas zurückkehren wird. Das nächste, was wirklich schlimm ist, ist diese Zeile. Warum ist das so? Zunächst einmal, hier stützen wir uns direkt auf die Straße. Das ist ein super schlechter Ansatz. Warum ist das so? Weil diese Linie bei der Produktion kaputt gehen wird. Es ist nur für die Entwicklung geeignet. Und wir müssen in jeder einzelnen Methode immer wieder genau den gleichen Code schreiben , das ist schlecht. Dafür haben wir Umgebungsvariablen in Angular. Wir können zurück in die Quellumgebungen und hier in die Umgebung springen , ja, genau hier müssen wir alle unsere Konstanten basierend auf einer bestimmten Umgebung definieren . Was wir also hier tun müssen, wir können eine neue Eigenschaften-API-URL erstellen, und wir können unseren Stream einfach hier einfügen. Also lokaler Host für 1001 Slash-API. Und das ist völlig in Ordnung, denn hier in unserer Entwicklungsumgebung wo die API-URL festgelegt ist, wird auch hier die Umgebung für die Produktion haben. Und wir können dort verschiedene API-URLs definieren. Dies ist der richtigste Weg, dies zu tun. Jetzt können wir einfach hier die Umgebung verwenden, und wie Sie sehen können, erhalten wir eine äußere Eingabe-Punkt-API-URL plus. Und hier müssen wir einfach Slash-Benutzer verwenden und nichts weiter. In diesem Fall verwenden wir diese Umgebungs-URL wieder und sie ist vollständig innerhalb der Umgebungsvariablen isoliert, sodass unsere Dienste vollständig bereit sind. Aber was wir tun wollen, wir wollen diesen Benutzer jedes Mal bekommen , wenn wir unsere Winkelanwendung laden. Warum ist das so? Weil sie tatsächlich gestohlen wurden. Unser aktueller Benutzer ist normalerweise im Speicher und nach der Anmeldung oder Registrierung sprechen wir einfach innerhalb des lokalen Speichers. diesem Grund müssen wir jedes Mal, wenn wir in unsere Anwendung springen, wir in unsere Anwendung springen, den aktuellen Benutzer finden. Dafür möchte ich zurück in unsere App-Komponente springen. Und das ist genau die Komponente , die auf jede Seite geladen wird. Hier können wir implement auf init schreiben. Und wenn Sie nicht wissen, was nicht drin ist, ist dies eine spezielle Methode, die bei der Initialisierung unserer Komponente aufgerufen wird . Hier bin ich in der Technik richtig. Und dann sagten wir können unseren Service nutzen, aber um ihn nutzen zu können, müssen wir ihn hier injizieren. Und hier schreiben wir genau die gleichen Sachen wie wir sie in unserem Service geschrieben haben. Privat, nicht HTTP wie wir es im Service getan haben, sondern unser Service, den wir gerade erstellt haben. Und hier müssen wir unseren Service eingeben, der sich in unserem Modul befindet. Und jetzt können wir es hier direkt im Motor verwenden . Also das ist unser Service und wir haben hier die aktuelle Benutzermethode bekommen. Aber was ist am wichtigsten diese Renditen für uns und beobachtbar. Und normalerweise wollen wir etwas tun , um uns die Veränderungen des Beobachtbaren anzuhören. Deshalb werden wir hier versuchen, dot subscribe zu abonnieren. Und jetzt drinnen abonnieren wir werden einige Informationen bekommen. Also hier werde ich einfach Rads und Console Log Ras schreiben , damit wir überprüfen können, ob es funktioniert. Ich werde zum Browser springen und die Seite neu laden. Und nur um Sie daran zu erinnern, auch Ihr Client-Webserver gestartet sein muss. Hier bekommen wir einen Fehler. Http-Client-Dienst, kein Anbieter für den HTTP-Client. Was heißt das? Das bedeutet, dass wir den HTTP-Client in unserer Anwendung verwenden, aber kein Modul des HTTP-Clients in unsere Anwendung injiziert haben . diese Weise können Sie das Problem beheben. Wir müssen in ein Modul springen, und hier müssen wir das HTTP-Client-Modul importieren. In diesem Fall wird unser Fehler behoben. Laden wir die Seite neu. Wie Sie jetzt sehen können, funktioniert es, aber hier erhalten wir jetzt eine Fehlermeldung bezüglich der Cross-Origin-Anfrage. Und das ist eigentlich völlig richtig, weil wir unsere Express-Backend-Anwendung nicht richtig konfiguriert unsere Express-Backend-Anwendung nicht richtig haben, um mit Cross-Origin-Anfragen zu arbeiten. Deshalb können wir einfach wieder in unseren Server springen. Und hier Open Source Server Tiers, unser nächster Schritt wird die Installation eines zusätzlichen Pakets sein. Deshalb werde ich in unseren Server springen. Und genau hier ist npm install course and course das beliebteste Paket, um das Kursproblem mit der Express-Anwendung zu lösen . Ich werde einfach wieder hineinspringen oder Schwesternschaft S. Und hier kann ich auf den obersten Input-Kurs schreiben, Drum Corps. Und jetzt müssen wir hier nur noch vor unserem Body Parser eine Bank schreiben und wir bieten einen Einblickskurs als Funktion an. Wie du siehst, haben wir jetzt keine Fehler im Backend und wir können unsere Frontend-Seite neu laden. Wie Sie jetzt sehen können, haben Sie keine Diskursära und wir werden nur unbefugt. Schauen wir uns an, was wir im Netzwerk haben. Wir haben diese Anfrage für den Benutzer, und wenn ich sie ein bisschen kleiner mache, können wir sehen, was wir in den Antwort-Headern bekommen, und wir bekommen hier Zugriffskontrolle erlaubt Ursprungsstern. Und das ist eigentlich der Grund, warum es funktioniert. Unser Backend, setze es richtig ein. Diese ermöglichen den Zugriff auf den Ursprung. Aus diesem Grund erhalten wir keine Fehlermeldung vom Browser. Aber wie Sie hier sehen können, bekommen wir 401 nicht autorisiert. Und eigentlich ist das völlig normal. Wir sind in unserer Anwendung nicht angemeldet. Wir haben einfach den aktuellen Benutzer abgerufen und es ist ein Fehler aufgetreten. Das ist völlig in Ordnung. Was nicht in Ordnung ist, hat in keiner Weise auf diese autorisierte Anfrage reagiert . Was wir also tun können, wir können zurück in unsere App-Komponente springen , in der wir diesen Code geschrieben haben. Und wir können auch mit einem Fehler umgehen. Und dafür können wir in Subscribe schreiben, keine Funktion, sondern ein Objekt. Hier innerhalb des Objekts können wir zwei Felder haben. Zunächst einmal ist dies genau unser Erfolg. Und wie Sie hier sehen können, lasse ich diese Funktion so wie sie ist. Aber nach dem nächsten können wir einen Fehler erstellen. Und in diesem Fall passiert das, wenn wir einen Fehler haben. Also hier können wir einfach einen Konsolenprotokollfehler schreiben und vielleicht wollen wir die Sarah sehen, lass uns überprüfen, was wir bekommen. Ich lade die Seite neu und wir erhalten unseren Fehler, die HTTP-Fehlerantwort. Und hier haben wir Unbefugte und können auf diese Ära reagieren. Also was ich jetzt machen möchte, ich möchte die aktuelle Benutzerfunktion festlegen. Und eigentlich macht es nicht viel Sinn, weil wir kein Glück haben, aber wir müssen immer noch Informationen in unserer Anwendung speichern , dass der Benutzer nicht gesperrt ist. In diesem Fall kann die gesamte Anwendung, jede einzelne Komponente überprüfen, ob wir ab und zu eingesperrt sind, wir ab und zu eingesperrt sind weiß unsere Komponente, wie sie darauf reagieren soll. Deshalb müssen wir wieder in unseren Service einsteigen. Und hier möchte ich eine neue Methode erstellen set aktueller Benutzer. Hier drinnen bekommen wir den aktuellen Benutzer, was unsere aktuelle Benutzeroberfläche ist. Und es wird eine Lücke zurückgeben , weil wir tatsächlich nur die Daten im Inneren ändern und nichts zurückgeben. Und eigentlich ist es nicht ganz richtig. Hier ist die aktuelle Benutzeroberfläche oder null, wenn wir keinen aktuellen Benutzer haben. Denn eigentlich, wenn wir nicht in Poupon gesperrt sind, um den aktuellen Benutzer auf jetzt zu setzen. Die Frage ist nun, was wir reinkommen? In der Regel das, was Sie in vielen Anwendungen sehen werden. Die Leute definieren einfach eine lokale Eigenschaft innerhalb von Stunden, wie Benutzer. Und dann können Sie hier einfach schreiben Dieser Benutzer ist gleich Benutzer. Dies ist nicht der beste Ansatz mit Angular. Und im Angular ist es super komfortabel und effizient, mit Streams zu arbeiten , da es viel einfacher ist, auf Streams zu reagieren und sie zu kombinieren. diesem Grund müssen wir einen schwierigeren Ansatz verwenden, jedoch am besten für große Anwendungen geeignet ist. Es ist richtig. Hier möchte ich schreiben, dass wir hier ankommen, aktueller Benutzerstream. Hier. Ich möchte ein neues Verhalten als Thema erstellen, und es heißt Verhalten ein Thema. Ich sage, dass wir hier die aktuelle Benutzeroberfläche oder jetzt bekommen oder es nicht definiert haben. Und nach diesen runden Klammern, und hier sagen wir standardmäßig undefiniert. Also was ich hier überhaupt geschrieben habe und wie wir es verwenden werden. Was ist eigentlich ein Verhaltensthema? Dies ist nur eine Darstellung von Streams. Dies ist nur ein Stream , der einen Standardwert hat. In diesem Fall ist unser Standardwert undefiniert, und wir können innerhalb des Streams auch Typen wie aktuelle Benutzeroberfläche jetzt oder undefiniert festlegen . Und jetzt können wir innerhalb des aktuellen Benutzers den Stream ändern. Wir können hier diesen Punkt aktuellen Benutzer schreiben. Und um den Stream zu ändern, verwenden wir dot next und bieten Ihnen einen Mehrwert. In diesem Fall stellen wir hier den aktuellen Benutzer zur Verfügung und er ist vollständig gültig, da die aktuelle Benutzeroberfläche ein gültiger Typ ist. Der Hauptpunkt ist hier, dass viele Komponenten in unserer Anwendung diesen aktuellen Benutzerstream abonnieren können , und es werden automatische Plünderer sein in diesem Moment hier beendet wurden, als wir ändern den Wert innerhalb des aktuellen Benutzerstreams. Und keine Sorge, wenn Sie es nicht vollständig verstehen, werden Sie in späteren Vorlesungen sehen, wie wir es verwenden. Also haben wir erfolgreich unseren aktuellen Benutzer erstellt. Jetzt können wir hier in unserer App-Komponente, zumindest irrtümlich, etwas tun. Wir können unseren aktuellen Benutzer auf zwei setzen. Nun, hier werde ich diesen Punkt unseren Service dot set aktuellen Benutzer schreiben . Und hier drinnen werde ich es jetzt tun. Was passiert hier auf Initialize unserer Anwendung, wir bekommen hier aktuellen Benutzer. Wenn wir den aktuellen Benutzer nicht erhalten haben, setzen wir ihn auf null. Und jetzt willst du mich sicher fragen, warum ich jetzt hier geschrieben habe und definiere es und aktuellen Benutzer, es macht Sinn, hier den aktuellen Benutzer und jetzt einzustellen, aber nicht undefiniert. Außerdem haben sie es mit dem Zweck gemacht, weil wir eigentlich mit drei verschiedenen Zuständen umgehen müssen. Zunächst einmal haben wir es standardmäßig nicht definiert, was für uns tatsächlich bedeutet, wir den aktuellen Benutzer noch nicht abgerufen haben. Es ist nicht bereit, wenn wir jetzt hier sitzen, es bedeutet, dass wir den aktuellen Benutzer abgerufen haben, aber es war erfolglos. Wir sind nicht eingesperrt. Also jetzt bedeutet hier, dass wir nicht eingesperrt sind. Und die aktuelle Benutzeroberfläche bedeutet offensichtlich, dass wir eingesperrt sind. So haben wir erfolgreich unser Modul, unseren Service, die aktuelle Benutzeroberfläche und einige grundlegende Funktionen erstellt , die wir in den nächsten Vorlesungen benötigen werden. 14. Register – Markup + Formular: Im vorherigen Video haben wir viele Mitarbeiter für den aktuellen Benutzer vorbereitet . In diesem Video möchte ich mich auf die Erstellung unserer Registrierungsseite konzentrieren , da der Kuchen für die Registrierung bereits implementiert ist. Und dafür müssen wir zunächst eine neue Komponente erstellen. Deshalb bin ich hier in App Stunden hier müssen wir einen neuen Ordner erstellen , der Komponenten genannt wird. Die erste Komponente, die wir implementieren können, ist die Registrierung. Und hier ist ein wichtiges Wort. Eigentlich werden wir später zwei Komponenten implementieren , Registrierung und Anmeldung. Die Unterschiede zwischen diesen beiden Komponenten sind nicht so signifikant. Wir haben in Registrierung, zusätzliches Feld, Benutzername und Anmeldung mit, dieses Feld nicht. Dann haben wir anders Der Reifengummi. Das ist es. Alles. Andere Sachen bleiben gleich. diesem Grund haben wir zwei Möglichkeiten. Wir könnten eine einzelne Komponente erstellen und diese einfach zwischen Anmeldung und Registrierung verwalten. Oder wir können zwei verschiedene Komponenten erstellen. Ich bevorzuge es, zwei verschiedene Komponenten zu erstellen nur weil es später einfacher zu warten ist, auch wenn wir den Code ein wenig duplizieren. Also hier erstellen wir einen neuen Ordner und nennen ihn Register. Jetzt müssen wir in diesem Ordner seine Datei erstellen, eine HTML-Datei. Und hier werden wir die Punktkomponente dot ts und auch Punktkomponente dot HTML registriert haben. Jetzt müssen wir in unserer Komponente unsere neue Klassenregisterkomponente testen und dann sagen, dass wir diese Komponente zuerst einen Selektor bereitstellen müssen . Hier haben Sie eine wichtige Entscheidung. Sie können alle Ihre Selektoren benennen beginnend mit dem Namen Ihrer Anwendung. Sie erstellen beispielsweise ein Präfix , das innerhalb der Anwendung gültig ist. In unserem Fall können wir es zum Beispiel L Trello oder einfach L nennen. Und dann haben Sie einen Unterschied zwischen allen Bibliotheken, die Sie verwenden und Komponenten aus unserem Projekt. Denn wenn wir innerhalb des HTML springen, haben wir hier ein L-Register, dann wissen wir, dass dies Bestandteil unseres Projekts ist. Wenn Sie hier zum Beispiel das Präfix leer und dann eine Schaltfläche haben , verstehen Sie das k. Dies ist eine Materialbibliothek und es ist nicht unser Projekt. Dies ist der erste Ansatz , der möglich ist. Ich bevorzuge einen anderen Ansatz, bei dem ich jede einzelne Komponente innerhalb des Moduls voranstelle , was bedeutet, dass wir uns jetzt in unserem Modul befinden. Hier wird der Selektor dort draußen registriert sein. Es ist viel einfacher, weil wir keine Bibliotheken verwenden. Und in diesem Fall können wir sehen, von welchem Modul wir diese Komponente erhalten. Das nächste, was wir in unserer Komponente angeben müssen , ist unsere Vorlagen-URL. Und das ist die URL für unsere Register-Komponente HTML. Jetzt sollten wir nicht vergessen, unsere Komponenten in unserem Modul zu registrieren . Hier springen wir in unser Modul Ts und erstellen hier eine Felddeklaration. Und im Inneren können wir jetzt Registerkomponente und Delta E schreiben , die aus registrierten und registrierten Komponenten importiert wurden. Unsere Komponente ist also da. Jetzt können wir ein Markup für unsere Komponente in unsere Registerkomponente schreiben , ja, und tatsächlich habe ich hier den Buchstaben S im Wortregister verpasst . Lassen Sie uns nun einen Marker für unsere Registerseite verwenden. Und die erstklassige , die wir hier haben, ist div mit Klassen-Login-Seite. Und es mag für Sie verwirrend sein, aber das liegt nur daran, dass unsere Stile für die Anmeldeseite geschrieben wurden und es genau so ist wie bei der Registrierungsseite. Also hier haben wir unsere div-Anmeldeseite, und jetzt haben wir oben einen Link. Hier haben wir einen Router-Link und hier ist Slash. Diese Route geht also auf unsere Homepage. Innerhalb unseres Routerlinks wollen wir ein Bild. Also hier wird Bildquelle Slash Acids, Slash Trello, Logo Dot SVG sein. Und nach dieser Klasse, Thread-Gesetz, Hauptlogo. Und in diesem Moment möchten Sie mit Sicherheit sagen, okay, wir haben keine Bilder. Dies ist speziell für Sie vorbereitet alle Bilder und legen Sie sie in diesen Ordner, innerhalb von Assets. Und Sie können all diese Bilder aus dem Archiv dieser speziellen Lektion im Beschreibungsfeld unten aufnehmen , wie Sie hier sehen können, innerhalb der Quelle, in Assets, ich habe ziemlich viele Bilder, also vergessen Sie nicht um sie für unser Projekt zu übernehmen. Lassen Sie uns nun zurück in unsere App springen, unsere Komponenten registrieren sich, registrieren HTML, und nach unserem a -Tag hier oben wollen wir div mit class firm container erstellen, und es wird unser Container sein für unser Formular. Jetzt, innerhalb des Containers, wollen wir zunächst den login-Header der def-Klasse schreiben. Und wieder haben wir die Klasse aus dem Login, aber es ist keine große Sache. Und hier schreiben wir Register für Trello. Danach schreiben wir eine Klasse für Validierungsfehler. Und eigentlich werden wir vorerst keine Fehler machen, aber wir werden es später verwenden. Das ist y hier, nur div Klassenfehler haben es geschlossen. Es ist völlig leer und dort ist noch nichts gerendert. Danach haben wir unser Formular. Öffnen und schließen wir also das Formular-Tag. Und innerhalb von haben wir spezifische Bereiche. Zuallererst haben wir hier eine E-Mail, also geben Sie eine E-Mail ein. Und hier möchten wir die E-Mail-Adresse des Inhabers platzieren. Und der letzte wird eine Klassen-Login-Eingabe sein. Jetzt möchte ich diese Zeile zweimal kopieren , weil wir nicht nur E-Mail benötigen, sondern wir brauchen hier auch den Namen unseres Benutzers. Also hier brauchen wir keinen Typ. Platzhalter sind Nutzername und Klasse. Wir werden nach Input suchen. Und nach diesem Typ Passwort und Platzhalter-Passwort. Danach können wir unseren Button erstellen, um den Benutzer zu registrieren. Hier sind wir Button-Typ, Submit, Klasse, Login, Submit-Button. Und innerhalb dieser Schaltfläche versuchen wir es für eine Registrierung. Nach unserem Formular wollen wir unsere Links rendern. Also hier werden wir div class bottom form links haben. Schließen wir dieses Div und erstellen darin einfach einen einzigen Link zu unserer Anmeldeseite. Also hier wird ein Router-Link sein. Schon wieder. Hier haben wir eine Slash-Anmeldeseite und einen Klassenregistrierungslink. Hier in unserem a-Tag führen wir einfach die Anmeldung aus. Prüfen wir, ob etwas gerendert wurde. Eigentlich wollen wir zur Slash-Registrierungsseite springen und unsere Seite sehen, aber es funktioniert nicht, weil wir unsere Route nicht registriert haben. Registriert. Dafür müssen wir zurück in unser Modul, unser Modul, springen . Und hier müssen wir alle Routen registrieren , die wir in diesem speziellen Modul erstellen möchten. Hier oben können wir ein Routen-Array erstellen und wir können sagen, dass dies Runden sind, und in diesem Fall wird es nicht nur ein Array sein. Wir werden die Validierung jeder Runde innerhalb haben. Hier müssen wir also ein Objekt mit unserem Pfad hinzufügen, der registriert wird, und unserer Komponente, die wir gerade erstellt haben. Und es ist Registerkomponente. In diesem Fall funktioniert es, nachdem wir diese Routen zu unseren Eingaben hinzugefügt haben. Hier müssen wir gerade Vögel einsteigen und den Punkt des Hörrouten-Moduls für Kinder verwenden . Und es ist wichtig , hier für Kinder und nicht gerunzelt zu verwenden , da wir den Strauss innerhalb oder ein untergeordnetes Modul erstellen möchten, nicht innerhalb des App-Moduls. Hier finden Sie untergeordnete Routen und Routen für dieses spezielle Modul. Schauen wir uns das jetzt an. Ich werde die Seite neu laden und zum Slash-Register springen. Und wie Sie in diesem Fall sehen können, wurde es gerendert. Wir können unser Telefon ohne CSS sehen, und hier ist unsere SVG-Datei, die wir oben zur Verfügung stellen. Jetzt ist Ihre Frage sicher, wohingegen unser CSS ist und das ist der Punkt. Ich habe auch das gesamte CSS für unser Projekt vorbereitet. Wir werden uns also voll und ganz auf Angular konzentrieren und in Geschäftslogik schreiben. diesem Grund müssen Sie den Quellcode unseres Projekts unter das Video aufnehmen. Und dann müssen Sie diese Zeilen innerhalb des Quellordners in styles.css kopieren. Und wie Sie hier sehen können, befinden sich diese alle in Teilen der Stile für neue Ordner, die Sie ebenfalls kopieren müssen. Sie müssen also zwei Dinge kopieren, Quellstilordner und Quellstile, CSS, Sie müssen diese Datei überschreiben. In unseren Quellstilen haben wir also viele verschiedene Stile. Wie Sie hier sehen können. Erstellen Sie beispielsweise eine Aufgabe. Wir haben alles, was das Erstellen von Aufgaben betrifft. Und all diese Stile sind global und wir werden die ältesten Stile verwenden , um uns voll und ganz auf die Angular-Anwendung zu konzentrieren. Außerdem möchte ich Sie daran erinnern, dass unsere globale Datei, Source Styles, CSS, automatisch von Angular verwendet wird. Das heißt , wenn Sie diese Symbole hier geschrieben haben, funktioniert es sofort. Und jetzt, wenn wir die Seite neu laden, haben wir hier unser Markup. Wir haben hier also ein Trello-Symbol, und das ist eigentlich ein Link zur Homepage. Und wir haben unser Anmeldeformular mit E-Mail, Benutzername und Passwort. Das einzige Problem ist hier, hallo l Trello das wir in der Ecke sehen können. Dies sind nur ein paar Reste in unserer Quell-App, App-Komponenten-HTML. Hier können wir diese Leitung entfernen und einfach hier leben Router Outlet. Also hier haben wir erfolgreich unser Markup für die Registrierungsseite erstellt . Binden Sie nun dieses Formular irgendwie mit Angular zusammen. Und tatsächlich haben wir im Angular reaktive Formen. Und dies ist ein zusätzliches Angular-Modul, um mit Formularen auf Schachweise dieser Woche zu arbeiten. Das ist y. Lassen Sie uns zurück ins Innere springen, um unsere Komponenten zu registrieren, die Komponenten ts zu registrieren. Und hier möchte ich zunächst eine neue Attributformulargruppe in unser Formular einfügen. Und hier werde ich versuchen, es ist gleich Form. Und auch hier brauchen wir NG Submit zum Absenden des Formulars. Und hier werden wir auf Submit erstellen. Die Frage ist nun, was ist diese Formulargruppe? Und tatsächlich können wir innerhalb reaktiver Formulare eine Formulargruppe innerhalb einer Komponente erstellen. Und es wird eine Darstellung unseres HTML-Formulars sein. Und es wird vollständig an unsere HTML-Elemente gebunden sein und funktioniert sofort. Was wir hier in unserer Klasse machen wollen, wir wollen unser Formular erstellen. Und das ist eigentlich diese Punkt-wenn-b-Punkt-Gruppe. Und wir haben überhaupt kein B in unserer Komponente. diesem Grund müssen wir den Konstruktor injiziert einfügen. Also hier werde ich privat schreiben wenn b, und das ist Form Builder. Und wie Sie sehen können, wurde es aus eckigen Formen importiert. Jetzt haben wir hier oben Zugang zu dieser großen Gruppe und hier ist unser Formular. Welche Bereiche haben wir also? Zuallererst haben wir eine E-Mail und tatsächlich können wir hier als Array unsere Validatoren sagen, also der Anfangswert hier ist leer und hier können wir Validatoren schreiben, die erforderlich sind, in diesem Fall reaktive Formen. Wir überprüfen dieses Feld standardmäßig auf Leere. Jetzt können wir diese Zeile kopieren und einfügen , weil wir genau dasselbe haben. Wir haben hier unseren Benutzernamen, ebenfalls ein leeres Feld und eine Validierung erforderlich, und hier ist unser Passwort. Es ist auch standardmäßig ein leeres Feld und es ist erforderlich, damit unsere Firma bereits erfolgreich ist. Und diese Zeile hier für Firm Group-Formular bindet dieses spezielle Formular an unser HTML, aber es ist nicht alles. Wir müssen auch jedes einzelne Feld binden. Hier haben wir überall diesen Input. Und was ich hier machen möchte, möchte ich ein Namensattribut für Formularsteuerelemente eingeben. Hier binden wir für jede Eingabe ein bestimmtes Feld. Die erste hier ist also unsere E-Mail. Der zweite ist unser Benutzername und der letzte ist Passwort. In diesem Fall, wenn wir diese Eingaben ändern, werden sie in unserer Formulargruppe hier aktualisiert. Und das Letzte, was wir erstellen müssen , ist die Submit-Methode. Wir haben es also bereits in unserem HTML erstellt. Hier können wir einfach beim Absenden hinzufügen und es wird ungültig zurückgegeben. Und jetzt möchte ich nur noch die Konsole anmelden Submit Komma, dieses Formular Punktwerte. Prüfen wir, ob es funktioniert. Ich werde den Patienten neu laden, bei dem ein Fehler nicht an die Formulargruppe gebunden werden kann, da es sich nicht um ein bekanntes Element des Formulars handelt ein Fehler nicht an die Formulargruppe gebunden werden kann, da es sich nicht um . Warum passiert es? Weil wir kein Modul für reaktive Formulare in unser Modul injiziert haben. Also lasst uns zurück ins oder aus dem Modul springen. Und hier in den Eingaben müssen wir reaktives Forenmodul schreiben. Und nach diesem Input sollten wir die Sarah nicht mehr bekommen. Laden wir die Seite neu. Wie Sie sehen, haben wir keine Fehler. Jetzt kann ich etwas hineinlegen und einfach auf Registrieren klicken. Und wie Sie hier in der Konsole sehen können , wo Sie onsubmit, E-Mail, Benutzername und Passwort erhalten , was tatsächlich bedeutet, dass alle unsere Felder erfolgreich an unsere eckige Komponente gebunden wurden . 15. Register – Service + Validierung: In früheren Videos haben wir den Markt für die Registerseite und auch für die Firma erstellt , aber wir vermissen immer noch unseren API-Aufruf , den wir in diesem Video implementieren müssen. Deshalb möchte ich zuallererst wieder in unsere, unsere Dienste, unseren Service einsteigen , denn eigentlich werden wir hier alle unsere API-Aufrufe schreiben und wir haben bereits hier aktuelle Benutzer bekommen, was wir tun werden später polieren. Aber jetzt möchte ich Register API-Kohle erstellen. Deshalb können wir hier einfach Register schreiben. Und die Frage ist, was bekommen wir hier? Wir bekommen unser Formular, aber wir haben es noch nicht eingegeben. diesem Grund ist es nicht bequem zu bedienen. Und wir wollen hier nicht schreiben , dass wir welche bekommen, weil es nicht viel Sinn macht, was diese Methode will, sie möchte wissen, was darin bereitgestellt wurde. Deshalb wollte ich wieder in unsere Typen einsteigen und hier einen neuen Typ erstellen. Und wir können diesen Typ Registeranforderungsschnittstelle nennen. Und du fragst vielleicht, okay, aber warum so ein seltsamer Name? Und eigentlich ist es nicht seltsam. Die Hauptidee ist die Zeit alles repariert wird , was wir in Bezug auf Anfrage und Antwort schreiben Bezug auf Anfrage und Antwort mit einem bestimmten Postfix in diesem Fall hier weiß ich. Okay. Dies ist eine Registrierungsanfrage. Das ist also der Hauptteil der Anfrage. Wenn wir bei Bedarf über eine Antwort unseres Registers sprechen , dann wäre es ein registrierter Antwortschnittstellentest. In diesem Fall ist es einfacher zu verstehen, wofür Sie diese Schnittstelle verwenden. Jetzt erstellen wir diese Schnittstelle. Also hier möchte ich unsere neue Schnittstelle exportieren und es wird Registeranforderungsschnittstelle sein. Was wir in genau all unseren Feldern haben werden , die wir in ein Formular geschrieben haben. Also hier haben wir unsere E-Mail, es ist eine Zeichenfolge, unser Benutzername, es wird auch eine Zeichenfolge sein. Und das letzte ist unser Passwort. Und das Passwort ist auch eine Zeichenfolge. Und eigentlich geht es nicht nur um das Formular. Wenn wir in unsere Server Source Controller schauen, wurden hier bereits Benutzer eine Registermethode erstellt. Und innerhalb unserer Registermethode suchen wir genau das im Körper. Fordern Sie also die E-Mail-Adresse, den Benutzernamen und das Passwort an, genau das senden wir vom Kunden. Deshalb haben wir uns registriert, dass wir wieder in unsere Dienste, unsere Service-Stufen, einsteigen können . Hier im Register, was wir als Parameter bekommen, es ist unsere Registeranfrage und unser Typ ist eine es ist unsere Registeranfrage und unser registrierte Anforderungsschnittstelle , die wir gerade erstellt haben. Jetzt ist die Frage, was ich nach der Registrierung zurückbekomme , wir bekommen unseren aktuellen Benutzer zurück. Auf diese Weise können wir genau so schreiben , wie der aktuelle Benutzer die aktuelle Benutzeroberfläche beobachten kann. Wir haben es schon. In diesem Fall ist alles innerhalb unserer Methode korrekt getippt. Jetzt müssen wir eine URL-Eigenschaft erstellen. Also hier URL und wir verwenden wieder Umgebung Punkt ein Payer-Realm, weil es die gleichen Slash-Benutzer sind, weil sie registriert waren Anfrage ist nur für Slash-Benutzer zu posten. Und jetzt möchte ich dieses HTTP zurückgeben und wir haben hier Zugriff auf den HTTP-Post und im Inneren stellen wir die Festival-URL zur Verfügung. Und zweitens Körper, und unser Körper ist unsere Registeranfrage. Aber auch hier erhalten wir einen Fehler, weil unser Typ für das Objekt beobachtbar ist und von der aktuellen Benutzeroberfläche nicht beobachtbar ist. Denn offensichtlich weiß der HTTP-Post standardmäßig nicht, was wir Einblicke geben wollen. Hier müssen wir in unserem HTTP-Beitrag bereitstellen, was wir zurückbekommen. Und es ist die aktuelle Benutzeroberfläche, aber es ist nicht alles, muss auch eine zusätzliche Methode erstellen , um das Token im lokalen Speicher festzulegen . Was heißt das? Tatsächlich, wenn wir einen Benutzer registrieren oder den Benutzer bekommen, erhalten wir auch das Token-Feld, das wir im Backend vorbereitet haben. Und wir sollten nichts mit diesem Feld auf dem Client tun , aber wir müssen es einfach speichern und den lokalen Speicher speichern und an jede einzelne Anfrage anhängen. In diesem Fall kann unser Backend nachvollziehen, wann die Anfrage autorisiert wurde und dass wir das richtige Token bereitgestellt haben. Hier möchte ich ein zusätzliches Methodenset-Token hinzufügen . Und tatsächlich werden wir den aktuellen Benutzer bereitstellen , da wir diese Methode entweder aufrufen , nachdem wir einen aktuellen Benutzer erhalten haben, oder nach der Registrierung oder Guinean. Hier ist der aktuelle Benutzer aktuelle Benutzeroberfläche und jetzt wird es void zurückgeben, weil wir im Inneren einfach lokalen Speicher verwenden möchten. Und hier werde ich lokale Speicherpunkt-Set-Artikel schreiben. Und drinnen möchte ich vor Ort sprechen und wir schreiben innerhalb des aktuellen Benutzer-Punkt-Tokens. Diese Methode speichert also am einfachsten in LocalStorage unser Token des aktuellen Benutzers, und jetzt sind wir bereit, unsere Komponente anzupassen. Lassen Sie uns also zurück in unsere Komponente für das Komponentenregister springen . Und hier haben wir eingereicht, und offensichtlich wird dieser feste Wert hier gezogen. Wir wollen unseren Service nutzen. Deshalb möchte ich hier unseren Service injizieren. Wir schreiben also wieder privat und haben unseren Service , der unsere Auth-Serviceklasse ist. Und hier im Inneren auf Submit können wir dieses Service-Punktregister ausschreiben. Und wie Sie sehen können, werden wir innerhalb einer Registeranforderung bereitgestellt , aber innerhalb unserer Komponente haben wir nur diese Punktform, den Punktwert. Und tatsächlich ist dieser feste Wert, wie Sie hier sehen können, die Art davon ist beliebig, deshalb wird er für uns funktionieren und wir können ihn in keiner Weise wirklich eingeben. Also was registriert kehrt schnell zurück? Es ist ein Observable. diesem Grund können wir hier wieder Subscribe mit so object in Felder schreiben Subscribe mit so object in , die als nächstes kommen, wenn es korrekt ist oder es ein Fehler ist. Also drinnen als nächstes, aber wir werden die aktuelle Benutzertasche bekommen. Und hier werden wir etwas Logik machen. Und wenn wir hier einen Fehler haben, müssen wir einen Flugplatz angeben. Und hier ist eine Funktion mit Era. Und drinnen können wir einfach protokollieren und eingrenzen. Also zuerst möchte ich hier Fehler schreiben, Fehler hier in der nächsten Konsole protokollieren unseren aktuellen Benutzer, Koma, aktueller Benutzer. Prüfen wir jetzt, ob es funktioniert. Ich werde eine E-Mail angeben , die nicht in Benutzername und Passwort existiert , und klicke auf Registrieren. Und wie Sie sehen können, ist hier unser Netzwerk. Wir kommen hier, um eine Anfrage zu stellen. Zuallererst erhalten wir eine Optionsanfrage. Und das ist völlig normal , weil wir natürlich benutzt haben. Und wir haben eine Anfrage zwischen zwei verschiedenen Hosts weil wir unsere Anwendungen auf verschiedenen Stellen hosten . Sie werden diese Optionen also jedes Mal sehen. Das ist völlig normal. Aber wir sind an unserer Post-Anfrage interessiert, bei der es sich um matschige, weglose Benutzer handelt. Und hier ist unsere Nutzlast. Die Nutzlast ist völlig korrekt und hier ist unsere Antwort. Wie Sie sehen können, erhalten wir unser E-Mail-ID-Token und unseren Benutzernamen zurück , was bedeutet, dass eigentlich alles einwandfrei funktioniert. Und hier bekommen wir unseren aktuellen Benutzer. Aber wie Sie zuvor sehen können, erhalten wir eine Fehlermeldung, eine HTTP-Fehlerantwort. Und es sollte Sie nicht stören, denn dies ist der Fehler dieser nicht autorisierten Anfrage und wir werden ihn im späteren Video beheben. Es hat nichts mit unserer Registerkomponente zu tun. Wie Sie hier in der Konsole sehen können, erhalten wir unseren aktuellen Benutzer, was bedeutet, dass unser Code hier völlig korrekt ist. Was wir jetzt tun können, wir können diesen Punkt schreiben und hier haben wir unseren Service und wir können hier ein Methodenset-Token aufrufen und insert current user bereitstellen. Dann speichert diese Zeile, weil wir hier den aktuellen Benutzer haben , unser CurrentUser-Token im lokalen Speicher, aber es wird nicht gehalten. Wir möchten auch einen Benutzer für die gesamte Anwendung speichern, und wir sind bereits zuvor auf dieselbe Methode vorbereitet dot set currentUser. Innen. Wir können einfach unseren CurrentUser zur Verfügung stellen und diese Methode abhören. Es wird nur dieser aktuelle Benutzer im Stream der aktuellen Benutzer festgelegt . werden Sie sehen, wie Sie den aktuellen Benutzerstream verwenden In späteren Videos werden Sie sehen, wie Sie den aktuellen Benutzerstream verwenden. Am wichtigsten ist, dass wir es jetzt nach der Registrierung auf Target setzen und wir uns bei einem CurrentUser in unserer Anwendung saßen . Und das Letzte , was wir implementieren wollen, ist unsere Validierung. Denn wenn wir einen Fehler bekommen, wollen wir ihn tatsächlich zeigen. Deshalb hier. Zunächst möchte ich unseren Fehler eingeben, weil wir wissen, was es ist. Es ist eine HTTP-Fehlerantwort. Und hier bekommen wir unseren Fehler und wir können hier zumindest dot Azure schreiben. Und ja, dieser Pfeil wird jeder sein, aber er ist immer noch besser als nichts. Aber wir wollen jetzt unseren Fehler hier speichern. Jetzt stellt sich die Frage, in welchem Format wir unsere Fehler bekommen werden. Und für diese Sekunde wieder geöffnet, unsere Controller, Benutzer. Und wie Sie sehen können, ist hier unser Haken. Und was wir in dieser Zeile tun, wir ordnen unsere Fehler zu und wir erhalten Nachrichten als ein Array von Strings, was bedeutet, dass wir sicher sind , dass wir, wenn wir einen Fehler bekommen, es ist immer ein Array von Strings. diesem Grund können wir, was wir in unserer Client-Insider-Register-Komponente tun können, eine Fehlermeldung generieren und sie hier anzeigen. Das ist y. Was ich hier machen möchte, ich möchte nur einen einzigen Fehler erstellen und es wird jetzt vom Typ string sein. Und standardmäßig ist es jetzt so , weil wir keinen Fehler haben. Jetzt, hier in unserem Fehler, können wir diese Punkt-Ära schreiben. Wir wissen, dass wir hier unseren Fehler als Array bekommen . diesem Grund können wir hier einfach Azure dot dot join in erstellen wird hier ein Leerzeichen, was eigentlich bedeutet, dass wir alle unsere Fehler mit Komma und Leerzeichen verbinden möchten , und es wird nur ein einziger sein Feld. Jetzt möchte ich hier in ein Registerkomponenten-HTML springen , wo wir div-Klassenfehler haben. Ich möchte schreiben und GE und dieses Feld nur anzeigen wenn wir einen Fehler haben und darin können sie einfach unseren Fehler rendern. Prüfen wir jetzt, ob es funktioniert. Aber wie Sie hier sehen können, erhalten wir einen Fehler, der nicht an G gebunden werden kann , wenn es keine bekannte Eigenschaft von div ist. Und es passiert , wenn wir kein gemeinsames Modul in unser Modul injiziert haben. Hier innerhalb der Importe müssen wir ein allgemeines Modul von Angular eingeben. Wie Sie sehen können, erhalten wir keine Fehler. Und was ich tun möchte, ich möchte ungültige Daten angeben. In einer E-Mail gebe ich beispielsweise Daten und kein falsches Format an. Jetzt reinigen wir alles und klicken auf Registrieren. Und wie Sie hier sehen können, bekommen wir unseren Fehler. Und das ist ein Array mit ungültiger E-Mail. Und wir rendern diese ungültige E-Mail hier oben, was bedeutet, dass wir richtig reagiert werden azurblau und Don Erfolg bei der Registrierung unseres Benutzers. Lassen Sie uns nun prüfen, ob wir nach der Registrierung wirklich sicher sprechen. Hier wird es Laden Sie die Seite neu und geben Sie die korrekte E-Mail-Adresse, Benutzernamen und das richtige Passwort ein und klicken Sie hier registrieren. Wie Sie sehen können, haben wir unseren Benutzer, was bedeutet, dass wir im Speicher angefangen haben. Aber hier, wenn ich Champion im lokalen Anwendungsspeicher bin , können Sie unser Token sehen und hier ist ein Wert, was tatsächlich bedeutet, dass wir die Registrierung des Benutzers erfolgreich implementiert haben und wir haben das Token in LocalStorage gespeichert. 16. Anmeldeseite: Im vorherigen Video haben wir unsere Registrierungsseite erfolgreich abgeschlossen. In diesem Video müssen wir die Anmeldeseite implementieren. Und ich denke, das ist eine großartige Idee , dass Sie versuchen, sie selbst umzusetzen. Was müssen wir also auf dieser Seite implementieren? Eigentlich ist die Anmeldeseite einfach ein URL-Slash-Login und wir sehen genau das gleiche Formular wie register, aber Login-Formular. Wir haben also eigentlich nur eine E-Mail und Passwort und wir haben keinen Benutzernamen. Offensichtlich sind alle Texte unterschiedlich, aber im Wesentlichen ist es das. Außerdem werden wir die weitere Anfrage verwenden, um dem Spielen auf Slushy Pie Slash-Benutzern die Slash-Anmeldung zu folgen . Und hier habe ich drei Komplexitätsstufen für Sie. Zunächst können Sie dieses Video jetzt pausieren und versuchen, es selbst zu implementieren. zweite Stufe ist, dass Sie von mir eine Anleitung erhalten , bevor Sie mit der Implementierung beginnen. Was müssen wir also überhaupt tun? Zuallererst haben wir, wie Sie hier sehen können, innerhalb von Out-Komponenten eine Registerkomponente. Und wie ich bereits sagte, möchte ich die Komponente nicht zwischen Registrierung und Anmeldung teilen , was tatsächlich bedeutet, dass wir das neue Komponenten-Login mit genau dem gleichen Markup implementieren können , aber ohne unseren Benutzernamen und unsere TS-Datei wird super ähnlich sein. Wir brauchen ein Formular, wir brauchen onsubmit und so weiter. Aber der Hauptunterschied wird es in einem Dienst geben, wir werden unseren Dienst nicht nutzen, der sich registriert, aber wir müssen eine Methode erstellen login, was eigentlich bedeutet, dass wir in unserem Service hier eine Login-Anfrage erstellen müssen , was einen API-Aufruf tätigt. Und eigentlich wird es unserem Register super ähnlich sein. Aber hier müssen wir keine registrierte Anforderungsschnittstelle erstellen , sondern eine Anmeldeanforderungsschnittstelle. Und dann müssen wir im Inneren eine korrekte URL angeben , wenn Sie es selbst ausprobieren möchten. Jetzt pausiere das Video einfach hier. Und wenn du es nicht alleine ausprobieren willst, lass es uns zusammen machen. Und unser erster Schritt wird darin bestehen, die Schnittstelle für unseren Service zu erstellen. Also hier haben wir unsere Schnittstelle zur Registrierungsanfrage. Und wie Sie sehen können, haben wir hier drei Felder, sodass wir sie nicht innerhalb des Logins wiederverwenden können. Aber ich möchte hier machen, ich möchte eine neue Schnittstelle erstellen, Login-Anforderungsschnittstelle. Lassen Sie uns in diese Datei springen und wir können unsere Registeranforderungsoberfläche komplett kopieren und einfügen , nur weil sie sehr ähnlich ist und sie nicht viel tippen wollen. Also müssen wir hier unsere Schnittstelle erstellen , Login-Anforderungsschnittstelle. Und wir haben eine Insider-E-Mail und ein Passwort, und wir haben unseren Benutzernamen nicht. Also haben wir erfolgreich unsere Schnittstelle erstellt. Jetzt können wir zurück in unseren Service springen und wir können die Paste-Register-Methode vollständig kopieren , da ich Anmeldemethode super ähnlich sein werde. Nennen wir unsere Methode login. Und hier bekommen wir keine registrierte Anfrage, sondern unsere Login-Anfrage, hier brauchen wir eine andere Schnittstelle , die wir gerade erstellt haben. Es ist eine Schnittstelle für Anmeldeanfragen. Und zurück bekommen wir unseren Benutzer, was bedeutet, dass es sich um eine korrekte, beobachtbare aktuelle Benutzeroberfläche handelt. Jetzt ist hier die URL. Wir haben hier API-URL-Slash-Benutzer Slash-Anmeldung. Und diese API sind wir bereits in unserem Backend implementiert. Die Anmeldung ist sicherlich eine Post-Anfrage, was bedeutet, dass wir hier einen Beitrag mit einer Anmeldeanfrage für den Körper bereitstellen müssen den Körper , den wir als Parameter festlegen, und unser Login-In-Service ist vollständig implementiert. Unser nächster Schritt wird darin bestehen, hier eine Komponente zu erstellen , bei diese Set-Register-Komponente unserer Login-Komponente sehr ähnlich ist . Es ergibt keinen Sinn, alles selbst erneut zu tippen. Deshalb möchte ich den gesamten Ordner kopieren und hier einfügen und den Ordner login umbenennen. Jetzt haben wir eine Login-Komponente. Wir müssen hier Seiten umbenennen. Es wird also login dot component dot html sein. Und hier login dot component dot ts. Nova muss in unser HTML springen und es ein bisschen ändern und es wird nicht so anders sein. Zunächst können wir hier, anstatt bei Trello registriert zu sein, Log in den Trailer schreiben. Jetzt verlassen wir hier einen Fehler, genau wie wir sie hatten. Es gab auch ein Formular zum Absenden und hier haben wir E-Mail, Benutzername. Wir brauchen den Großen nicht, wir können ihn entfernen. Wir haben unser Passwort. Und jetzt ist hier die Schaltfläche „Senden“, nicht mit Register, aber wir melden uns an, zum Beispiel, guter Letzt ist der Router-Link hier unten, es sollte zu einer Registrierungsseite gehen. Hier ist Slash-Register. Und statt dieses Textes können wir schreiben, um ein Konto zu eröffnen. Also haben wir erfolgreich unser HTML geändert. Gehen wir nun zu unserer TypeScript-Datei. Zuallererst müssen wir unseren Selektor ändern. Es ist nicht registriert, aber unser Login und unsere Vorlage sind Login-Komponente HTML. Jetzt ist ClassName auch anders. Es ist Login-Komponente Live-Ära wie es ist. Und hier ist unser Formular. Wir benötigen E-Mail und Passwort, aber keinen Nutzernamen. Also lass uns einfach den Benutzernamen hier entfernen. Unser Konstruktor bleibt derselbe. Unser onsubmit bleibt fast gleich. Aber hier verwenden wir keine Registermethode. Wir haben eine Anmeldemethode erstellt, in der das gesamte Formular bereitgestellt wird. Und hier haben wir abonniert und wenn wir uns erfolgreich anmelden, dann sind wir hier Konsolenprotokoll und aktueller Benutzer, wo Gespräch kommen und wir sind in den aktuellen Benutzer eingestellt, was tatsächlich bedeutet, dass es zu 99% genau gleich ist Code wie innerhalb der Registrierung. Und unser letzter Schritt hier ist die Registrierung unserer Komponenten. Also müssen wir in die Tränen unseres Moduls springen. Hier in den Deklarationen müssen wir sagen, dass wir eine neue Komponente haben und es ist eine Login-Komponente. Und wir müssen hier auch eine neue Route erstellen. Also werde ich die Registerroute kopieren und diese Pfad-Login und Komponente werden Login-Komponente sein. Prüfen wir, ob es funktioniert. Wir haben hier keine Pfeile innerhalb des Beobachters. Ich werde die Seite neu laden und versuchen, hier unten zu springen, zum Beispiel auf der Anmeldeseite. Und wie Sie sehen können, wo Sie sich bei Slash anmelden können. Und hier ist unser Formular und wir können die Seite neu laden , wo Fleck auf dieser Seite ist, alles ist in Ordnung. Versuchen wir jetzt, ob wir uns überhaupt anmelden können. Also hier möchte ich zunächst etwas Falsches schreiben. Hier ist eine E-Mail , die es nicht gibt. Und dann ein Passwort. Ich schlage hier rein und wir bekommen einen Fehler, wie Sie hier zuvor sehen können, wir bekommen ein Foto mit Validierungen zu einem Fehler. Und in unserem Fehler, wo ausgefüllte E-Mail oder ein Passwort eingegeben wurde, falsche E-Mail ein Passwort. Und wir tun dies in diesem Fall, weil wir den Benutzer nicht darüber informieren möchten , was genau nicht korrekt ist. Wir sollten nicht sagen, dass so etwas wie diese E-Mail bereits vergeben ist. Wir sagen einfach, dass es ungültig ist. diesem Grund funktioniert diese Logik innerhalb der Login-Komponente von Bone. Und nur um Sie hier daran zu erinnern, dass wir beim Senden eingefügt wurden und hier innerhalb eines Fehlers mit unseren Fehlern eingefügt wurden, denn im Fall auf der Registerseite hatten wir hier ein Array von Strings. Hier haben wir es nicht mit direkt sehen einen Pfeil, E-Mail, ein Passwort, was eigentlich bedeutet, dass wir hier anstelle des Joins eine Dodd-E-Mail oder ein Passwort schreiben können. In diesem Fall werden wir es korrekt im Inneren anwenden . Schauen wir uns den Sound an. Ich lade die Seite neu. Geben wir hier eine E-Mail ein, die es nicht gibt, einige Passwort-Anmeldungen und wir erhalten eine falsche E-Mail mit einem Passwort, was bedeutet, dass unsere Validierung ordnungsgemäß funktioniert. Versuchen wir nun, uns mit den richtigen Anmeldeinformationen anzumelden. Also hier habe ich voll auf gmail.com und hier ist unser Passwort 123. Ich schlage hier, sagen wir gemein, und wir bekommen den aktuellen Benutzer. Aber das Hauptproblem ist, dass wir auf dieser Seite bleiben. Und zweitens haben wir diesen Bereich überhaupt nicht entfernt. Und eigentlich können wir beide Dinge gleichzeitig machen. Zuallererst, was ich hier auf Submit machen möchte , können wir die Sarah entfernen. Also hier, diesen Dollarfehler können wir jetzt hineinschreiben. Und tatsächlich kann ich jetzt sagen, dass der Name der Ära nicht der beste ist, weil der Fehler tatsächlich super generisch ist und sie diesen Namen hier von Ära zu Ära ändern möchten , zum Beispiel in dieser Fall, wir müssen es hier in der nächsten und hier in der Ära ändern. Und danach müssen wir zur Vorlage springen und sie auch dort ändern. Also hier haben wir Angie wenn Fehler, es sollte eine Fehlermeldung sein. Hier stellen wir unsere Ära dar. Und ich denke, dass dieser Ansatz viel sauberer ist weil wir dadurch verstehen was wir hier rendern. Es handelt sich nicht um einen generischen Fehler. Das ist wirklich eine Fehlermeldung. Jetzt müssen wir genau dasselbe in unserem Register anwenden. Also lasst uns wieder in unser Register springen. Und hier möchte ich zunächst eine Fehlermeldung schreiben. Hier ist auch eine Fehlermeldung und dann die Datei ts, ich möchte die zwei-Fehlermeldung hier ändern, richtige Fehlermeldung innerhalb der Ära, und wir wollen es jetzt in unserem Erfolg setzen. Also hier ist diese Fehlermeldung gleich jetzt, das Letzte, was wir tun wollen, wir wollen den Benutzer auf eine andere Seite umleiten. Es macht keinen Sinn, dass wir dieser Seite bleiben und sie listet auf, wir wollen zur Startseite springen, nachdem wir uns angemeldet haben. Um das zu tun, müssen wir hier unseren Router einspritzen. Das ist mein Insert-Konstruktor. Ich kann privaten Router gleich Router schreiben. Und wie Sie sehen können, kommt dieser Router vom angular-ui-Router. Und jetzt hier im Erfolg, in der letzten Zeile, können wir diesen Punkt schreiben, Punkt navigieren nach URL. Und wir stellen hier eine URL zur Verfügung, zum Beispiel nur einen Schrägstrich. Und jetzt müssen wir genau das Gleiche auf unserer Anmeldeseite tun . Also springe ich hier in die Login-Komponente. Zuallererst möchte ich einen privaten Zhao-Router injizieren. Und danach kann ich diese Zeile einfügen, diese Route navigiert nach URL-Schrägstrich, was in beiden Fällen bedeutet, mit Registrierung und Anmeldung wir mit Registrierung und Anmeldung unseren Benutzer auf die Homepage zurückweisen möchten. Prüfen wir, ob es funktioniert. Ich bin hier auf der Anmeldeseite Ich schreibe hier f2 auf gmail.com, hier 123. Ich klicke auf Anmelden und setze mich dann für die Homepage ein, was bedeutet, dass wir unsere Anmeldeseite erfolgreich implementiert haben. 17. Startseite: In früheren Videos haben wir unsere Anmeldeseite fertiggestellt. In diesem Video werden wir unsere Homepage für das Projekt implementieren . Und der Hauptpunkt ist , dass diese Seite nur Markup und überhaupt keine Logik sein wird . Warum ist das so? Denn eigentlich ist diese Seite nur für anonyme Benutzer gedacht, wenn wir eingesperrt sind, diese Seite aber nie sehen, weil wir direkt auf die Insight Board-Seite umgeleitet werden. Lassen Sie uns zunächst in Ihrem Modul implementieren. Und dafür möchte ich in der App ein neues Modul erstellen, das Home heißt, was bedeutet, dass es sich um ein komplett separates Modul handelt. Es hat nichts mit Stunden zu tun, und es gibt nur eine Homepage-Komponente , die in diesem Modul isoliert ist. Also lasst uns in diesen Ordner springen und eine neue Datei erstellen Home-Modul Ts. Und viele Schüler fragen mich sehr oft warum sie zusammen mit Angular keine Generatoren verwenden. Und eigentlich gibt es dafür einen Grund. Ich finde, dass es länger dauert, einen Generator zu verwenden das Modul einfach zu kopieren und einzufügen, wenn wir das brauchen, und auch für den Bildungsprozess, damit Sie sich besser daran erinnern können. Ich schreibe es von Grund auf neu. Das ist y. Lassen Sie uns noch einmal ein Home-Modul von Grund auf neu erstellen. Und jedes nächste Modul werden wir einfach kopieren und einfügen. Das wollen wir hier tun. Wir wollen eine neue Klasse erstellen und nennen wir sie Home-Modul. Danach müssen wir hier einen Decorator in das GI-Modul injizieren. Und im Inneren müssen wir unsere Abhängigkeiten bereitstellen, zumindest hier in den Eingaben, müssen wir ein gemeinsames Modul bereitstellen da wir es in jedem einzelnen Modul benötigen. Zum Beispiel für Schleifen wie in G4, G anbieten Wenn wir jetzt unsere Home-Komponente für diese Biomasse erstellen, erstellen wir eine neue Verzeichniskomponente. Und drinnen wollen wir einen neuen Ordner erstellen home. Und ja, ich verstehe, dass wir hier nur eine einzige Komponente haben und es nicht viel Sinn macht, Slash-Komponenten als den Home-Ordner zu erstellen . Nichtsdestotrotz ist es eine gute Struktur. Und wenn Sie diese Homepage nicht in verschiedene Komponenten aufteilen mussten , können Sie dies auf jeden Fall tun. Also lasst uns in die Startseite springen und hier home component dot html und home component dot ds erstellen . Lass uns jetzt in die HTML-Seite springen und einfach hier nach Hause fahren, aber wir brauchen nichts, nur etwas zum Testen. Jetzt springen wir in unsere TS-Datei. Und hier wollen wir unsere Klasse erstellen und sie ist Home-Komponente. Danach müssen wir unsere Komponenten registrieren. Hier wollen wir also unsere Komponente injizieren und im Inneren müssen wir zunächst einen Selektor bereitstellen. Also hier werde ich einfach einen Home-Selektor verwenden , da es nicht viel Sinn macht , unserer Home-Komponente den Modulnamen wie home , home voranzubringen, es wird einfach nicht benötigt, nachdem wir selektiv ausgewählt haben geben Sie hier bei Template-URL an und sagen Sie dann Template-URL, wir haben Home-Komponenten-HTML. Und unser letzter Schritt besteht darin, unsere Komponente in unsere Erklärung aufzunehmen. Im Home-Modul hier möchten wir Deklarationen erstellen und in unsere Home-Komponente einfügen. Hier sieht alles gut aus, aber wir haben keine Route erstellt. diesem Grund möchte ich hier eine Immobilienroute erstellen. Und wir können sagen, dass dies Typ-Routen und dies ein Array mit nur einem einzigen Schlüssel ist. Und hier wird unser Weg sein. Dies ist eine leere Zeichenfolge, es bedeutet Homepage, und hier ist unsere Komponente, und unsere Komponente wird Home-Komponente sein. Danach können wir diese Route innerhalb der Eingaben registrieren. Also hier wird Routenmodulpunkt für untergeordnete Routen sein. Und jetzt sollten wir nicht vergessen, unser Home-Modul in unserem App-Modul zu registrieren . Deshalb möchte ich wieder in unser App-Modul springen. Hier, Insider in Birds, können wir unser Home-Modul hinzufügen. Alles sieht gut aus. Ich sehe keine Fehler in Observer. Also lass uns einen Browser öffnen und hier ist unsere Homepage. Wie Sie sehen können, wird hier das Wort home gerendert, was bedeutet, dass wir unser gesamtes Modul und unsere leere Komponente erfolgreich erstellt haben. Und jetzt müssen wir einfach versuchen, die ganze Seite zu markieren. Das ist mein, lass uns zurück in die Home-Komponenten, Home, Home-Komponenten-HTML springen . Fangen Sie hier an, unser Markup zu schreiben. Nichts besonderes hier, nur viele DOM-Elemente. Also hier haben wir Header mit Glas-Home-Header. Und jetzt schließen wir diesen Header. Dann wollen wir einen Link zu unserer Homepage erstellen. Also hier wird ein Router-Link-Slash sein. Und hier haben wir Klasse Home hatte einen Home-Link. Schließen wir den Verkauf und die Doppelbindung ab , um ein Bild zu zeigen. Also hier haben wir einen Schrägstrich der Bildquelle usw., Slash Trello, das Logo, den weißen Punkt SVG. Und schließen wir dieses Bild. Wie Sie im Browser sehen können, wird es angewendet. Und hier sehen wir unseren Header und Link zu unserer Homepage. Jetzt müssen wir Links zur Anmelde- und Registrierungsseite bereitstellen. Deshalb können wir nach a div schreiben. Und innerhalb von div können wir zwei Links schreiben. Zuallererst wird hier innerhalb von div einen Router-Link zu unserem Slash-Login haben , den wir gerade mit der Klasse erstellt haben, die ein Login hatte, ich werde den Verkauf abschließen. Und direkt im Login, jetzt können wir diesen Link kopieren und hier haben wir Slash-Register. Hier ist das Klassen-Home-Header-Register, und der darin enthaltene Text wird ebenfalls registriert. Lassen Sie uns überprüfen, ob es funktioniert, wie Sie im Browser hier rechts sehen können, haben wir einen Login-Link und einen Registrierungslink. Nehmen wir nun den ersten Block unserer Seite an. Also hier wird div sein, Klassenheim-Held. Schließen wir dieses div und im Inneren möchten wir einen Home-Container der div-Klasse hinzufügen . Lass uns dieses Div schließen. Und innerhalb des Home-Containers haben wir ein div. Und in diesem Div wird H1-Tag sein. Und hier haben wir den Klassen-Home-Desh-Titel. Schließen wir dieses H1 und in jedem einzelnen, den ich einfügen möchte. Obwohl der vorbereitete Text den Teams hilft, besser zusammenzuarbeiten und nach jedem einzelnen mehr zu erledigen, haben wir p-Tag. Das ist unsere Beschreibung. Hier sollte die Beschreibung des Glashauses sein. Und in dieses p werde ich die Beschreibung über Trello-Boards, Listen und aktuelle einfügen . Nach dem ersten Div werden wir ein zweites Div haben. Lass es uns schließen. Innen. Es sollte ein Bild sein. Also hier wird Bildquelle Slash Acids Slash Hero Dot SVG sein. Und lass uns dieses Bild schließen und prüfen, ob es funktioniert. Wir springen in den Browser. Und wie Sie hier sehen können, haben wir einen ersten Abschnitt unserer Homepage. Hier links haben wir Text und ein schönes Bild auf der rechten Seite. Ich denke, dass Sie eine Vorstellung davon bekommen, wie Arbeitsrate und Blogs für die Homepage erstellt werden. Wie Sie sehen können, haben wir einfach einen solchen Blogtitel, eine Beschreibung und ein solches Bild, was bedeutet, dass Sie den Prozess der Erstellung einer Homepage beschleunigen möchten den Prozess der Erstellung einer Homepage beschleunigen , da dies nur ein HTML ohne Logik ist. Also hier möchte ich das zweite Blog-Heimteam einfügen. Wenn Sie möchten, können Sie das Video einfach anhalten , alles erneut eingeben oder einfach den HTML-Code der Homepage aus dem Quellcode unter dem Video übernehmen . Also was wir hier haben, wir haben Heimteam, Heimcontainer Team Container drin. Wir haben mit jedem Team zusammengearbeitet, eine Beschreibung und ein Bild. Schauen wir uns an, wie es aussieht. Hier. Nach unserem ersten Element haben wir das zweite mit Text und jetzt das Bild. Erstellen wir jetzt einen weiteren Block hier. Ich füge Hausinformationen ein. gleiche Zeug hier haben wir Klassen in Bild als H1 und p. Schauen wir uns das an. Ich lade die Seite neu und wir haben hier unten einen weiteren Block mit einem Bild und Texten. Und jetzt fügen wir unseren letzten Block ein. Wie Sie sehen können, ist es ein bisschen größer. Wir haben hier etwas über Workflow und Automatisierung. Hier haben wir eine H1-Beschreibung und auch die Aufzählungsliste. Und rechts haben wir wie immer ein Bild, wie Sie hier rechts sehen können, haben wir ein Bild und links haben wir zuerst eine Titelbeschreibung und dann eine Aufzählungsliste, die bedeutet eigentlich, dass wir unsere Homepage erfolgreich erstellt haben. Es war nichts besonderes, nur ein Marker für nicht eingeloggte Benutzer. 18. Auth: Im vorherigen Video haben wir unsere Homepage erfolgreich erstellt, aber jetzt haben wir nur noch ein einziges Problem. Wir haben tatsächlich implementiert, dass der Benutzer nach der anderen häufig angezeigt wird, um Sie daran zu erinnern, dass wir in unserer Client-Insight-App, App-Komponenten, unseren Service als aktuellen Benutzer aufrufen. Und eigentlich bekommen wir hier immer einen Fehler und sind nicht autorisiert. Und tatsächlich, wenn ich zur Registrierungsseite springen und einfach ein Konto erstellen werde , das es vorher nicht gab. Wie Sie nach der Registrierung sehen können , wo auf die Homepage reagiert wurde. Und innerhalb des lokalen Speichers haben wir dieses Token. Dies haben wir vom Backend aus festgelegt , um unseren Kunden zu authentifizieren. Aber danach lade die Seite neu. Dieses Token wird nicht verwendet und wir kommen nicht autorisiert hierher. Und die Idee ist im Grunde , dass der Tower-Client bei jeder einzelnen Anfrage dieses Token aus dem lokalen Speicher anwenden muss dieses Token aus dem lokalen Speicher anwenden , wenn wir es haben. In diesem Fall weiß unser Backend, wann wir autorisiert wurden, aber Stellen Sie sich vor, wir müssen selten in jede einzelne Methode gehen, wie zum Beispiel den aktuellen Benutzer abrufen und dass er einige Haare aus dem lokalen Speicher hat. Dies ist nicht mangelhaft, zeitaufwändig, und wir möchten dieses Token wirklich nur bei jeder einzelnen Anfrage hinzufügen . Dafür haben wir in der Angular Middleware. diesem Grund werden wir jetzt eine Middleware erstellen. Was ist Middleware? Dies ist etwas in der Mitte zwischen dem Start unserer Anfrage und, und tatsächlich haben wir hier zum Beispiel den HTTP-GET und wir werden eine Middleware erstellen. bedeutet, dass diese Anfrage zwar gestartet wurde, aber nicht an diese Adresse gesendet wurde. Wir wollen Middleware einsetzen, also wollen wir etwas tun. Zum Beispiel braucht es dort einen Header. diesem Grund möchte ich in unsere Hausdienste einsteigen und hier in Ihren Servicezeiten Interceptor DOD-Servicepunkte erstellen . Und es wird nur eine Klasse sein, genau wie ein normaler injizierbarer Service. Hier haben wir Experten, Unterrichtsstunden, Interceptor, und hier müssen wir sagen, implementiert http Interceptor. Die Hauptidee ist also, dass diese Middleware in Angular als interceptive bezeichnet wird , weil sie unsere Anfrage abfängt. Und hier schreiben wir Geräte http Interceptor, um einen engen Klassenhaus-Interceptor zu bekommen einen engen Klassenhaus-Interceptor , der die Schnittstelle falsch implementiert und Property Intercept fehlt, und genau das müssen wir create, um diese Middleware zu implementieren. diesem Grund werden wir hier eine neue Methode erstellen , die als Intercept bezeichnet wird. Und wie Sie hier sehen können, hat meine automatische Vervollständigung bereits Anfrage und als nächstes erhalten, und es gibt ein beobachtbares Office-HTTP-Ereignis zurück, was tatsächlich bedeutet, dass wir einen vollen Zugriff auf oder eine Anfrage hier innerhalb der Request-Eigenschaft haben . Und wir werden als Nächstes anrufen, wenn wir bereit sind und alles erledigt haben , was wir hier tun müssen. Aus diesem Grund möchten wir zunächst möchten wir einen Token aus unserem lokalen Speicher holen. Schreiben wir also hier, dass wir ein Ziel haben und dies ist ein lokales Speicher-Get Item. Und im Inneren stellen wir Token zur Verfügung. Danach hier möchte ich request equals request clone schreiben . Und hier drinnen stellen wir ein Objekt mit Feldsatz-Headern zur Verfügung. Die Erkenntnisse, die Header für ein Objekt sind, das wir autorisieren, sind gleichbedeutend mit sprechenden oder leeren Strings. Und danach rufen wir den Rückholgriff von nebenan an und wurden in unserer Anfrage bereitgestellt. Also was dieser Code überhaupt macht, zuerst haben wir hier ein Token von der Google-Suche bekommen. Es ist also entweder ein undefiniertes It oder es ist ein gültiges Token. Jetzt machen wir hier den Anforderungsklon. Warum machen wir das? Da die Anfrage unveränderlich ist, können wir sie nicht wirklich ändern. Hier müssen wir es könen , um etwas zu setzen. Hier verwenden wir properties set header, um einen Header zu setzen. Der Header heißt Autorisierung und im Inneren stellen wir unser Token bereit. Wenn wir also kein Token haben, sagen wir hier eine leere Zeichenfolge. Und danach rufen wir next handle auf, was im Wesentlichen bedeutet, dass wir unsere Anfrage fortsetzen müssen und eine aktualisierte Anfrage im Inneren bereitstellen. So erstellen wir also Middlewares oder Interzeptoren in Angular. Aber jetzt müssen wir diesen Out-Interceptor in unsere Anwendung injizieren . Aber die Hauptsache ist , dass wir einen Interceptor injizieren, nicht Inside-Out-Modul, sondern innerhalb des App-Moduls, weil wir es auf globaler Ebene tun wollen , um Interceptor zu injizieren, wir verwenden hier Anbieter. Was wir also innerhalb dieses tun wollen, liefert ein Objekt mit field provide, und hier verwenden wir HTTP-Interzeptoren. Es kommt von Angular auch hier richtig in der Gebrauchsklasse. Und das ist unsere Klasse, unser Abfangjäger, den wir gerade geschaffen haben. Und der letzte wird auf wahr gesetzt. Und genau so müssen wir HTTP-Interzeptoren in Angular bereitstellen . Hier sagen wir also, dass wir uns registrieren müssen und Sie haben angegeben, dass es sich einen HTTP-Interzeptor handelt und wir unseren Interzeptor für Unterrichtsstunden verwenden müssen. Prüfen wir jetzt, ob es funktioniert. Ich lade die Seite neu und lass uns im Netzwerk nachschauen , unser angeforderter Benutzer. Eigentlich möchte ich hier nach unten scrollen. Hier können wir die Autorisierung sehen und unser Token, was eigentlich bedeutet, dass unser Abfangen korrekt funktioniert. Und wir haben diesen Autorisierungsheader direkt auf jede einzelne Anfrage angewendet diesen Autorisierungsheader direkt auf jede einzelne Anfrage , um beispielsweise einen aktuellen Benutzer zu erhalten. Aber wir bekommen immer noch unseren 401-Fehler zurück und sie wissen tatsächlich, was das Problem ist. Wenn wir in den lokalen Speicher schauen, können wir sehen, dass das Token einfach ein Ziel ist, das ist nur ein Wert. Aber wenn wir hier wieder in unser Backend springen, Inside Source, Middleware, Eulen. Und hier überprüfen wir hier ein Token, da Sie sehen können, wo es durch ein Leerzeichen geteilt wird. Denn wie ich schon sagte waren richtig im Bier und dann im Weltraum reden. Wenn wir eine DVT-Authentifizierung verwenden, ist dies hier nicht der Fall. Wir haben hier kein Wort, Bier, und genau das ist unser Problem. Wir haben es nicht implementiert, und wir müssen es tun, wenn wir ein Token an den Kunden zurückgeben. Also hier in den Quellsteuerungen der Diener, Benutzer, wenn wir hier drin Drehmoment erzeugen, innerhalb normalisierter Benutzer, müssen wir hier Platz schreiben. Hier haben wir Justice Train, wo drinnen, wo richtig, und Bier. Und hier injizieren wir unser Token, das wir generiert haben. Prüfen wir, ob es funktioniert. Unser Token ist also ungültig, sie entfernen es einfach und es wird zur Registrierungsseite gesprungen. Jetzt möchte ich nur noch ein paar Anmeldeinformationen eingeben und auf Registrieren klicken. Und jetzt, wenn wir unser lokales Lager überprüfen, können Sie sehen, dass wir Bier als Platz haben und uns unterhalten. diesem Grund erhalten wir hier unsere Antwort, wenn ich die Seite mit dem Fehler don't get for 01 neu lade mit dem Fehler don't get for 01 . Und tatsächlich können Sie hier sehen, dass unser Anforderungsbenutzer 200 ist und unsere Antwort genau das ist, was wir erwartet haben, wie es funktioniert. Wir registrieren uns zum Beispiel erneut oder melden uns an und setzen ein Token im lokalen Speicher. Also Birra Space und das Token dann jedes Mal, wenn wir einen Request Out Interceptor innerhalb von Angular stellen , hängt es innerhalb des Headers, dieses Autorisierungstoken. Und hier haben wir Bär und dann überprüft unser Token und unser Backend diesen Benutzer und gibt uns hier eine Antwort. diesem Grund erhalten wir jedes Mal, wenn wir die Seite neu laden, unseren aktuellen Benutzer zurück. Und genau das wollten wir erreichen. Jetzt hier in unseren Kunden Quelle AB, AB Komponente, ja, ich möchte eine kleine Verbesserung vornehmen , denn eigentlich haben wir hier den Service angekündigt, aber wir verwenden diesen Ras nicht und jetzt bekommen wir einen Benutzer, damit wir hier nicht trans schreiben können, aber das ist aktueller Benutzer. Und statt des Konsolenprotokolls möchten wir es mit der Methode festlegen , die wir bereits vorbereitet haben. Also hier haben wir diesen, unseren Service Punkt setzt den aktuellen Benutzer, und im Inneren stellen wir unseren aktuellen Benutzer zur Verfügung. Jetzt ist unser Benutzer erfolgreich in unserer Anwendung angemeldet. 19. Auth: In diesem Video möchte ich in unseren URLs über Gvd sprechen, was zum Beispiel bedeutet, dass wir dem Benutzer nicht erlauben sollten, zur Homepage zu springen. Wenn er bereits eingesperrt ist, muss er direkt zum Board springen. Wenn wir zum Beispiel nicht eingesperrt sind und versuchen, zur Seite des Boards zu springen, müssen wir auf die Homepage weitergeleitet werden, wenn wir nicht zugelassen sind müssen wir auf die Homepage weitergeleitet werden, wenn wir nicht zugelassen . Es gibt also unterschiedliche Herangehensweisen an dieses Problem. Aber für jeden Anwendungsfall empfehle ich Ihnen dringend, zunächst ein beobachtbares islamisches Zinn zu erstellen . Lass uns das jetzt machen. Also eigentlich möchte ich in unsere App springen, unsere Dienste, unser Service hier wird erstellt aktuelle Benutzer Stream. Und wie gesagt, das ist getrimmt, das wir von jedem Ort unserer Anwendung aus verwenden können . Und nur um Sie daran zu erinnern, wir verwenden hier den aktuellen Benutzer festlegen, um den Stream zu ändern. Also im Wesentlichen, was wir jetzt tun können, zum Beispiel unserer App-Komponente irgendwo hier nach Juni drin in unserer App-Komponente irgendwo hier nach Juni drin, können wir diesen Punkt schreiben, unseren Service dot aktuellen Benutzer hier haben wir recht und abonnieren Sie das Board, und wir erhalten hier unsere Antwort. Und jetzt möchte ich nur noch hier ein Konsolenprotokoll schreiben. Siehst du, wovon ich rede? Also haben wir hier den Stream von unserem Service abonniert. Und jetzt, jedes Mal, wenn wir unseren Stream ändern, erhalten wir diese Daten wieder in diese Komponente. Lass uns jetzt im Browser einchecken. Und wir bekommen hier zwei Konsolenprotokolle. Zuerst race und definiere es, und dann Ras und die Information über unseren Benutzer, warum es so am Anfang des Streams passiert , ist undefiniert weil wir noch keinen fischigen Benutzer hatten. Aber nach einiger Zeit, wenn unser CurrentUser-Aufruf beendet ist und er erfolgreich ist, setzen wir diesen CurrentUser in diesen Stream. diesem Grund kann jeder Ort, an dem wir diesen aktuellen Benutzer abonnieren, diese Informationen erhalten. Und das sind genau diese Informationen. Aber wir können es noch besser machen, weil wir im Wesentlichen überprüfen möchten, ob wir eingesperrt sind oder nicht. diesem Grund möchten Sie diese Antwort normalerweise verwenden und booleschen Wert konvertieren und auf true prüfen. In diesem Fall sind wir eingesperrt, aber wir wollen diesen Code nicht an jedem einzelnen Ort schreiben . Hier können wir in unserem Service zusätzlichen Stream erstellen, unserem Service zusätzlichen Stream erstellen auf unserem ersten Stream basiert. Also hier ist unser aktueller Stream-Benutzer. Aber jetzt möchte ich einen neuen Stream erstellen , der Logger Tin heißt. Und jetzt ist in unserer Anwendung an jedem Ort, den wir verwenden können, neuer Stream das Protokollteam. Also was haben sie dort gemacht? Hier verwenden wir diesen aktuellen Benutzer und dies ist bereits ein Stream. Wir wollen es einfach in einen anderen Wert umwandeln. Hier bin ich direkt in der DOD-Pipe, dann in der Site Map-Funktion. Und wenn Sie nicht wissen, dass dies der Rix JS-Code ist. Also verwenden wir im Wesentlichen Looks Chess und sagen zu Angular, um unsere Streams zu transformieren. Und wir verwenden es auf diese Weise. Wir schreiben immer Dot Pipe und dann die Liste unserer Transformationen. Hier sehen Sie die Pipe überall und hier drinnen, wo Sie Map verwenden, um unsere Daten abzubilden. Wir wissen also, dass wir innerhalb unserer Karte drei verschiedene Zustände haben können, undefiniert, falsch und wahr. Aber der Hauptpunkt ist, dass unsere Anwendung sich nicht um undefiniert kümmert. Es war relevant , seinen Login zu überprüfen. Wenn wir diese Informationen haben, wenn wir diese Informationen noch nicht haben, dann wollen wir nur auf diese Informationen warten. Das ist lange bevor ich diese undefinierte Eigenschaft überspringen möchte . Hier können wir Filter vor unserer Map verwenden. Und Filter ist auch eine Funktion. Im Wesentlichen verwenden wir also zunächst einen Filter innerhalb des Rohres und dann eine Map. Was wir also Insight Filter innerhalb des Filters bekommen, indem wir unseren aktuellen Benutzer abrufen, und tatsächlich kann dieser aktuelle Benutzer jetzt oder unser aktueller Benutzer nicht definiert werden. Und hier wollen wir nicht zur Map kommen , wenn sie nicht definiert ist, deshalb können wir hier schreiben aktueller Benutzer ist nicht gleich undefiniert. Dann kommen wir in diesem Fall hierher und hier ist unsere Karte. Also was wir machen wollen Nebenkarte, wo ich hier reinkomme, aktueller Benutzer. Hier wollen wir es einfach in boolesche Werte umwandeln, damit wir hier boolean und dann aktuellen Benutzer schreiben können. In diesem Fall bringt uns diese Logik zurück wahr oder falsch, und wir werden dies überspringen, undefiniert es, das wir nicht benötigen und in unserer Anwendung nicht verwenden werden. Wir können diesen Code jedoch noch weiter vereinfachen. Statt Flight und diese Logik kann Map setzen, können wir hier einfach Boolean schreiben, und es wird genau dasselbe tun. R is look at tin ist also ein neuer Stream, der auf dem aktuellen Benutzer basiert für uns true oder false zurückgibt. Prüfen wir, ob es funktioniert. Ich werde in der Setup-Komponente zurückspringen. Und hier möchte ich diesen Punkt schreiben oder Service Dot ist gesperrt. Hier können wir auch Abonnieren schreiben und unsere Köpfe und unser Rest wird eingesperrt sein. Schauen wir uns das an. Wir können es sogar verständlicher nennen , ist eingeloggt. Und hier ist das Konsolenprotokoll Log von Tin, Koma ist Login-Eigenschaft. Lassen Sie uns das speichern und überprüfen und durchsuchen. Ich lade die Seite neu und hier sehen wir nicht, dass der Islam undefiniert wird. Es. Wir sehen einfach, dass es hier nur wenig durchkommt, weil dies der erste Zustand ist , in dem wir wahr oder falsch haben. Und genau so können wir an jedem Ort unserer Anwendung diesen Stream verwenden, um festzustellen, ob der Benutzer angemeldet ist oder nicht. Jetzt möchte ich diesen Code entfernen , weil wir ihn hier nicht benötigen. Es war nur zum Testen gedacht. Und jetzt möchte ich Ihnen die einfachste Lösung zeigen, wie Sie Benutzer auf eine andere Seite umleiten können. Und wir können einfach mit unserer Home-Komponente beginnen, denn im Wesentlichen möchten wir hier den Benutzer auf die Seite des Boards umleiten , wenn er bereits eingesperrt ist , wie wir das machen können. Zuallererst müssen wir hier in den Konstruktor unseren Service injizieren . Also hier wird der Service für private Stunden angekündigt, Service, den wir bereits haben. Jetzt wollen wir hier Implementierungen auf need schreiben, also haben wir initialisiert. Jetzt werden wir hier Technik einsetzen. Und jetzt können wir genau diese Logik Lake Road in unsere App-Komponente schreiben . Also hier wird dieser Punkt sein, unser Service Punkt. Hier haben wir ist eingesperrt. Also danach können wir Subscribe schreiben und wir können hier hinkommen, ist die Login-Eigenschaft hier in diesem Subscribe entweder true oder wir bekommen falsch. Und wenn es hier stimmt, wollen wir den Benutzer auf die Seite des Boards umleiten. Hier können wir es einfach ausprobieren. Eve ist wie eine Dose. Dann wollen wir den Benutzer umleiten. Und um zu versuchen, umzuleiten, können wir, wie wir es zuvor benutzt haben, Router verwenden. Also hier erstellen wir einen neuen Router für Privateigentum. Und dieser Router, jetzt in unserer if-Bedingung, können wir diesen Punkt schreiben, Punkt navigieren nach URL. Und hier können wir nur Schrägstriche bereitstellen. Und eigentlich haben wir diese Slash-Boards noch nicht implementiert, aber das ist egal. Wir machen es einfach als Beispiel, wie Sie den Zugriff auf die URLs einschränken können. Schauen wir uns das an. Und tatsächlich bekommen wir hier schon einen Fehler, können keine neuen Routen zuordnen. Und hier sind Bretter. Und im Wesentlichen können wir es überprüfen, zum Beispiel mit Slash-Register. Um zu verstehen, dass es funktioniert, werde ich die Seite neu laden und wie Sie sehen können, wo im Slash-Register, warum es passiert, wo ich zur Homepage gehe, drücke ich die Eingabetaste und wir haben nicht einmal gesehen unsere Homepage wo sie sich direkt innerhalb registrieren. Dies ist also der einfachste Weg, wie Sie beispielsweise die Winkelumleitung in eine andere Route implementieren können . Aber hier ist ein Problem, das wir hier verwendet haben, abonnieren Sie von einer Börse. Sie müssen sehr vorsichtig damit sein. Denn wenn wir subscribe verwenden, müssen wir auch unsubscribe schreiben. Wenn wir nicht versucht haben, uns abzumelden, bedeutet das, dass wir in unserer Anwendung ein Kurzwaffenabonnement haben . Eigentlich wurde unsere Home-Komponenten-Pathologie zerstört, weil wir uns auf der Registrierungsseite befinden, aber dieses Abonnement ist immer noch da, weil wir uns nicht davon abgemeldet haben. Hier müssen wir immer daran denken uns von unseren Abonnements abzumelden. Um dies zu tun, müssen wir einfach ein Abonnement hier oben erstellen . Melden Sie sich beispielsweise beim Abonnement und der Typ ist Abonnement. Jetzt können wir hier in unserer Engine darin das eingeloggte Abonnement zuweisen. Das Ergebnis von Subscribe ist unser Abonnement. Jetzt können wir hier oben auf Destroy hinzufügen. Also wann diese Komponente zerstört wird, aber in G auf Destroy-Methode erstellen wollte. Und im Inneren können wir einfach schreiben, dass dies wie Abonnement, DOD, Abbestellen ist. Ich speichere das, aber wir erhalten einen Fehler. Wir haben hier keinen Initialisierer, weil der niedrige Get In standardmäßig nicht gesetzt ist, es ist undefiniert und es ist wahr. Deshalb können wir es hier schreiben oder undefinieren, weil es nicht standardmäßig gesetzt ist und wir es einfach in der Technik darin festlegen. Aber das ist mein Code hier, ist ungültig, weil dieses Objekt undefiniert sein kann. Deshalb müssen wir hier ein Fragezeichen setzen. Diese Zeile wird also nichts bewirken , wenn es sich um eine undefinierte Linie handelt. Aber wenn wir ein Abonnement haben, wird die Abmeldung erfolgreich sein , wenn die Komponente zerstört wird. Aber jetzt möchte ich dir die zweite mögliche Variante innerhalb und Farbe zeigen die zweite mögliche Variante innerhalb , um Weiterleitungen vorzunehmen oder deine Routen zu schützen. Und genau das ist das Feature, das innerhalb von Angular Quadranten genannt wird . Und die Idee ist genau die gleiche wie bei Interzeptoren, vor der Arbeit etwas getan haben. Also wollen wir im Wesentlichen etwas überprüfen und dann true oder false zurückgeben. Das ist hier innerhalb unserer Modulstunden. Ich möchte einen Insights-Service erstellen und Sie archivieren, und es wird unser Word-Punkt-Service sein. Also hier möchte ich unseren neuen Unterrichtsstunden-Word-Service exportieren . Und hier schreiben wir Geräte können aktivieren. Und das ist genau das Gleiche wie bei unseren Abfangjägern. Wie Sie hier sehen können, müssen wir definieren, können aktivieren, damit dieses R-Quadrat funktioniert. Deshalb können wir hier schreiben, aktivieren und hier haben wir eine Menge Sachen drin. Wir brauchen das ganze Zeug eigentlich nicht. Wir können es entfernen und diese Rückgabe ist zu ausführlich. Wir wollen hierher zurückkehren. Wir wollen ein Observable von Boolean zurückgeben, was tatsächlich bedeutet, dass wir true oder false zurückgeben. Aber als Stream wollen wir jetzt hier drinnen unseren, unseren Service nutzen. diesem Grund müssen wir hier den Konstruktor definieren und hier in unseren Service unserer Stunden einfügen. Und die Idee ist, dass wir innerhalb dieser Methode ein Observable of Boolean zurückgeben müssen. Das ist so direkt hier. Ich kann das schreiben. Unser Service. Punkt ist Holzdose. Hier möchte ich Pipe schreiben , weil wir ein paar Sachen drinnen machen müssen. Das ist meine Einsicht. Ich werde auch MAB hinzufügen und wir kommen hierher, da ein Argument Login-Eigenschaft ist. Jetzt hier drinnen wollen sie einfach überprüfen, ob wir uns angemeldet haben, also ist es wahr, dann wollen sie direkt true zurückgeben. Aber wenn wir falsch haben, möchte ich den Benutzer auf eine andere Seite umleiten. Hier brauchen wir auch einen Router. Also können wir hier privaten Router injizieren, und das ist unser Router, und wir können ihn hier benutzen. Also schreiben wir diesen Punkt-Router-Punkt-Navigieren nach URL. zum Beispiel mit dem Detektor Verwenden Sie zum Beispiel mit dem Detektor die zur Startseite. Wenn sie nicht eingeschlossen sind. Danach müssen wir false zurückgeben. Es ist obligatorisch, da dies im Wesentlichen ein Observable von Boolean ist und wir hier nicht nur etwas tun müssen, sondern auch false zurückgeben müssen. Und hier möchte ich nach URL navigieren, nicht nach leerer Zeichenfolge, sondern nur nach einem Schrägstrich. Und Sie könnten sagen, aber warum wir nicht zurückgekehrt sind, hören Sie sich das einfach an, denn dieses Locked-In ist ein Stream mit true oder false. Denn hier wollen wir auch route verwenden und nach URL navigieren, und wir können es tun, wenn wir einfach true oder false zurückgeben. Jetzt ist unsere Gouache fertig, aber wir müssen uns korrekt registrieren. Das ist mein inneres Modul. Hier innerhalb der Anbieter müssen wir unseren Eulen-Kabelservice anbieten , den wir gerade erstellt haben. Jetzt müssen wir eine Route überprüfen, unseren Routenquadranten, hier können wir sie aktivieren. Und im Inneren stellen wir ein Array mit unserem Authentifizierungsdienst zur Verfügung, was bedeutet, dass unser Outward Service überprüft, ob wir unter Verwendung unseres Streams in einem Knoten eingesperrt sind, wenn wir zur Anmeldung springen unser Outward Service überprüft, ob wir unter Verwendung unseres Streams in einem Knoten eingesperrt sind, wenn wir . Und wenn es false zurückgibt, werden wir auf die Homepage weitergeleitet. Schauen wir uns das an. Ich lade die Seite neu und wir erhalten einen Fehler. Die Klasse, unser quadratischer Service, kann nicht erstellt werden , da er keinen eckigen Dekorator hat. Und eigentlich hier Inside-Out-Quadrat habe ich vergessen, injizierbar zu schreiben. Vergiss es nicht. Das ist so hier. Lassen Sie uns injizierbare und runde Klammern setzen. Laden wir die Seite neu, aber wir haben keinen Fehler. Jetzt möchte ich versuchen, zu demselben Mittelwert zu springen. Ich schlage den gleichen Mittelwert. Und wie Sie sehen können, kann ich auf die Anmeldeseite zugreifen , da wir hier geschrieben haben, dass wir unseren Kader aktivieren können. Was bedeutet, dass wir auf diese Seite zugreifen können , wenn wir hier durchkommen . Was bedeutet, dass ich hier in unserer Anwendung unser Token entferne und sie die Anmeldung der Seite neu laden. Ich werde auf die Homepage weitergeleitet, weil sie aufgrund von can activate keinen Zugriff auf diese bestimmte Seite haben Zugriff auf diese bestimmte Seite haben, was tatsächlich bedeutet, dass wir erfolgreich implementiert die Seiten in zwei zu zugreifen verschiedene Möglichkeiten. Erstens durch die Verwendung der Komponente und zweitens durch die Verwendung der Angular-Funktion, die aktiviert werden kann. Aber tatsächlich haben wir dieses Owl Squared erstellt, nicht für die Anmeldung oder Registrierung, sondern für zukünftige Boards und die Portseiten, da es viele Anfragen nur für angemeldete Benutzer gab . Hier werde ich entfernen, kann aktivieren. Und sie wollen auch unseren Code wieder in Home Components Home ändern , denn hier sollten wir nicht auf Slash-Register umleiten, sondern auf Slash-Boards, die wir in unserem nächsten Video implementieren werden. 20. Gettings: In früheren Videos haben wir die Implementierung unserer Homepage abgeschlossen und jetzt beginnen wir mit einem neuen Abschnitt. Und das ist ein Pageboard. Also worum es auf dieser Seite geht, ist eine Seite, auf der wir die Liste der Boards des Benutzers abrufen, sie auf dem Bildschirm ausführen und ein neues Board erstellen können die Liste der Boards des Benutzers abrufen, . Hier willst du sicher fragen, okay, aber wir haben Socket IO. Verwenden wir Sockets, auf denen Sie genau auf dieser Seite sind? Und meine Antwort ist nein, weil wir Socket nicht verwenden müssen oder überall, wo wir dafür haben , ist TP gestern, viele Fälle, in denen wir Socket IO brauchen, aber sicher nicht für diese Seite. Warum nicht? Denn eigentlich ist dies die Seite, auf der wir für den aktuellen Benutzer eine einfachere zufällige Liste von Wörtern haben. Wir haben keine anderen Benutzer, die Zugriff auf diese spezielle Seite benötigen. Hier macht es keinen Sinn, hier Socket IO zu verwenden, aber keine Sorge, wir werden Socket Ion viel später auf der Single-Board-Seite verwenden . In diesem Video konzentrieren wir uns darauf, unser Board im Backend zu erstellen und die Liste der Boards von der API abzurufen. diesem Grund springen wir zurück von unserem Client zu unserem Server. Hier in unserem Quellordner, innerhalb von types, wollen wir eine neue Schnittstelle erstellen und nennen wir sie board, dot interface und dot ts. Board ist also unsere neue Einheit. Im Inneren werden wir unsere Board-Schnittstelle registrieren , die wir auf verschiedenen Seiten verwenden werden. Zum Beispiel auf der Seite mit der Liste der Boards und auf der Single-Board-Seite. Also hier wollen wir unsere neue Schnittstelle und dieses Board exportieren . Und die Frage ist, was wir in uns haben werden, genau wie wir es in unserem Benutzer getan haben. Wir werden hier eine solche Schnittstelle für das Board haben. Und wir werden hier ein Boarddokument haben, das das Dokument erweitert , um mindestens eine ID zu erhalten. Wir brauchen hier also kein NAD, aber wir brauchen mindestens einen Titel. Also muss jeder Port einen Titel haben. Zweitens haben wir es hier geschaffen, es ist ein Datum, und es wird auch ein Datum sein. Und tatsächlich haben wir hier auf der rechten Seite, Benutzer, wie Sie sehen können, keinen aktualisierten Kopf erstellt, aber er ist wegen Mongoose da, also können wir ihn auch hier schreiben. Das letzte Feld, das wir hier in unserem Board brauchen. Unser Board muss einigen Benutzern gehören. Hier müssen wir MAD des Benutzers retten , der dieses Board erstellt hat. Und dafür können wir hier die Benutzer-ID schreiben, und wir schreiben hier keine Zeichenfolge, sondern Schema-Punkttypen, Punktobjekt-ID. Jetzt müssen wir hier das Top-Schema von Mongoose importieren. Wie Sie hier sehen können, haben wir diese spezielle Notation, Schematypen, Punktobjekt-ID. Und genau so schaffen wir ein D in Mongoose. Darin ist also nicht nur eine Idee, das ist eine Objekt-ID, aber in dem Moment, in dem wir unsere API erstellen, wird diese Benutzer-ID einfach eine schnelle Zeichenfolge sein, sodass wir verstehen können, was Benutzer erstellt hat dieser spezielle Teil. Unser nächster Schritt besteht darin, unser Dokument für den Vorstand zu erstellen. Hier möchte ich eine Expertenschnittstelle haben und hier haben wir ein Word-Dokument, genau wie wir es auf der rechten Seite hatten. Hier wollen wir das Extents-Dokument verwenden und dieses Dokument kommt von Mongoose zu uns, also sollten wir nicht vergessen , es hier oben hinzuzufügen , da es in einem anderen Fall nicht funktioniert. Hier setzen wir einfach Klammern und nichts weiter. Wir haben hier also kein validiertes Passwort oder ähnliches, weil wir einfach das Dokument erweitern und mit entmutigenden Dingen Neues. Also haben wir erfolgreich unsere Board-Schnittstelle erstellt. Jetzt ist es an der Zeit, unser Modell zu erstellen. In Modellen erstellen wir also neue File Board Dot ts. Und wieder, genau wie wir es im Benutzer getan haben, werden wir unser Board-Schema erstellen. Also hier rechts öffne ich unseren Benutzer, damit wir einen Blick darauf werfen können. Zuallererst werde ich hier oben Schema und Modell importieren. Und jetzt wollen wir unser Board-Schema genauso erstellen , wie wir es für unseren Benutzer getan haben. Und hier sehen wir ein neues Schema und das ist Mungo-Schema. Und im Inneren stellen wir unser Board-Dokument zur Verfügung , das wir gerade erstellt haben. Danach haben wir runde Klammern und im Inneren müssen wir alle Felder unseres Boarddokuments bereitstellen. Das erste Feld hier wird betitelt sein. Was ist also Titel? Es ist eine Zeichenfolge. Nehmen wir also an, unser Typ ist string. Und zweitens ist es erforderlich, weil wir unser Board ohne Titel nicht erstellen können. Deshalb setzen wir hier erforderlich durch. Wie Sie hier sehen können, erhalten wir einen Fehler. Das Argument vom Typ title kann also nicht dem Parameter zugewiesen werden, was tatsächlich bedeutet, dass wir mit unserem Board-Dokument etwas falsch gemacht haben . Und sehen Sie sich unser Problem denn hier wurden aus dem Dokument erweitert, aber wir haben nicht von unserem Board erweitert, was tatsächlich bedeutet, dass all diese Eigenschaften nicht schnell verfügbar waren, wie Sie können sieh jetzt wir haben keine Fehler. Titel ist, dass wir jetzt nur noch die Benutzer-ID angeben müssen. Und hier drinnen müssen wir unseren Typ festlegen und es wird genau das gleiche Schema sein, Punkttypen, Punktobjekt-ID. Und der nächste ist in diesem Fall erforderlich, wenn nein, okay. Verwendung von Ray D ist ebenfalls obligatorisch. Danach müssen wir unser Modell exportieren. Hier wird ein Experten-Standardmodell sein , und wir geben einen Einblick als generisches Board-Dokument . Jetzt können wir unsere Klammern öffnen und machen den ersten Umfang, den wir hier bereitstellen, mit dem Namen Board. Und es gibt einen zweiten Parameter, unser Board-Schema. Wie Sie sehen können, haben wir unser Board genauso implementiert wie beim Benutzer. Aber Board ist viel einfacher, da wir hier keine zusätzlichen Methoden und die zusätzlichen Validierungen haben. Jetzt müssen wir den Controller eines neuen Boards erstellen. Und die Methode, Alberts reinzubringen. diesem Grund möchte ich, was ich tun möchte, in solchen Service-Quellserver-Tiers springen. Hier. Zunächst möchte ich eine neue Route registrieren und es wird app.get sein. Und wir haben hier Slash-API-Slash-Boards. Und dies ist die Liste, um alle Boards des aktuellen Benutzers zu erhalten. Hier wollen wir unsere OS-Middleware verwenden, denn wenn wir nicht angemeldet sind, können wir Boards bekommen. Wir müssen einen Benutzer haben. Und der letzte hier wird der Controller unseres Boards sein. Wir haben es nicht hier und hier, Punkt zum Beispiel, holen Sie sich Boards. Also müssen wir den Controller unseres Boards erstellen und hier die Board-Methode bekommen. Deshalb ganz oben. Zuallererst möchte ich unseren Stern als Board-Controller, Rom, eingeben , und hier werden Slash-Boards für Pfad-Controller sein. Und wir haben diese Datei noch nicht, also erstellen wir sie jetzt. Hier in Controllern kann ich Boards dot ts erstellen, und hier müssen wir eine neue Aktion erstellen. Hier werden wir es genauso machen wie in genauso machen wie unserem Benutzer-Controller. Zunächst müssen wir also oben unsere Anforderungsantwort und die nächste Funktion von Express eingeben . Danach können wir unsere neue Funktion get boards erstellen, die eine asynchrone Funktion sein wird. Und wir kommen zuerst hierher, unsere Anfrage und das ist Typanfrage, dann Antwort, es ist Typantwort. Und der letzte ist der nächste Typ, nächste Funktion. Und das wollen wir vorher hier try-catch schreiben , damit wir alles richtig handhaben können. Hier bekommen wir unseren Fehler und wir können ihn einfach in unsere nächste Ära werfen. Hier wird die nächste Ära sein. Jetzt muss unser Stamm versuchen, Logik dafür zuzulassen. Wir müssen hier unser Board-Modell injizieren , das wir bereits erstellt haben. Hier wird also ein wichtiges Board-Modell für Rom sein. Und hier, um zu tanzen, springen wir in das Schrägbrett der Modelle. Und jetzt können wir versuchen, alle Boards anhand einer bestimmten Benutzer-ID zu finden . Also hier wollen wir unsere Property Boards bekommen. Und hier verwenden wir einen Gewichtsbohr-Modell-Punktfund. Und wenn Sie es nicht wissen, findet find für uns alte Aufzeichnungen nach einem bestimmten Prädikat. Im Inneren können wir also ein Objekt mit betriebenem Wucher versehen T entspricht Anfrage dot Benutzer-Punkt-ID. Und wie Sie hier sehen können, erhalten wir direkt einen Pfeil von TypeScript, dass der Benutzer in der Anfrage nicht existiert. Und das ist völlig richtig. Nur um Sie daran zu erinnern, wir hier unsere eigenen benutzerdefinierten Anfragen mit einem Feld darin erstellt haben. Hier können wir eine Express-Anforderungsschnittstelle schreiben , und in diesem Fall wird es korrekt funktionieren, aber unser Anforderungsbenutzer kann es möglicherweise nicht definieren und dann funktioniert dieser Code nicht. Hier müssen wir es versuchen. Wenn wir keinen request dot user haben, dann wollen wir hier für 01 werfen. Also Rücksendeadresse, Sendestatus, und hier ist 401, genau wie wir es zuvor in einem Benutzercontroller getan haben genau wie wir es zuvor in einem Benutzercontroller getan haben. Also hier unten haben wir genau das Gleiche gemacht. Und jetzt müssen wir einfach mit unseren Boards antworten. Also hier können wir Rest Dot Sand schreiben, und wir schicken hier Boards. Und die zentrale, die Liste dieses Boards ist nur ein Array. Prüfen wir, ob es funktioniert. Wie Sie hier sehen können, fügen Sie den Server ein, dieser ist verbunden und es gibt keine Fehler. Also lasst uns in den Postboten springen. Lassen Sie uns hier eine Anfrage machen Slushy Pie Slash Boards. Und wie Sie hier in Headern sehen können, haben Sie bereits ein injiziertes Token weil wir diese Anfrage zuvor verwendet haben. Ich schlage hier Sand. Und wie Sie sehen können , bekomme ich ein leeres Array zurück , weil wir keine Boards haben. Nun die Frage, wie wir einige Boards bekommen können wenn wir immer noch keinen Kuchen haben, um ein Board zu erstellen. Und dafür können wir einfach in Mongo springen und diesen Port selbst erstellen. Das ist so hier. In der Konsole werde ich docker exec minus 80 MongoDB Mongo schreiben . Also wollen wir im Wesentlichen den Mongo-Befehl in unserem Container MongoDB aufrufen . Nur um Sie daran zu erinnern, dass Sie Darker hier nicht verwendet haben, sondern einfach MongoDB auf Ihrem Computer installiert haben. Dann müssen Sie nur noch die MONGO-Einfügekonsole schreiben und es wird funktionieren. Ich schlage hier ein, gib sie hier in der Konsole von Mongo ein. Jetzt müssen wir hier unsere Datenbank benutzen. Das ist der Grund, warum ich hier schreibe, benutze den Raum extrem lang. Und danach setzen sie Semikolon. Ich drücke die Eingabetaste. Und wie Sie hier sehen können, haben wir auf dB-HL-Trailer umgestellt. Jetzt können wir hier Semikolons für Show-Sammlungen schreiben, und wie Sie sehen können, sind dies unsere Sammlungen. Wir haben hier Boards und wir haben unsere Benutzer. Was wir jetzt tun wollen, wollen wir einen neuen Rekord in unsere Boards einfügen . Dafür können wir db dot, ports, dot insert schreiben , und hier haben wir eine Funktion, also runde Klammern und innerhalb eines Objekts. Und hier müssen wir bereitstellen , was wir einfügen wollen. In unserem Fall ist es nur der Titel, zum Beispiel das erste Board. Und wir müssen hier eine Benutzer-ID schreiben, aber hier sollten wir nicht die Zeichenfolge angeben VM muss eine Objekt-ID bereitstellen. Hier möchte ich den Doppelpunkt der Benutzer-ID und dann die Objekt-ID schreiben . Ich habe hier runde Klammern geöffnet und drinnen bin ich in unseren Stream eingefügt. Wie Sie sehen können, ist dies nicht nur Wucher, das Ende der Saite. Wir beginnen hier innerhalb Benutzer-ID und der Objekt-ID mit der Zeichenfolge. Und am Ende müssen wir ein Semikolon setzen. Ich drücke die Eingabetaste und wir erhalten das richtige Ergebnis. Und jetzt können wir hier versuchen, alle Datensätze in dieser speziellen Sammlung zu erhalten . Also db dot boards, dot find und runde Klammern. Ich drücke die Eingabetaste und wir erhalten nur ein Objekt mit ID. Und das ist die Idee unseres Boardtitels First Board und Benutzer AD ist eine korrekte Objekt-ID. diesem Grund können wir jetzt wieder in unseren Postboten springen, unsere API-Board-Anfrage auswählen und auf Senden klicken. Wie Sie jetzt sehen können, bekommen wir unser ASHRAE mit einem Objekt darin. Hier haben wir unsere ID und hier sehen wir sie als Zeichenfolge, Titel und Benutzer-ID, was eigentlich bedeutet, dass wir unser erstes Board erfolgreich von der Konsole aus erstellt haben und die Liste unserer Boards haben. Aber hier möchte ich das letzte kleine Thin verbessern, wie Sie hier sehen können, bekommen wir unsere IDs aus dem Backend mit Unterstrich. Und tatsächlich bekommen wir normalerweise von der API einen DES. Normalerweise ohne Unterstrich. Das ist nur die Sache von MongoDB, was bedeutet, dass es nicht so bequem ist, eine zu bekommen, das war ein Unterstrich im Frontend und will das nicht tun. Und in Mongoose gibt es eine Möglichkeit, dies zu tunen. Deshalb möchte ich wieder in unseren Code einsteigen , in Schwesternschaften. Und hier, zum Beispiel, nach unserer Konfiguration von Missbrauch, können wir hier Mungose-Punktsatz hier als ersten Parameter schreiben Mungose-Punktsatz hier als , den wir Jason zur Verfügung stellen. Und als zweiten Parameter stellen wir ein Objekt zur Verfügung. Und im Inneren sagen wir zuallererst, dass wir Charles fertig sind. Und zweitens transformieren. Und hier im transformierten haben wir zwei Argumente. Der erste wird unterstrichen und zweite wird umgewandelt. Und das ist die Funktion. Und innerhalb dieser Funktion wollen wir konvertierte Punkt-Unterstrich-ID löschen. Was wir hier überhaupt tun, hier können wir zur JSON-Methode wechseln, die in einer geschrieben ist . Hier stellen wir Transformation bereit, also sagen wir, wie wir sie transformieren werden. Und tatsächlich werden wir in Mongoose NAD zurückbekommen und die ID unterstreichen. Und hier werden wir nur aus der JSON-Unterstrich-ID entfernen, was eigentlich bedeutet, dass wir in Mongoose immer noch diese Unterstrich-ID haben. Wir können es sicher benutzen, aber wir werden es nicht in JSON bekommen, wir bekommen eine normale ID. Und vielleicht möchten Sie auch wissen, was virtuell stark ist , und Anstiftung steckt tatsächlich in Modellen. Wir können virtuelle Eigenschaften erstellen und standardmäßig innerhalb von Mongoose Whoop werden sie nicht zurückbekommen. Und eigentlich wollen wir sie zurückholen. Das ist, wo wir hier Virtuals schreiben, stimmt. Prüfen wir also, ob dieser Code funktioniert. Ich springe zurück zum Postboten und stoße auf Sand. Und wie Sie hier sehen können, erhalten wir genau die gleiche Antwort, aber wir haben keine Unterstrich-ID. Wir haben nur ein normales d, was eine Zeichenfolge ist. Und das ist genau so, als würden wir es im Frontend verwenden wollen . 21. Frontend für gettings: Im vorherigen Video haben wir erfolgreich implementiert, unsere Boards ins Backend zu bringen. Jetzt müssen wir mit unserem Frontend-Part-Festival beginnen. Dafür müssen wir unser Boards-Modul implementieren. Aber nur um Sie hier in Kundenquelle, App, Home-Komponenten, Home, Home Ts zu erinnern Kundenquelle, App, Home-Komponenten, Home, , haben wir sehr direkt auf den Schrägbrettern, wenn wir eingesperrt sind. Hier müssen wir zunächst unser Boards-Modul und innerhalb dieser Route implementieren, damit zumindest unser Code erfolgreich funktionieren kann. Hier im Inneren wollen wir neue Modulplatinen erstellen. Und dies ist ein separates Modul für eine einzelne Seite, auf der wir eine Liste der Boards haben und tatsächlich darin auch eine Komponente für ein einzelnes Board erstellen könnten . Aber ich möchte diese beiden Module wirklich trennen , weil sie zwei verschiedene sind. Das ist mein inneres Modul unseres Boards. Wir können Boards dot module.js erstellen. Und hier möchte ich nicht alles von Grund auf neu schreiben. Ich möchte das gesamte Modul komplett kopieren und einfach ändern. Also was haben wir hier? Zuallererst wird sich unsere Klasse Modul langweilen. Wir werden hier keine Deklarationen haben, Home-Komponente und wir brauchen hier und Sie Runde, aber hier brauchen wir keinen Pfad nach Hause, aber wir brauchen Pfadbretter. Und dieses Komponentenhaus gibt es hier nicht, also müssen wir es auf unsere neue Komponente, die Platinenkomponente, umstellen . Hier möchte ich eigentlich das tun, ich möchte, dass Inside Home-Komponenten dieses Home-Verzeichnis vollständig kopieren und hier in die Boards einfügen , in den Komponentenordner. Sie können also eigentlich Winkelgeneratoren verwenden , wenn Sie möchten. Ich möchte wirklich nur das Einfüge-Modul kopieren. Für mich ist es schneller. Also hier möchte ich diese Komponenten in Boards umbenennen, und das ist unsere Hauptkomponente von Modulplatinen. Und darin haben wir zwei Akten. Zuallererst, Boards Komponenten-HTML. Zweitens, Boards Komponente ts. Hier im HTML können wir einfach alles entfernen und einfach Boards schreiben, damit wir überprüfen können, ob es funktioniert. Jetzt können wir in unsere Board-Komponente springen. Und hier können wir zunächst unseren Selektor ändern und wir können hier Boards schreiben und unsere Vorlagen-URL wird eine wichtige Komponente HTML sein. Jetzt hier drinnen haben wir unsere Klasse, die Boards Komponente ist, und hier müssen wir Geräte entfernen. Wir brauchen es vorerst nicht. Und sie werden den gesamten Code aus unserer Board-Komponente entfernen, und wir können auch alle Eingaben entfernen. Deshalb haben wir erfolgreich unsere neue leere Platinenkomponente erstellt unsere neue leere Platinenkomponente und können sie jetzt in unserem Boards-Modul verwenden. Hier können wir Board-Komponenten schreiben und dies tun. Gib es hier oben automatisch ein. Und jetzt haben wir hier eine Route für Schrägstriche. Und hier in Deklarationen können wir unsere Board-Komponente definieren. Und der letzte Schritt, den wir nicht vergessen sollten, ist, dass wir das Modul dieses Boards in unserem App-Modul registrieren müssen . Also hier in unseren Eingängen müssen wir Boards Modul hinzufügen. Prüfen wir, ob es funktioniert. Ich habe hier im Webserver keine Pfeile. Jetzt möchte ich auf unsere Seite springen und neu laden. Und wie Sie sehen können, wo auf Schrägstrichen steht, ist hier unser Text. Wenn ich hier auf der Homepage springen werde, komme ich direkt zum Board, weil ich eingesperrt bin. Lassen Sie uns nun prüfen, ob wir zurückgeleitet werden. Wenn wir uns nicht anmelden. Dazu können wir zum Beispiel einfach Token entfernen und die Seite neu laden. Und wie Sie hier sehen können, werden wir nicht autorisiert, aber wenn sie nicht zur Homepage zurückgeleitet werden. Und das Wesentliche dafür ist, dass wir in unserem Haus Dienstleistungen r quadriert erstellt haben, und wir können dieses R-Quadrat jetzt in unserem Board-Modul verwenden . Also innerhalb von Boards, innerhalb der Boards Modul Ts hier auf der Route, die wir anbringen können, können aktiviert werden. Und hier müssen wir ein Array mit World Service bereitstellen , das wir zuvor erstellt haben. Es ist völlig in Ordnung, es einfach so zu benutzen. Wir müssen es hier nicht registrieren. Wie Sie hier sehen können, gibt es keine Fehler. Laden wir also die Seite neu. Wie Sie jetzt sehen können, können wir nicht zu unseren Schlammsportarten springen und wurden auf die Homepage weitergeleitet. Was eigentlich bedeutet, dass r aktivieren kann , funktioniert ordnungsgemäß. Und jetzt können wir mit nur einer einzigen Zeile definieren, welche Seiten nur für eingeloggte Benutzer erlaubt sind. Also haben wir erfolgreich unser Boards-Modul erstellt, und jetzt möchte ich eine Port-Schnittstelle erstellen. Und wir könnten es innerhalb des Boards-Moduls erstellen. Aber eigentlich möchte ich hier in AB einen neuen Ordner erstellen und ihn als freigegeben bezeichnen. Denn eigentlich möchte ich alle Typen, die wir überall verwenden, in diesen freigegebenen Ordner legen . Zum Beispiel eine Aufgaben-Spalte. Dies sind alles gemeinsame Entitäten, die wir in verschiedenen Modulen verwenden können. Gleiches gilt die Dienste oder Dienste, die gemeinsam genutzt werden, wie Board-Service, Einplatinendienst, Säulendienst, Aufgabendienst. Wir könnten es in ein bestimmtes Modul einfügen, aber ich möchte wirklich all diese Dinge dort platzieren, wo wir nur Daten für den Shared Service abrufen. Deshalb haben wir hier AB geteilt. Und hier möchte ich zunächst neue Ordnertypen erstellen. Und jetzt können wir in unseren App-Shot-Typen einen neuen Typ definieren, und es ist eine Board-Punkt-Schnittstelle. Ts. Und lassen Sie uns hier unsere neue Oberfläche exportieren. Und dies wird eine Schnittstelle unseres Boards sein und wir müssen es Port-Schnittstelle nennen. Und im Inneren müssen wir genau die gleichen Felder definieren , die wir im Backend erstellt haben. Und zuallererst ist hier NAD, es ist eine Zeichenfolge. Zweitens ist es title, es ist auch string. Außerdem haben wir hier geschaffen, dass dies angespannt ist und das letzte aktualisiert wird. Es ist auch eine Zeichenfolge. Und tatsächlich bekommen wir hier zusätzlich eine Benutzer-ID, nur um Sie hier in unseren Server-Quellmodellen daran zu erinnern und hier haben wir unser Board. Wir haben userID, was eigentlich bedeutet, dass wir hier auch die Benutzer-ID bekommen und es ist eine Zeichenfolge. Unsere Schnittstelle für Single Boyd ist komplett fertig und wir können sie in jeder Komponente verwenden. Jetzt möchte ich den Service für die Arbeit mit Boards erstellen. Und tatsächlich werden alle Anfragen wie Board erstellen, sich langweilen, Boards holen, Board löschen in den Service gehen. Hier in Shared möchte ich einen neuen Ordner erstellen und ihn Services nennen. Und dann sagen wir werden einen neuen Dienst erstellen, der Boards service dot ds heißt . Also hier definieren wir jetzt unsere neue Klasse. Hier haben wir einen erstklassigen Board-Service, und wir müssen darauf schreiben injizierbar, damit wir es überall verwenden können. Die erste Methode, die wir hier definieren wollen , ist get boards. Genau darauf sind wir bereits im Backend vorbereitet. Also hier sind unsere Get Boards und wir müssen hier keine Argumente angeben. Und wir werden ein Observable mit einem Strahl unserer Bretter zurückbekommen . diesem Grund können wir hier ein Port-Interface-Array schreiben. Das ist genau das, was wir gerade definiert haben. Jetzt innerhalb dieser Get Boards wollen wir sicherstellen, dass HTP Anfrage. Deshalb müssen wir hier versuchen zu konstruieren und zu injizieren. Hier sind die HTTP- und HTTP-Clients. Jetzt möchten wir in unseren Boards eine URL erhalten, genau wie zuvor für den Benutzerdienst. Also hier haben wir unsere URL und es ist Umgebung. Keine API-URL zu uns. Und hier ist ein Schrägbrett. Das ist genau unser Kind. Jetzt können wir diesen Punkt http.get zurückgeben, und wir möchten unsere URL ohne Optionen erhalten. Und wie Sie hier sehen können, erhalten wir offensichtlich einen Fehler. Observable Object kann nicht beobachtbaren Board-Schnittstelle zugewiesen werden. Hier müssen wir wie zuvor angeben, dass wir wieder in eine Reihe von Boards zurückkehren, damit unsere Dienste vollständig bereit sind und sie es nur testen wollen. diesem Grund möchte ich hier zurück in unser Boards Boards Modul springen in unser Boards Boards Modul und wir müssen zuerst den Service hier innerhalb der Anbieter injizieren . Hier können wir schreiben, dass wir hier Boards Service haben, und es ist schnell verfügbar. Jetzt dürfen wir in unsere Komponente springen, die hier injiziert wird. Zunächst möchte ich unseren Konstruktor definieren und wir wissen, dass wir hier Boards-Service haben und dies ist unser Boards-Service. Jetzt möchte ich hier zusätzlich Implementierungen darauf schreiben . Und jetzt nicht initialisiert, wollen sie diese Liste unserer Boards abrufen. Hier haben wir also unsere Energie drin und im Inneren können sie einfach diesen Board-Service schreiben, Boards besorgen, abonnieren, damit wir das Ergebnis erhalten. Hier ist ein Ergebnis. Eigentlich sind das Boards und sie wollen nur protokollieren, was wir zurückbekommen. Also hier holen wir unsere Bretter, Koma-Boards. Prüfen wir, ob es funktioniert. Aber ich habe hier im Frontend-Webserver keine Pfeile . Und lass uns jetzt wieder einloggen , weil wir gesperrt sind. Also hier werde ich unser Foo auf gmail.com zur Verfügung stellen. Wie Sie jetzt nach dem Einloggen sehen können, komme ich aber in Schrägstriche. Und hier in der Konsole können wir Bretter sehen. Und dies ist ein einzelnes Board, während wir es bekommen, weil im vorherigen Video in der Konsole erstellt wurden , um den Kuchen an diesem Punkt und im Wesentlichen diese Unterplatinen für unseren aktuellen Benutzer zu testen diesem Punkt und im Wesentlichen diese . Warum ist das so? Weil sie tatsächlich hier sind, ist unsere Backend-Anfrage. Hier finden wir unsere Boards nach Benutzer-ID, was bedeutet, dass wir alle Boards dieser Anforderungs-Benutzer-ID finden , von denen wir diese Benutzer-ID aus unserer Netzwerkanfrage erhalten . Hier ist die Anfrage unseres Vorstands und hier sind unsere Header. Und wie Sie hier in den Kopfzeilen unten sehen können, haben wir diese Berechtigung und hier ist unser Token. Dies sind genau die Informationen , die unser Backend benötigt , um schnell korrekte Daten des aktuellen Benutzers zu liefern . Wie Sie sehen können, funktioniert das Erhalten der Boards innerhalb des Moduls korrekt. Und wir haben unseren Service erfolgreich vorbereitet , um eine Liste der Boards für den Kunden zu erhalten. 22. Inline-Formular: In diesem Video möchte ich über ein zusätzliches Modul sprechen , das normalerweise live für unsere Anwendung erstellt werden soll. Und ich spreche hier von einem Inline-Formular. Werfen wir einen Blick auf das vollständig abgeschlossene Projekt , das wir implementieren. Wie Sie hier sehen können, bin ich auf der Slash-Sportseite und hier habe ich gerade einen Benutzer erstellt. Wir haben also überhaupt keine Boards. Und hier haben wir ein Create-Board. Wie Sie sehen können, ist dies nur ein Quadrat mit einigen Texten. Aber wenn ich darauf klicke, kannst du hier eine Eingabe ohne Platzhalter sehen, wir können hier zum Beispiel foo board tippen und wir drücken die Eingabetaste. Und danach wird unser Board direkt erstellt. Hier. Wir sehen diese Karte wieder, und dies ist im Wesentlichen ein Beispiel für ein Inline-Formular. Also haben wir hier ein Quadrat mit dem Text. Dann klicken wir hier und aktivieren einen Bearbeitungsmodus, in dem wir einfach etwas eingeben und die Eingabetaste drücken. Die einfachste Lösung wäre also, diese Komponente einfach zu erstellen und in unsere Boards zu werfen . Aber dann springen wir in ein einziges Board. Hier links haben wir genau das Gleiche. Du kannst hier den Titel unseres Boards sehen ich hier klicke und wir werden in den Bearbeitungsmodus versetzt. Hier sehen wir den Titel unseres Boards, aber jetzt können wir ihn ändern, um ihn zu aktualisieren Enter und Web-Datum, den Titel unseres Boards, zu drücken , genau das, was wir hier mit der Liste haben. Dies sind nur einige Texte, die hier versteckt sind und wir bekommen hier nicht nur eine Eingabe, sondern zumindest auch einen Button. Und wie Sie sehen können, unterscheiden sich die Stile in jedem einzelnen Fall, aber es macht nicht viel Sinn, zusätzliche Komponenten für jeden einzelnen Fall zu erstellen , z. B. ein Onboard zu erstellen, das Aktualisieren des Name des Boards, dann erstellen Sie eine Aufgabe, erstellen Sie eine Spalte usw. Denn auch in unserer Spalte können wir die Aufgabe hinzufügen und dies ist auch eine Inline-Firma. diesem Grund wäre es ein wirklich kluger Ansatz, eine einzige Komponente zu schaffen , die alle unsere Bedürfnisse abdecken kann. Welche Fälle haben wir also? Zuallererst haben wir auf jeden Fall ein Markup. Dann haben wir einen Bearbeitungsstatus , wenn wir einfach auf das Element klicken. Aber wie Sie sehen können, kann das Markup völlig anders sein. Aber was anders ist, ist nicht das Markup, es ist nur Stil es tatsächlich, wenn wir hier überprüfen, wie Sie sehen können, ist dies eine Inline-Schriftart, die ich erstellt habe , und wir fügen einfach hier Create Task Formular hinzu. Die Hauptidee ist, dass all diese Klassen global verfügbar sind und wir sie einfach mit CSS ändern können. Innen waren verschiedene Dinge vorgesehen . Zum Beispiel können wir zunächst einen Text eingeben, der hier angezeigt wird, wie zum Beispiel im aktuellen. Wir können hier aber auch diesen Text wie den Namen unseres Boards zeigen . Jetzt sind wir hier versteckt, Edit und vielleicht möchten wir diesen Text im Bearbeitungsformular propagieren. Aber hier mit einer Aufgabe müssen wir das nicht tun. Aber auch hier haben wir einen Fall, in dem wir einen Einkaufswagen-Button haben und nicht nur eine Eingabe. Alle diese Fälle müssen sich also in dieser einzelnen Komponente befinden , um reibungslos zu funktionieren. Versuchen wir jetzt, diese Komponente zu erstellen. Und diese Komponente ist super teilbar. Deshalb möchte ich es in AB srand packen. Und hier wollen wir die Ordnermodule erstellen. Hier fragst du dich vielleicht, okay, aber wir sprechen über Komponenten. Ja, Sie haben völlig Recht, aber Sie können keine Komponenten ohne Modul verwenden. Sie können entweder eine Komponente in einem Modul registrieren oder Sie können ein Modul injizieren , und das Injektionsmodul ist viel besser, da Sie definieren können , welche Komponenten Sie außerhalb zulassen möchten und was ist nicht. Dies ist normalerweise der Punkt, an dem wir eine Komponente teilen möchten. Ich empfehle Ihnen dringend, ein Modul dafür zu erstellen. Hier haben wir Module und können einen neuen Ordner erstellen , der ein Inline-Formular sein wird. Und das ist genau das richtige Formular für all diese Fälle. Jetzt springen wir hinein und erstellen hier Inline-Formular dot module.js. Und hier müssen wir unsere Klasse exportieren, die ein Inline-Formularmodul ist. Jetzt oben auf einem, um unser NG-Modul zu injizieren , wie wir es zuvor getan haben. Und hier wollen wir interne Eingänge , um unser gemeinsames Modul hinzuzufügen. Der nächste Schritt besteht darin, unsere Komponenten zu erstellen. Hier haben wir also einen Komponentenordner, und hier drinnen haben wir unser Inline-Formular mit zwei Dateien. Erstens in Live-Form Punkt-Komponente, Punkt ts und zweitens Inline-Formular-Punkt-Komponente Punkt-HTML. Versuchen wir es jetzt einfach in einigen Texten, zum Beispiel in Zeilenform. Und lassen Sie uns von hier aus in unser Inland springen, Experte, unsere Klassen-Inline-Formularkomponente. Jetzt müssen wir hier oben unsere Komponente definieren. Im Inneren können wir einen Selektor bereitstellen, und diese Selektoren werden nur ein Inline-Formular sein. Und hier müssen wir auch eine Vorlagen-TRL bereitstellen. Dies ist Inline-Formular-Komponenten-HTML. Unsere Basiskomponente ist also bereit, wenn Masse jetzt im Modul registriert ist. Also hier zunächst, unsere Deklarationen, werden wir hier eine Inline-Formularkomponente haben. Und zweitens, und es ist sehr wichtig, dass Experten hier die Verwendung dieser Komponente im Freien zulassen wollen. diese Weise fügen wir hier eine Inline-Formularkomponente innerhalb des Experten-Arrays hinzu . Lassen Sie uns nun zurück in unsere Komponente springen und einige Eingaben wie zuvor in diesem Set definieren. Zunächst möchten wir einen Titel für unser Inline-Formular angeben . diesem Grund haben wir hier einen Eingabetitel und dies ist eine Zeichenfolge, und standardmäßig ist es eine leere Zeichenfolge. Es ist jedoch wichtig, zwischen dem Titel des Formulars zu unterscheiden. Das wollen wir ändern und nur die Texte, die wir zeigen, weil wir in verschiedenen Fällen unterschiedliche Dinge brauchen . Sie möchten beispielsweise einen Standardtext ausführen, aber wenn Sie auf unserem Telefon versteckt sind, möchten Sie einen anderen Text rendern. Und das ist im Wesentlichen Titel, aber wir brauchen jetzt auch hier als Standardtext, das ist es, was wir rendern, wenn wir unsere Firma nicht aktiviert haben. Lassen Sie uns hier Standardtext erstellen, und das ist eine Zeichenfolge. Und hier möchte ich eine wirklich nette Wendung machen. Ich möchte hier schreiben, nicht definieren. Und das ist im Wesentlichen das, was ich Ihnen empfehle, viel zu tun wenn Sie gerade anfangen, etwas zu implementieren , oder sogar für die Produktion, wenn Sie nicht sicher sind , ob Sie einige Daten haben, ist es viel besser, dies nicht zu tun es als nur undefiniert oder nur eine leere Zeichenfolge. In diesem Fall können die Leute direkt sehen, dass der Wert nicht da ist und nicht kaputt ist. Haben Sie auch einen Fall, wenn wir eine Schaltfläche anzeigen wollen, hier müssen wir eine weitere Eingabe erstellen, hat eine Schaltfläche und es ist boolesch. Und standardmäßig ist es falsch, was bedeutet, aber nicht rendern. Wenn wir eine Schaltfläche haben, möchten wir den Text auf dieser Schaltfläche ändern. Hier wird unsere Eingabe mit Schaltflächentext sein und es ist eine Zeichenfolge. Und standardmäßig möchten sie es auf Senden festlegen da dies die beliebteste Art des Textes ist. Danach möchten wir manchmal auch einen Platzhalter für unseren Beitrag bereitstellen. Hier wird mit Eingabe-Platzhalter eingegeben, und dies ist eine Zeichenfolge, und standardmäßig ist es eine leere Zeichenfolge. Und das Letzte , was wir brauchen, ist ein Eingabetyp, weil wir einen Fall haben , in dem wir ein Massentrend sind und keine Eingabe, sondern eine Textarea. Hier möchte ich Eingaben mit dem Eingabetyp schreiben, und das ist nur eine Zeichenfolge. Wir könnten hier ein Enum erstellen, aber ich lasse es wie eine Zeichenfolge. Standardmäßig können wir schreiben, dass dies nur eine String-Eingabe ist. Und in dem Moment, in dem wir den Textbereich schreiben wollen, werden wir hier einen String-Textbereich bereitstellen. Jetzt müssen wir hier auch eine Ausgabe definieren. Dies sind die Werte , die wir nach dem Absenden eines Formulars weitergeben möchten . Das ist hier, Lassen Sie uns einen endlosen Ausgabenamen definieren , den es mit Submit behandelt. Und das ist ein neuer Event-Emitter. Und hier gibt es einen wichtigen Punkt. Wir müssen es vom eckigen Kern und nicht vom Knoten eingeben und dann einen neuen Ereignis-Emitter hinzufügen. Wir möchten die Art von Daten bereitstellen , die wir zurückerhalten möchten. Und es wird eine Zeichenfolge sein, weil wir in der Substantivform nur eine einzelne Zeichenfolge haben , die wir zurückgeben möchten. Auch hier müssen wir die lokale Eigenschaft zu handhaben standardmäßig bearbeitet werden, wir müssen edit auf false setzen, und dann aktivieren wir die Bearbeitung, wir setzen sie auf true. Dies ist y hier ist die Bearbeitung ein boolescher Wert und standardmäßig wird es falsch sein. Und zu guter Letzt wollen wir hier eine reaktive Form erstellen. Hier möchte ich den Insight-Konstruktor privat bereitstellen , wenn b und das ist Formulargruppe und wir haben bereits zuvor ein reaktives Formular für unsere Registrierung erstellt. Hier werden wir genau dasselbe verwenden, aber wir erstellen hier einfach ein Formular. Und hier können wir diese Punkt FB Punktgruppe schreiben. Wir müssen innerhalb unserer Felder sorgen. Und in unserem Fall haben wir nur einen Titel. Und hier können wir sagen, dass dies eine leere Zeichenfolge ist. Und eigentlich habe ich hier einen Fehler gemacht. Wenn b keine feste Gruppe ist, ist es tatsächlich Form Builder. Also hier brauchen wir noch einen Input. Lassen Sie uns nun einen Markt schreiben, damit Sie die logische Beta verstehen. Also hier möchte ich in HTML springen und wir brauchen diesen Text nicht. Jetzt hier wollen wir zuerst ein div erstellen, und dieses div wird unser Standard-Div mit etwas Markup sein. Deshalb brauchen wir hier eine Klasse , die wir global und immer wieder verwenden können, richtig, für unsere Bedürfnisse. Also hier können wir Inline-Formularcontainer schreiben. Auch hier schreiben wir keine Styles für unseren Inline-Formularcontainer. Jeder einzelne Anwendungsfall muss seine eigenen Stile erstellen. Auch hier möchte ich eine weitere Klasse erstellen auch zum Stylen, wenn ich im Bearbeitungsmodus Hier werde ich in der G-Klasse erstellen. Und hier stelle ich ein Objekt zur Verfügung, Whiskyglas in Line Dash, Armaturenbrett-Behälter. Also der gleiche Name, Dash Editing. Hier stellen wir den Wert der Bearbeitung zur Verfügung, die wir gerade erstellt haben. Die Hauptidee ist , dass wir genügend Klassen erhalten , damit andere Entwickler diese Komponente verwenden und sie für jeden einzelnen Status richtig stylen können. Und das letzte, was hier ist, ist natürlich ein Klick. Wir wollen unsere Bearbeitung aktivieren. Erstellen wir also hier eine neue Funktion, aktivieren die Bearbeitung und müssen hier nichts angeben. Definieren wir nun diese Funktion. In unserer Datei hier unten können wir also die Bearbeitung aktivieren und was dies aktiviert hat und was es tut. Legen Sie zunächst fest, dass dieser Punkt bearbeitet wird auf true, aber es ist nicht alles. Wir haben einen Fall, in dem wir den Wert sehen wollen , den wir ändern wollen. Zum Beispiel haben wir ein Bearbeitungsformular wie ein lustiger Name des Boards. Und dafür haben wir in diesem Eingabetitel angegeben. Aber wie Sie in unserer Firma sehen können , ist der Titel leer, was richtig ist. Aber in unserem Fall, wenn wir zur Bearbeitung übergehen, wollen wir unseren Titel festlegen. Deshalb können wir hier schreiben, wenn wir einen Titel haben. Also wenn wir this.title haben, dann wollen wir es in unser Formular einfügen. Und dafür können wir diesen Punkt-Tonhöhenwert in Punktform schreiben. Und im Inneren befindet sich ein Objekt mit Titel, dieser Titel. Was macht diese Zeile also, wenn wir sie bei der Bearbeitung aktivieren und ihr einen Titel geben , dann werden wir unseren Wert des Formulars mit dem Funktions-Pitch-Wert aktualisieren . Kehren wir nun zu unserem HTML zurück. Also innerhalb eines Divs mit Festival eins, um ein Div zu erstellen , das wir zeigen werden, wenn wir nicht in der Schnittphase sind. Und das ist nur ein Text mit Klasse, die wir stylen können. Das ist hier, Div-Klasse. Hier werden wir Inline-Formulartext sein. Und hier wollen wir diesem DFF nur einen zeigen. Wir sind nicht im Editor und sagen das hier so ist, NADH editiert. Dann zeigen wir dieses Div und innerhalb eines, um unseren Standardtext zu rendern , den wir in der Eingabe erhalten. Und danach erstellen wir unser Formular, genau wie bei der internen Registrierung. Es ist also eine reaktive Form und eine gut definierte Formulargruppe. Hier können wir also unsere Formulargruppe bereitstellen. Dies ist unser Formular und wir werden auch hier NG Submit haben. Und wir müssen die onsubmit-Funktion erstellen. Aber lassen Sie uns mit diesem Formular hier abschließen. Zunächst möchten wir dieses Formular in der Bearbeitungsphase nur einen Takt rendern . diesem Grund wird in GE bearbeitet. Und wir werden auch eine Klasse für das Styling bereitstellen wollen und wir nennen sie einfach Inline-Form. Springen wir jetzt zurück in diese Datei und erstellen hier unsere onsubmit Funktion. Und hier ist der knifflige Teil. Wir könnten ein Formular öffnen, keinen Wert angeben und dann einfach die Eingabetaste drücken. Und das wollen wir nicht ausstrahlen. Es macht keinen Sinn, eine leere Zeichenfolge zu treffen. Also hier wollen wir es überprüfen. Wenn wir nur diese Punktform, Punktwert, Punkttitel Punktwert, Punkttitel haben, dann wollen wir sie ausgeben. Und für ein Fleisch haben wir dieses Punkt-Handle, das eine Mitte einreicht, und im Inneren geben wir diesen Firm Value Dot-Titel an, was eigentlich bedeutet, dass wir, wenn wir dieses Formular einreichen und eine leere Eingabe haben, wollen wir sofort was wir tun wollen nachdem wir unsere Ohren schließen wollen Bearbeitungsstatus, diesem Grund ist edit gleich falsch. Und wir werden auch unsere Firma auf den Ausgangszustand zurücksetzen wollen . Aus diesem Grund erhalten wir diese Punktform Punkt-Reset und diese Funktionalität, die wir von Angular aus der Box bekommen . Kehren wir nun zu unserem HTML zurück. Hier haben wir ein Formular. Jetzt müssen wir eine Eingabe definieren. Also hier erstellen wir eine Eingabe mit einem Typtext. Und wir kommen hier innerhalb des Formularkontrollnamens. Und wenn in dieser blumigen reaktiven Form, hier haben wir unseren Namenstitel, wollen wir auch hier eine Klasse für das Styling erstellen. Also hier Klasseneingabeformular Eingabe. Wir möchten hier auch unseren Platzhalter angeben und wir erhalten ihn aus der Eingabe. Es ist also ein Eingabe-Platzhalter und wir wollen diese Eingabe rendern. Nur einer, der den richtigen Typ im Inneren angegeben hat. Hier ist NG IV mit Eingangstyp, wobei unser Eingabetyp der Eingabe entspricht. Und jetzt wollen wir genau die gleiche Breite textarea machen. Also haben wir hier bei Exterieur und wir wollen unseren Textbereich direkt schließen. Und jetzt wollen wir drinnen diesen NG IV überprüfen. Also hier ist unser Eingabetyp gleich textarea, dann werden wir randy. Aber wir müssen hier auch einen Formularkontrollnamen angeben, und dies wird auch ein Titel sein. Und wir müssen auch hier eine Klasse anbieten. In diesem Fall ist die Klasse dieselbe Eingabeformular-Eingabe, die Klasse dieselbe Eingabeformular-Eingabe und nachdem sie sich über die Maske erstreckt, erstellen Sie eine Schaltfläche zum Senden. Hier in der Schaltfläche und im Inneren haben wir unseren Text, Schaltflächentext, den wir von der Eingabe erhalten. Und wir wollen diesen Button nur rendern , wenn wir eine richtige Eingabe haben. Also, wenn wir einen Input hat Button haben, dann werden wir ihn rendern. Dann wollen wir hier den Typ submit, und hier wollen wir ihn deaktivieren, wenn er ungültig ist . Hier ist er deaktiviert und wir können form dot invalid verwenden. Und danach werden wir auch eine Klasse hinzufügen wollen , um sie zu stylen. Und hier wird die Inline-Formularschaltfläche sein. Und tatsächlich ist mit diesen Eingabeformular komplett fertig. Also was wir hier machen, wir haben ein div, wir haben hier die Bearbeitung aktivieren. Wir haben hier verschiedene Klassen für jedes einzelne Element hier wurden in unserem Standardtext gerendert und hier ist unser Formular mit Eingabe oder Textarea und Button, wenn wir es brauchen. Im nächsten Video werden wir versuchen, unsere Firma im Inland den Anwendungsfall der Erstellung des Boards einzusetzen. 23. Implementierung eines Vorstands: Im vorherigen Video haben wir unser Inland-Formular erfolgreich vorbereitet, aber es ist nicht klar, wie wir es verwenden werden, indem wir es gerade mit allen möglichen Werten erstellt haben. In diesem Video werden wir es verwenden wollen, aber wir haben nichts auf unserer Board-Seite. Dies ist die Art und Weise, wie wir in unser Inlandformular einfügen. Wir müssen auch unsere Board-Seite erstellen. Und hier haben wir hauptsächlich Online-Markups weil wir bereits Zugriff auf unsere Boards haben, weil wir bereits die get board-Methode erstellt und sie abonnieren, um unsere Boards zu erhalten. Beginnen wir also mit unserem Markup hier können wir die Sportwelt entfernen. Und zuallererst möchte ich oben schreiben, weil wir in diesem Video unsere obere Leiste nicht implementieren, aber wir sollten nicht vergessen, dass wir sie später implementieren müssen. Und hier können wir unser Markup starten. Zuallererst haben wir hier Boards, Seitencontainer. Jetzt schließen wir dieses Div und drinnen haben wir ein weiteres Div mit der linken Seitenleiste der Klasse Home. Hier schließen wir unser Div. Und tatsächlich erstellen wir hier unsere Seitenleiste auf der linken Seite und im Inneren haben wir Links zu unseren verschiedenen Seiten. diesem Grund haben wir hier einen Router-Link und möchten hier einen Link auf Slash-Boards bereitstellen. Danach müssen wir hier auch eine Klasse hinzufügen, Seitenmenüoption Boards. Auch hier wollen wir den Link halite wenn es inaktiv ist Route und ein Angular dafür haben wir ein spezielles Attribut, das Router Link aktiv genannt wird. Und eigentlich ist es eine Richtlinie. Und dann gesagt, wir können angeben, welche Klasse Put bekommen möchte. In unserem Fall möchten wir eine Seitenmenüoption für Klassenbretter auswählen. Schließen wir unser a hier und drinnen. Versuchen wir es mit Texten. Es sind auch Bretter. Lassen Sie uns hier einen weiteren Link setzen, der zu Hause sein wird. diesem Grund werde ich diesen Router-Link komplett kopieren und einfügen . Router-Link derselben Klasse ist aktiv. Hier können wir nicht Boards schreiben, sondern nach Hause, aber auch hier wollen wir damit aktive Routerlink-Optionen schreiben , denn eigentlich haben wir hier Link-Slash geroutet und wir haben in jeder einzelnen Routerverbindung einen Schrägstrich. diesem Grund hebt dieser aktive Router-Link immer dieses Element hervor, das wir vermeiden möchten. diesem Grund müssen wir aktive Router-Link-Optionen bereitstellen. Und hier drinnen stellen wir ein Objekt mit field exact true zur Verfügung. In diesem Fall werden wir diese Lean-on-Schleife hervorheben und wir haben ein volles Netz auf dem Schrägstrich. Und aus unserer Sicht ist es eigentlich nicht sehr sinnvoll diese beiden verschiedenen Verbindungen herzustellen. Denn wenn wir eingesperrt sind, aber nicht auf unser Zuhause zugreifen können , werden wir direkt auf unsere Board-Seite weitergeleitet. Aber das ist das Markup , das wir von dem Projekt erhalten. Also implementieren wir einfach das, was wir hinter unserer Seitenleiste haben. Wir müssen einen Hauptteil mit unserem Container für die Boards erstellen , hier wird div Klasse Boards Abschnitt Container sein . Jetzt schließen wir hier div und drinnen wollen wir ein weiteres div erstellen. Hier werden wir Div-Klasse meine Boards haben. Schließen wir dieses Div und darin wollen wir eine weitere Klasse mit einem Header erstellen. Das ist so hier, div class, my Boards Abschnitt Header und innen müssen wir eine weitere Klasse erstellen. Und es wird der Seitenkopf und der Name der Glasbretter sein, und im Inneren werden wir es versuchen. Meine Boards. Nach unserem Header wollen wir unsere Liste rendern. Das ist so hier. Wir werden eine Div-Board-Kachelliste haben, da wir hier jedes Board als Kachel haben werden. Hier können wir unser Div schließen und innerhalb dieses Divs möchten wir unser Inline-Formular rendern. Ich werde es in einer Sekunde beenden, weil ich vorerst gerade unser Markup beenden möchte. Und nachdem wir die Gruppe eins inline bilden, rendern wir alle unsere Kacheln, die Boards sind. Und dafür schreiben wir hier unser Diagramm, also einen Router-Link. Und hier wollen wir einen Link zu jedem einzelnen Board bereitstellen. Hier haben wir einen dynamischen Parameter. Hier können wir also ein Array mit Schrägstrichen bereitstellen. Und der zweite Parameter, den wir hier eingefügt haben, Komma-Board-Punkt-ID. In diesem Fall werden wir zu jeder einzelnen Platine eine korrekte Routerverbindung generieren . Aber um hier Zugriff auf das Board zu bekommen , müssen wir schreiben und G for loop. Das ist so hier in G4 und wir durchlaufen unsere Boards. Also hier lass Board of Boards, und hier werden wir auch unsere Klasse verpassen. Also hier sollten wir eine Board-Kachel haben und schließen wir diese a. Jetzt wollen wir in unserem a-Link ein div mit Klassen-Board-Kachel-Detailnamen angeben . Schließen wir dieses Div und rendern einfach innerhalb des Namens. Es wird sich langweilen Kachel und sie werden Markup ist vollständig fertig. Prüfen wir, ob es funktioniert. Ich habe hier tatsächlich einen Pfeil weil sie Property nicht richtig benutzt haben. Hier sollten wir doppelte Klammern setzen und keine einzelnen Klammern. Lass uns nochmal nachsehen. Wir haben eine Erzählung, dass wir keine Eigenschaftsboards haben, und das ist in unserem Typskript vollständig gültig. Wir bekommen unsere Boards, aber wir haben einfach hier ein Konsolenprotokoll mit Dan, speichere sie. Und eigentlich müssen wir es so machen, hier oben können wir Boards Property erstellen. Es wird unsere Board-Schnittstelle sein , die wir bereits haben. Dies ist ein Array und standardmäßig haben wir eine leere Liste unserer Boards. Jetzt können wir hier anstelle unseres Konsolenprotokolls einfach die Boards dieses Boards zuweisen, die wir von unserem Service erhalten. Lass uns nochmal nachsehen. Wie Sie jetzt sehen können, haben wir keinen Fehler, aber wir haben eine Fehlerplatine. Die Kachel existiert nicht. Und deshalb mag ich TypeScript so sehr. Es war einfach ein Tippfehler, aber wir debuggen ihn nicht zur Laufzeit. Wir haben einfach eine Validierung von TypeScript. Also hier sollte der Titel sein, und jetzt haben wir keinen Fehler mehr. Du solltest nicht gültig sein. Schauen wir uns das an. Ich lade die Seite neu und tatsächlich sieht sie irgendwie aus. Wir haben hier unsere App zur Bar. Wir haben es noch nicht implementiert. Hier auf der linken Seite haben wir einen Boards-Link und einen Home-Link. Links sind also da. Und hier ist unser Hauptinhalt mit meinen Boards in Landforms, dass wir ein zweites und unser erstes Board mit dem richtigen Link erstellen werden . Und wie Sie hier unten sehen können, handelt es sich um einen Slash-Port, Schrägstrich-ID, was bedeutet, dass unsere URL auch funktioniert. Aber ich habe einen kleinen Tippfehler im Markup. Wie Sie sehen können, sieht unsere Seitenleiste nicht so gut weil ich hier in der linken Seitenleiste einer div-Klasse home einen Wort-Container verpasst habe, ich hier in der linken Seitenleiste einer div-Klasse home einen Wort-Container verpasst habe, also sollte es links zu Hause sein, aber Container, wie Sie jetzt sehen können, unsere Sidebar ist viel größer und sieht besser aus. Wie Sie sehen können, haben wir unsere Boards mit diesem Code erfolgreich in unserer Komponente mit unserem Service abgerufen . Wir speichern diese Informationen in unserem Board-Eigentum und wurden in unsere Liste der Boards gerendert. Und tatsächlich können wir hier in unserem Netzwerk sehen, dass wir auf dem lokalen Host eine Anfrage für 1001 matschige, pathlose Boards haben. Und wir bekommen unser einziges Board, das wir haben. Und jetzt ist es an der Zeit, über Binnenfirmen zu sprechen. Also wie werden wir es hier in unserem HTML verwenden. Und dafür möchte ich unser Inland-Formular hier auf der rechten Seite öffnen , damit wir verstehen können , was wir in unserer Komponente haben. Also hier haben wir viele Inputs. Was wir also für diese spezifische Verwendung bereitstellen sollten, eigentlich haben wir hier Recht, dass wir unser Inline-Dash-Formular haben. Lass es uns hier schließen. Und jetzt möchte ich zunächst drinnen einen Kurs geben. Und die Hauptidee ist, dass dies die übergeordnete Klasse ist , die wir stylen können , weil wir einzigartige Stile auf unsere Komponente anwenden möchten . Und nur um Sie daran zu erinnern, dass wir hier Klassen wie Inland von Container, Inland von Text und Lied haben. Die Idee ist, dass diese Klasse diese Klasse jedes CSS überschreiben. Und genau das ist die Idee. Hier stellen wir hier einige Klassen zur Verfügung, zum Beispiel das Erstellen eines Board-Formulars. Jetzt werden alle diese Cluster in unserem CSS einfacher verschachtelt sein. Das zweite, was wir hier brauchen, ist Standardtext. Und das sind die Texte, die wir vorher auf der Karte sehen werden. Und hier haben wir unsere Standardtexte, neues Board erstellen. Und das Letzte , was wir hier bereitstellen müssen , ist das Absenden. Das bekommen wir von unserem Formular. Hier. Wir können zum Beispiel schreiben, Board erstellen und wir kommen hierher. Also was hat dieses Ereignis gemacht, nur um Sie hier daran zu erinnern, wir haben ein Handle submit und es ist eine Zeichenfolge. Dies ist unser Titel und wir brauchen hier keinen Schaltflächentitel, Schaltflächentext, Platzhalter, Eingabetyp, nur weil dies die wichtigste Standardfirma im Inland ist. Lassen Sie uns nun überprüfen, ob es funktioniert, wo das Springen hier in der Konsole und die direkt einen Fehler haben. Wir haben kein Methodenerstellungsboard, also erstellen wir es jetzt hier. Dies ist eine Methode, bei der wir eine Zeichenfolge erhalten. Wir können also sagen, dass wir hier einen Titel bekommen, es ist eine Zeichenfolge und zurück werden wir void zurückgeben, was nichts bedeutet. Und es listet hier auf, dass ich unseren Titel konsultieren möchte , der in unserer Inlandform erstellt wurde. Jetzt kommen wir hierher und ein schmales Argument vom Typ event kann nicht zugewiesen werden , um eine Zeichenfolge zuzulassen. Und tatsächlich könnte es super schwierig für dich sein zu debuggen, weil du vielleicht denkst, okay, ich biete hier etwas anderes an. Aber das Problem liegt nicht darin. Das Problem ist, dass wir in diesem Modul nicht in unser Inland-Formular-Modul injiziert haben. Hier innerhalb des Boards-Moduls müssen wir unser gemeinsam genutztes Modul importieren und es wird für das Modul in der Reihe sein. Und die Hauptidee ist, dass wir hier bei einem Modul invertiert sind, aber im Inneren haben wir eine Experten-ID-Komponente. diesem Grund können wir diese ausgenutzte Komponente jetzt Aus diesem Grund können wir diese ausgenutzte Komponente jetzt im Inland hier in unserer Komponente verwenden. Schauen wir uns das an. Wie Sie sehen können, haben wir diesen Fehler nicht mehr. Wir haben etwas anderes und wir können hier nicht an die Formulargruppe binden , da es keine bekannte Eigenschaft des Formulars ist. Deshalb müssen wir das tun. Wir müssen reaktive Formulare in unser Inline-Formularmodul einfügen. diesem Grund möchte ich in das Inline-Formularmodul springen. Und hier in den Eingängen möchte ich ein Modul für reaktive Formulare schreiben. Jetzt sollten wir keinen solchen Fehler bekommen. Schauen wir uns das an. Wie Sie sehen, ist alles grün und wir können loslegen. Lassen Sie uns sie in einem Browser überprüfen, in dem die Seite neu geladen wird und voila, das ist unser Element. Und es könnte jetzt sehr schwierig für Sie sein zu verstehen, was hier passiert, weil wir kein CSS geschrieben haben und CSS bereits schnell vorbereitet war. Lassen Sie uns dieses Element untersuchen. Was haben wir hier? Wie Sie sehen können, ist dies ein Inland-Formular und dies ist unser Klassenformular zum Erstellen eines Boards. Schauen wir uns das an. Was wir in unserem Projekt und unseren Stilen haben. Wir haben keine Quellstile und hier viele Stile erwähnt und wir sind jetzt daran interessiert, Board-Form zu erstellen. Öffnen wir es, und das ist unser CSS. Das ist genau das , was wir hier sehen. Dies ist ein Board-Formular erstellen. Das ist unser Elternteil. Am wichtigsten ist, dass wir innerhalb der Binnenform unterschiedliche Stile haben. Zum Beispiel ist hier der Inline-Formularcontainer der Div-Klasse und wie wir ihn stylen, wir verwenden hier unsere übergeordnete Klasse, die wir gerade hier haben. Dies ist Board-Formular erstellen und dann Inline-Formularcontainer. Und das können Sie hier sehen. Stellen Sie hier, allen Inland von Klassen, immer das create board-Formular vor, das unser übergeordnetes Formular ist, nur für diese spezifische Verwendung. Auf diese Weise machen wir unser Inland super flexibel. Es enthält 0 CSS im Inneren und wir definieren einfach unser gesamtes CSS außerhalb für jeden einzelnen Fall. diesem Grund haben wir hier definiert, okay, wir haben Inland von Container, Sie sollten Display Flex haben, Elemente ausrichten und Inhalte rechtfertigen. Wenn wir dann zum Beispiel inline aus Texten stylen müssen , waren wir in diesem Fall nicht stilvoll, aber wir könnten auch genau hier Board-Formular, Inline-Formular, Text erstellen und dieses Element stylen. Auf diese Weise haben wir unsere großartige Inland-Form geschaffen, die für jeden einzelnen Fall super geteilt werden kann. Prüfen wir jetzt, ob es wirklich funktioniert. Also haben wir hier unseren Standardtext neues Board erstellen. Wir können darauf klicken, und jetzt haben wir unseren Input und können hier etwas schreiben. Und sie sehen hier schon einen Fehler. Wie Sie hier sehen können, haben wir eine Eingabe mit einer Klasseneingabeformular-Eingabe, aber das ist es, was wir Stil haben und wo wir Inline-Formulareingabe stylen, was eigentlich bedeutet, dass wir dort einen Tippfehler gemacht haben. Lassen Sie uns zurück in unsere Komponente, die Inlandform-Komponente, springen . Und hier haben wir unsere Eingabe und hier müssen wir unsere Eingabeformulareingabe auf Inline-Formulareingabe ändern . Und wie Sie sehen können, haben wir hier in Textarea genau das gleiche Problem. Es sollte eine Inline-Formulareingabe sein. Lass uns nochmal nachsehen. Ich lade die Seite neu, wo sie auf der Schaltfläche versteckt ist, und jetzt haben wir eine korrekt gestaltete Eingabe. Jetzt kann ich etwas wie foo bezahlen und dann die Eingabetaste drücken und unser Formular ist erfolgreich geschlossen. Wir sehen wieder neue Boards erstellen. Und innerhalb der Konsole sehen wir, dass unser Titel dafür genau unsere Output-Inside-Board-Komponente ist. Was uns hier jedoch komplett fehlt, ist Erstellung eines Boards auf dem Client und auf dem Server. Und jetzt möchte ich umgekehrt machen. Ich möchte mit dem Frontend beginnen und mit dem Pi fertig werden. Und dann können Sie in umgekehrter Reihenfolge sehen , wie wir das machen . Also Festival hier haben wir unsere Create Board inside Komponente. Die Idee ist also, dass wir hier unseren Boardservice nutzen werden. Das ist mein innerer Board-Service, wir müssen eine neue Methode entwickeln. Nennen wir es zum Beispiel create point. Was wir also hier bekommen, wir kommen einfach hier beim Titel und es ist String und zurück werden wir ein Observable mit dem erstellten Board bekommen, was bedeutet, dass es sich um eine langweilige Schnittstelle handelt. Und jetzt, was wir drin haben werden, können wir zuerst die URL kopieren und einfügen, können wir zuerst die URL kopieren und einfügen da sie genau gleich sein wird. Es sind Schrägstriche und wir stellen eine Post-Anfrage. Hier können wir sagen, dass wir dieses HTTP zurückgeben und nicht bekommen, sondern posten. Und drinnen. Zuallererst müssen wir eine URL angeben. Und zweitens stellen wir hier ein Objekt mit Feldtitel zur Verfügung. Und das ist eigentlich unser Körper. Und für unseren Vorstand geben Sie einfach den Titel an. Denn im Backend mit Set nur zwei Dinge. Das ist Titel und Benutzer-ID. Und die Benutzer-ID muss unser Backend von selbst verstehen, da wir mit unserer Anfrage ein Token bereitstellen und authentifiziert sind. Das Hauptproblem ist hier, dass wir das Tippen umgehen. Wir müssen einen Einblick oder einen Beitrag geben. Wir bekommen unser Board-Interface zurück. In diesem Fall haben wir erfolgreich Create Board-Methode erstellt. Und wie Sie alle unsere API-Methoden sehen können, sehe ich genau gleich aus. Das ist einfach eine URL und dann HTTP-Post gestürzt, den wir brauchen. Verwenden wir nun die Service-Methode in unserer Komponente. Also lasst uns zurückspringen. Und hier ist unser Create-Board. Und hier wollen wir es diesen Wortdienstpunkt nennen. Und hier Create Point. Und drinnen geben wir genau den Titel an, den wir hier von unserer Inland-Form bekommen haben. Und danach schreiben wir dot subscribe und hier werden wir wieder Board erstellt. Was wollen wir mit diesem Punkt anfangen? Wir wollen einfach unsere, diese Boards Rate ändern. diese Weise werde ich hier schreiben , dass Dot Boards gleich sind. Und hier verteilen wir unsere These Dot Boards und dann wollen sie unser erstelltes Board platzieren. Also erstellen wir im Wesentlichen hier in Ihrem Array, wo wir alle unsere Felder aus dem alten Array platzieren und dann Board erstellt werden. Also unsere Front und das voll vorbereitet. Jetzt müssen wir zum Backend springen und dort alles erstellen. Im Backend. Es ist nicht so schwierig, weil wir alle ein Modell für das Board erstellt haben und es verwenden können. Wir müssen nur springen und sagen Schwesternschaft S. Und hier erstellen Sie Ihre API-Anfrage. Hier können wir kopieren, einfügen , komplett bekommen, und es wird auf Schrägbrettern veröffentlicht. Hier müssen wir OS-Middleware verwenden , da es sich um eine authentifizierte Anfrage handelt. Und hier verwenden wir den Controller-Punkt des Boards, zum Beispiel create board. Und jetzt müssen wir diese Methode in unserem Controller erstellen. Also lasst uns wieder in den Controller unseres Boards springen. Und hier wollen wir genau dasselbe erstellen, aber es wird eine Post-Anfrage sein, um einen Datensatz zu erstellen. Deshalb kopiere ich das komplett und benenne es einfach um. Hier haben wir also unser Create-Board und wir bekommen hier unsere Antwort auf Ihre Anfrage. Und als nächstes, und wir haben drinnen versuchen, hier zu fangen. Zuallererst, wo Hühnchen auf Anfrage verwenden, dass das völlig in Ordnung ist. Und danach wollen wir ein neues Board erstellen. Hier werde ich diese Zeile entfernen. Also hier werde ich schreiben , dass wir unser neues Board erstellen und dafür verwenden wir Ihr gelangweiltes Modell und dann sagen Wir müssen ein gültiges Objekt bereitstellen. Hier. Zunächst stellen wir einen Titel aus dem Anforderungsboard zur Verfügung , den Punkttitel. Und zweitens ist der Benutzer AD und die tatsächliche Verwendung relativ zur Masse aus unserer Anfrage, aus unserer Middleware. Also hier haben wir Anfrage Punkt USA, Punkt Unterstrich ID. Und tatsächlich können wir beide Unterstrich-ID oder ein D verwenden , egal. Wir haben beide zur Verfügung. Diese Zeile speichert also nichts in der Datenbank. Wir erstellen hier einfach eine Instanz unseres Modells. Danach möchten wir diesen Datensatz in der Datenbank speichern. Deshalb können wir hier versuchen, es zu speichern Board und wir verwenden hier ein Gewicht, und Sie haben dot save gekauft. In diesem Fall speichern wir diesen Datensatz und erhalten unser gespeichertes Board zurück. Und wie Sie sehen können, handelt es sich um ein Word-Dokument. Danach können wir also mit unserem gespeicherten Board antworten. Wir haben also wieder eine Post-Anfrage, wir haben hier eine Create Board-Aktion. Wir überprüfen, ob wir eingesperrt sind. Danach verwenden wir unser Board-Modell, um ein neues Board mit dem von uns bereitgestellten Titel zu erstellen und verwenden 3D, das wir nicht bereitgestellt haben. Aber Gott, von unserem gesperrten Benutzer und wir haben diesen neuen Punkt in der Datenbank gespeichert. Wir haben unser gespeichertes Board zurück und antworten mit dieser API. Prüfen wir, ob es funktioniert. Ich habe hier im Backend keine Fehler. Also lasst uns hier in den Client springen Ich möchte auf Neues Board erstellen klicken und ich tippe etwas und drücke Enter. Und wie Sie direkt hier sehen können, haben wir unser neues Board. Schauen wir uns unser Netzwerk an. Und tatsächlich haben wir innerhalb des Netzwerks die Anfrage unseres Vorstands. Und das ist ein Beitrag über Slushy Pie Schrägstriche. Und was noch wichtiger ist hier in der Vorschau, das ist unsere Antwort. Dies ist ein Titel Benutzer-ID. Das ist genau das, was in der Datenbank gespeichert wurde, was bedeutet, dass wir, wenn ich die Seite hier neu lade, jetzt zwei Boards bekommen, weil diese Informationen alle in der Datenbank gespeichert sind . Und hier in unserem Netzwerk bekommen wir unsere Boards. Und wie Sie in der Vorschau sehen können, haben wir bereits zwei Boards und kein einziges, was bedeutet, dass wir mit unserer Board-Seite vollständig fertig sind. Zunächst einmal wird hier die Sidebar gerendert, aber wir haben nichts damit gemacht. Wir verwenden hier auch unsere Inland-Form, die super teilbar ist. Und wir haben unseren Service , der mit unserer API spricht, erstellt , um auf dieser Seite ein neues Board zu erstellen. 24. Hinzufügen von Top-Bar und Logout: Im vorherigen Video haben wir unsere Board-Seite fertiggestellt, aber wir haben vergessen, unsere obere Leiste zu implementieren. Und tatsächlich ist dies die TBA auf jeder einzelnen Seite für einen angemeldeten Benutzer, was eigentlich nicht nur meine Board-Seite bedeutet, sondern auch eine einzelne Board-Seite Deshalb müssen wir sie als gemeinsam nutzbares Modul erstellen. Also möchte ich zu unserer gemeinsamen Client-Quell-App springen. Und hier haben wir unsere Module und Inland-Firmen. Und eigentlich möchte ich hier dieses Inline-Formular komplett kopieren, einfügen und in unsere Zunge umbenennen . Aber jetzt innerhalb der Masse ändert sich alles. Beginnen wir zunächst mit unserem Modul. Also hier haben wir ein Modul in der oberen Leiste und innen haben wir kein reaktives Formularmodul, wir werden einfach ein Markup und die Abmeldeschaltfläche haben. Hier können wir diese Eingabe entfernen und wir müssen auch unsere Komponente ändern. Aber zuerst ändern wir den Namen der Klasse. Es sollte unser Top-Bar-Modul sein. Lassen Sie uns nun in unsere Komponenten eintauchen. Und hier haben wir keine Firma im Inland, wir haben unsere obere Leiste und wir haben zwei Dateien darin. Zuallererst wird es Top Bar Dot Komponente Punkt HTML sein. Und hier ist unsere obere Bar Dot Komponente Punkt ts. Jetzt ändern wir das Markup. Ich möchte alles in der einfacheren rechten oberen Leiste entfernen. Gehen wir nun zu unserer ts-Datei und entfernen alles aus unserer Komponente. Jetzt möchte ich unseren Selektor in die obere Leiste umbenennen , um zu verdeutlichen, wo er hingehört. Eigentlich haben wir nur einen einzigen Toba in unserer Anwendung. Wir könnten einfach hier Tampa schreiben, aber da es für uns teilbar ist, werde ich hier oben schreiben, aber nur an diesem einzigen Ort, hier haben wir unsere Vorlagen-URL. Dies ist die obere Leiste und unser Komponentenname ist Top Bunk Component. Jetzt kann ich die Symbole entfernen und einfach hier unseren Input der Komponente leben. Jetzt springen wir zurück in ein Modul. Jetzt haben wir diese Inline-Formularkomponente nicht, aber wir möchten hier unsere obere Bar-Komponente und die Experten-TBA-Komponente deklarieren , da wir sie außerhalb verwenden möchten. Unser Modul ist jetzt also vollständig fertig. Ja, wir haben keine Logik darin implementiert, aber wir können sie immer noch nicht wirklich binden. Und wir wollen springen und das Board-Modul und in unseren Eingängen können wir hier das obere Balkenmodul hinzufügen. Jetzt hier in unseren Komponenten Boards, Boards, HTML oben. Anstelle dieses Textes können wir einfach die obere AP-Leiste schreiben und sie hier schließen. Prüfen wir, ob es funktioniert. Wir haben hier keine Fehler. Ich werde die Seite neu laden. Und hier oben siehst du die Texte in der oberen Leiste, was bedeutet, dass wir unser Modul und unsere Komponente erfolgreich an unsere Board-Seite gebunden haben. Versuchen wir nun, unsere Toolbar zu vermarkten. Hier springe ich zurück in unser Tombow-Komponenten-HTML. Hier, lass es uns schreiben. Also zuallererst haben wir hier div mit Klasse Navbar Boards. Lass uns dieses Div drinnen schließen. Wir werden noch eine div, div, navbar, linke Seite haben. Schließen wir dieses Div und drinnen haben wir zunächst einen Link zu unserem Zuhause. diesem Grund ein Router-Link. Hier wird unser Schrägstrich sein, und hier wird das Navbar-Symbol der Klasse sein. Schließen wir unser a und im Inneren müssen wir ein neues Bild liefern. Also hier wird Bildquelle Slash Assets Slash Home Dot SVG sein. Danach haben wir noch einen Router-Link. Deshalb werde ich es komplett kopieren und einfügen und es läuft auf Schrägbrettern. Und es wird Naropa Eigenspace sein, Navbar-Board-Symbol. Und drinnen haben wir eine weitere SVG-Datei. Es sind Slash-Assets Slash-Boards, wie Sie jetzt sehen können, wenn ich die Seite neu lade, haben wir zwei nette Symbole, eines zum Homepage-Link und eines zu unseren Boards. Aber wie Sie das hier sehen können, sind Schienen ungültig. Wir haben sie überhaupt nicht, weil wir tatsächlich in unser oberes Bar-Modul springen müssen. Und hier, importieren Sie das Routenmodul. Speichern wir das und laden die Seite neu. Und wie Sie jetzt sehen können, verlinkt dies vor allem die Homepage und hier Slash-Boards. Fahren wir nun mit unserem Markup fort. Nach unserer linken Seite haben wir unsere rechte Seite. Hier. Wir möchten unser Bild mit Quell-Slash-Säuren, einem Schrägstrich-Trello-Logo und einem SVG mit weißem Punkt versehen. Und hier ist unsere Klassen-Navbar. Länger nach einem Bild haben wir ein div mit der Klasse navbar rechts. Nennen wir das t. Und im Inneren wollen wir ein Linkfolgekleid erstellen , das ist y. Hier wird div Klasse, Navbar-Symbol, Navigationsleiste, Abmelde-Symbol sein. Und hier drinnen möchte ich einfach Log-Gichttext schreiben. Prüfen wir, ob es funktioniert. Hier haben wir unsere Links auf der linken Seite, wir haben ein Trailer-Bild in der Mitte und wir haben eine Schaltfläche als Logout-Link auf der rechten Seite. Aber wir haben hier keine Logik angehängt. Unsere obere Leiste ist also im Wesentlichen vollständig fertig. Wir haben alles implementiert, aber jetzt müssen wir unseren Logout implementieren. Implementierung des Logouts ist sehr einfach. Wir müssen nur unser Token aus dem lokalen Speicher entfernen, CurrentUser in unserem Speicher bereinigen und es auf die Homepage umleiten oder verwenden. Das wollen wir hier tun. Wir möchten ein Klickereignis anhängen. Also hier klicken wir mit der rechten Maustaste. Und was wir tun, wir nennen unsere Logout-Methode. Und die Nummer muss dieses Logout in unserer Komponente erstellen. Was wollen wir also drinnen machen? Eigentlich möchte ich unsere Logo-Logik in unserem Service speichern Logo-Logik in unserem Service da dies mit der Authentifizierung zusammenhängt und sie diese Logik nicht direkt hier schreiben möchten. Das ist y. Was wir tun müssen, wir müssen unseren Stunden-Service injizieren , der unser Dienstleister in dieser Komponente ist. Und jetzt können wir hier unseren this dot out dot logout verwenden. Und eigentlich haben wir keine solche Methode. Wir müssen es erstellen, aber es ist nicht alles, aber auch danach, um den Benutzer auf die Homepage umzuleiten , weil wir nicht mehr angemeldet sind. Und dafür müssen wir hier Router injizieren. So kann ich Router haften und es wird unsere Dürre sein. Nach dem Doppelpunkt sind unsere Dienste. Wir können hier diesen Router-Punkt-Navigieren nach URL schreiben, und wir wollen den Benutzer einfach auf unsere Homepage umleiten. Also sind wir fast fertig. Wir müssen nur unsere Logout-Methode hier innerhalb unserer Serviceklasse implementieren . Also hier unten schreibe ich logout mit brauche hier nichts. Wir wollen einfach unseren Token entfernen. Hier können wir also lokale Speicherpunkte entfernen und wurden innerhalb des Ziels bereitgestellt. Das reicht, aber wir haben unser Gedächtnis nicht gereinigt. Und tatsächlich hat dieser aktuelle Benutzer immer noch einen gültigen aktuellen Benutzer. Das ist nicht gut. Wir müssen es auf „Jetzt“ setzen. diesem Grund ist dieser Punkt aktueller Benutzer dot. Als nächstes werden wir jetzt im Inneren bereitgestellt und mit diesem einzigen Liner werden alle unsere Komponenten darüber informiert, dass wir nicht mehr eingeschlossen sind. Prüfen wir, ob es funktioniert. Ich habe hier keine Fehler. Wir müssen nichts im Backend implementieren. Jetzt klicken wir einfach hier auf Logout. Und wie du siehst, boom, ich bin direkt auf der Homepage und wir können überprüfen, ob wir nicht eingesperrt sind. Eigentlich wurde er hier innerhalb des lokalen Speichers der Anwendung genannt . Ich habe meinen Spielstein nicht. diesem Grund erhalte ich beim erneuten Laden der Seite 401 Unauthorized, was bedeutet, dass wir unsere obere Leiste und Abmeldefunktion erfolgreich implementiert haben. 25. Erstellung eines board: Im vorherigen Video haben wir die Implementierung unserer Board-Seite erfolgreich abgeschlossen. In diesem Video beginnen wir mit Implementierung unserer Single-Board-Seite. Und wir konzentrieren uns hier nur auf Erstellung unseres Basismoduls und unserer Komponente. Deshalb möchte ich innerhalb des Quellsatzes springen. Und hier möchte ich einen neuen Ordner mit einem neuen Modul erstellen. Und tatsächlich könnte man sagen: Okay, aber warum packen wir unser Component Board nicht in Boards Modul und ja, das können Sie tun, aber ich möchte es teilen, weil die Logik in diesen beiden Modulen ziemlich ist anders. Wir müssen immer noch ziemlich viel in unserem Board-Modul bezahlen . Das ist y. Erstellen wir hier einen neuen Ordner, der Board heißt. Und innen wollen wir unser Board dot module.js erstellen. Lassen Sie uns hier auch direkt unseren Komponentenordner und den mu-Ordner erstellen unseren Komponentenordner und den , in dem Board genannt wird. Und hier brauchen wir zwei neue Dateien. Zuallererst Board Dot Komponente Punkt ts und zweitens Board Dot Komponente Punkt HTML. Lassen Sie uns nun innerhalb von HTML tendieren, wortgekocht, und lassen Sie uns unsere Komponente erstellen. Hier können wir also unsere neue Klasse exportieren, und sie wird Board-Komponente genannt. Und oben hat ein Komponenten-Decorator remastert. Im Inneren möchten wir unseren Selektor bereitstellen und wir können hier einfach sagen, dass wir Board ausgewählt haben und wir müssen auch hier eine Vorlagen-URL angeben , die als Komponenten-HTML gegossen wird, unsere Board-Komponente ist vollständig vorbereitet. Wir müssen wissen, dass wir unser Modul erstellen. Also hier wollen wir eine neue Klasse exportieren, die Boardmolekül genannt wird. Und wir wollen den Decorator und das GI-Modul hinzufügen und Einblicke geben, zumindest die Liste der Eingaben. Und hier haben wir zunächst ein gemeinsames Modul, auch jetzt können wir unsere Deklarationen erstellen und Einblicke in unsere Board-Komponenten geben, die wir gerade erstellt haben. Deshalb möchten wir uns hier in Ihrer Route registrieren. Hier oben können wir eine neue Eigenschaft erstellen , die Routen genannt wird. Und es sind unsere Rufe, die ein Array sind. Und im Inneren müssen wir ein neues Objekt mit Feldpfad versehen. Und hier haben wir den Schrägstrich der URL-Boards, und hier haben wir eine Doppelpunkt-Board-ID. Was bedeutet diese Board-ID? Das bedeutet, dass wir einen dynamischen Parameter haben, was bedeutet, dass wir hier eine Board-ID haben und diese für jedes einzelne Board unterschiedlich ist. Danach müssen wir hier eine Komponente bereitstellen, und in unserem Fall wird es unsere Platinenkomponente sein. Auch hier möchte ich den Wortdienst nutzen. Deshalb können wir hier schreiben, aktivieren. Dies ist ein Array, und hier ist unser erforderlicher Service. Warum machen wir das? Weil diese URL nur für eingeloggte Benutzer ist. Wenn wir nicht angemeldet sind, möchten wir überhaupt nicht auf diese URL zugreifen. Und jetzt müssen wir diese Routen in unseren Eingaben registrieren. Hier können wir also Routenmodulpunkt für Kind platzieren, und hier geben wir einen Einblick in unsere Routen. Und zu guter Letzt müssen wir dieses Modul in unserem App-Modul registrieren. Hier in unseren Eingängen können wir einfach ein Board-Modul schreiben, und dies ist unser neues Modul, das hier oben eingegeben wird. Prüfen wir, ob es funktioniert. Wir können jetzt in unseren Browser springen und unsere Entwicklungstools öffnen. Hier können wir auf unser erstes Board klicken. Und wie Sie jetzt sehen können, haben wir keinen Fehler. Wir sehen hier auf dem obersten Wortbrett und dann die URL, die wir sehen, Schrägstriche, Schrägstriche und sie D dieses speziellen Boards. Was wir jetzt tun müssen, ist ein einziges Board für diese spezielle Seite zu bekommen . Warum ist das so? Denn eigentlich springen wir nicht immer von der Board-Seite auf unser einzelnes Board. Und du könntest sagen: Okay, nun, auf der Board-Seite haben wir alle unsere Boards. Aber wenn wir auf dieser einzelnen Seite sind und die Seite neu laden, haben wir keine wichtigen Informationen, was bedeutet, dass wir diese Anzeige von unserer URL abrufen und dieses spezielle Board mit der CD erhalten müssen . Später auch zusätzliche Informationen, wie Spalten oder Aufgaben. diesem Grund möchte ich unsere App, Shared Services, Boards, Service Tiers öffnen , und der Verkauf wird zuvor festgelegt. Hier schreiben wir alle unsere Anfragen an den Farbstoff, die sich auf unsere Boards beziehen. Deshalb können wir hier eine neue Methode erstellen , die sich langweilen heißt. Und dann, um ein Board zu bekommen, müssen wir eine Board-ID angeben, die eine Zeichenfolge ist, und zurück erhalten wir ein Observable mit unserer Board-Schnittstelle. Jetzt müssen wir hier unsere URL vorbereiten. Also hier werden wir die Umgebung Doherty Pi URL plus verwenden, und hier wollen wir unsere Boards plus AD verketten. diesem Grund ist es sehr sinnvoll, hier ECMO ScriptSig-Strings zu verwenden und innerhalb dieser Umgebung eine DPI-URL einzufügen. Dann haben wir hier Schrägstrich, Boards, Schrägstrich, und hier ist eine AD als Argument. Und eigentlich ist es keine AD, es ist geboren und AD. Das ist also die URL, die wir aus dem Backend holen wollen. Und jetzt müssen wir unsere Anfrage von diesem Punkt http.get zurückgeben . Und wir bieten Insidern unseren Urinbereich , den wir holen wollen. Aber auch hier werden wir wieder beobachtbar von Objekten und wir müssen angeben, dass wir unsere Board-Schnittstelle zurückbekommen. Versuchen wir nun, diese URL abzurufen. diesem Grund müssen wir wieder in unser Platinenmodul, unsere Komponenten und unsere Platinenkomponente zurückkehren. Und hier drinnen möchte ich eine neue Methode zum Abrufen von Daten erstellen, und diese Methode gibt void zurück. Und im Inneren wollen wir diese Methode verwenden, die wir gerade erstellt haben, um unser Board per AD abzurufen. Hier müssen wir einen Konstruktor bereitstellen und hier wird ein privater Boards-Service sein , dass wir diesen Boards-Dienst beendet haben. Und in unsere Abrufdaten können wir diesen Dotboard-Service-Punkt schreiben , langweilen Sie sich. Wir stellen eine Insight-Board-ID zur Verfügung, aber wir haben noch kein D in dieser Komponente. Und eigentlich müssen wir diese Board-ID aus der URL darin speichern , da wir sie in dieser Komponente häufig verwenden werden. Aber wenn wir hier schreiben Board-ID ist gleich string, dann bekommen wir hier ein schmales Board, das sie graben, hat keinen Initialisierer und ist nicht im Konstruktor definiert. Und eigentlich wollen wir nicht undefiniert hierher kommen weil es später nicht angenehm sein wird, zu arbeiten. Board AD ist für unsere Komponente obligatorisch. Und um den Perimeter von unserer URL zu erhalten, müssen wir hier Route injizieren. Also hier wird ein privates Leichentuch sein. Hier wollen wir die aktivierte Route verwenden. Jetzt wollen wir hier drinnen versuchen , diese aktivierte Dürre zu lesen. Also hier möchte ich die Board-ID als Parameter bekommen und wir verwenden hier diese Punkthülle, Punkte, Schnappschuss, Punkt-Parameter-Map hier wird Board-ID sein. Und so erhalten Sie normalerweise Parameter von der URL in Angular. Aber wie Sie sehen können, bekommen wir das zurück. Wir werden jetzt belastet, das ist völlig vernünftig, da Angular sicher sein kann, dass dieser Parameter immer da ist. Deshalb können wir hier schreiben, weil wir wirklich nur einen String speichern wollen. Wir können überprüfen und einen Fehler auslösen, wenn er nicht da ist. Deshalb können wir hier schreiben. Wenn wir unser Board AD nicht haben, werfen wir einen Pfeil. Hier wird ein neuer Fehler geworfen, zum Beispiel kann sich nicht langweilen AD von URL. Und danach schreiben wir einfach diese Board-ID gleich Board-ID. Und wie Sie in diesem Fall sehen können wo sich die Anmeldung innerhalb der Zeichenfolge befindet, weil wir hier nach TypeScript gesucht haben, dass es jetzt nicht ist. Und wenn es jetzt ist, werfen wir einen Fehler aus. Dies ist eigentlich das Beste, was wir tun können , um eine Zeichenkette in dieser Komponente zu erhalten. Weil es nicht bequem sein wird, jeden einzelnen Ort zu überprüfen , an dem wir diesen Parameter erhalten. Und jetzt können wir hier in guter Tafel Einblicke geben. Dieses Dotboard AD. Danach können wir dot subscribe schreiben und wir bekommen unser Board zurück und wir können es zuweisen und irgendwo speichern. Aber zumindest für den Moment möchte ich nur unser Board Comma-Board in der Konsole protokollieren, aber wir haben diese Daten nicht irgendwo aufgerufen. Deshalb müssen wir hier Geräte darauf schreiben. Und jetzt, nach unserem Konstruktor, können wir im Juni drin sein und drinnen können wir diese Daten abrufen. Und tatsächlich bevorzuge ich jedes Mal in jeder Komponente, in der ich einige Daten abrufen muss, eine zusätzliche Methode dafür zu erstellen, die als Fetch-Daten bezeichnet wird. Und werfen Sie diese Logik nicht einfach hinein und machen Sie mit, nur um sie sauberer zu machen. Wie Sie sehen können, wenn wir zum Browser springen, stellen wir jetzt eine Anfrage für unseren Slash-API-Slash, Forward Slash und diese spezifische ID von Momma-Parameter, was tatsächlich bedeutet, dass wir erfolgreich sind auf dem Client implementiert oder als Sie ein Modul gekauft haben und sogar unser Board aus dem Backend geholt haben. Offensichtlich haben wir keinen Backend-Teil implementiert, und wir werden es im nächsten Video tun. 26. Ein einziges Board: Im vorherigen Video haben wir den Front-End-Teil unserer Board-Komponente und unseres Port-Moduls erfolgreich implementiert den Front-End-Teil unserer Board-Komponente und unseres . Aber jetzt im Backend wollen wir implementieren, ein einziges Board zu bekommen. Das ist genau die Anfrage , die hier kaputt ist. Und ich denke, dass wir eine Menge Sachen zusammen implementiert haben und du wusstest schon nicht, wie das geht. Aus diesem Grund empfehle ich Ihnen dringend, es selbst umzusetzen. Wie immer gesagt, haben drei verschiedene Stufen für EU-Ebene Nummer eins Sie halten das Video einfach hier an und machen es selbst. Am Ende musst du hier unser Board aus dem Backend holen, Level Nummer zwei, lass uns darüber reden. Was müssen wir also umsetzen? Zunächst möchte ich hier unseren Server-Quellserver öffnen . Und hier müssen wir in Ihrer Anfrage angeben und es wird auf Slash, API-Slash-Boards und dann auf Boyd AD erzeugt, und es muss ein dynamischer Parameter sein. Es muss geschützt werden Dürre. Innerhalb unseres Board-Controllers müssen wir eine neue Aktion erstellen. Jetzt springen wir hier in gekochten Controllern, und wir machen einfach genau das Gleiche, wie wir Boards vergessen haben. Aber hier Groupon, um ein einzelnes Board mit dem d dieses Boards aus der URL zu finden . Wenn du also ein Level machen willst um das Video hier anzuhalten, und wenn du es einfach zusammen machen willst , lass uns loslegen. Zunächst müssen wir hier zurück in unsere Serverstufen springen und eine neue API-URL erstellen. Also hier haben wir apt-get slushy pie Schrägstriche und hier riskieren Doppelpunkt-Board-ID. Jetzt wollen wir eine neue Methode erstellen. Deshalb werde ich in oder Controller-Ports springen und hier langweilen wir uns. Sie wollen sie komplett kopieren weil sie sich sehr ähnlich sind. Also hier kopiere ich eingefügt, langweile mich, und sie wollen diese Methode benennen, langweilen sich. Und hier bekommen wir eine Antwort auf eine Anfrage und als nächstes prüfen wir, ob wir eingesperrt sind. Jetzt werden hier statt find alle Boards find one verwenden wollen, um nur ein einziges Board zu finden. Und eigentlich noch besser können wir hier find by ID verwenden. Es ist auch eine Methode , die möglich ist und innerhalb von Vermis nur eine ID dieses Sports angeben. diesem Grund können wir ein Objekt entfernen und einfacher hier, fordern Sie dot params dot board ID an. Und zurück bekommen wir unser Board und schicken diese Board-Tasche einfach in unsere API. Lassen Sie uns nun überprüfen, ob wir unsere Methode hier richtig anwenden, und hier ist der Controller des Boards dot get boards. Das ist nicht richtig. Es sollte sich langweilen. Wir haben hier in unserer API keine Fehler und wir haben erfolgreich implementiert, dass wir von der Stange gehen. Schauen wir uns das an. Ich lade die Seite neu, habe aber keinen Fehler. Hier. Wir bekommen unser Board von d, und hier sind die Informationen aus der Datenbank. Wir haben einen D-Titel und eine Benutzer-ID. 27. Hinzufügen von board: Im vorherigen Video haben wir erfolgreich die Messung unserer einzelnen Platine über die API implementiert . In diesem Video möchte ich meine Idee teilen, wie wir dieses Board verwenden und speichern werden. Und tatsächlich könnte es ein bisschen schwierig sein. Warum ist das so? Denn eigentlich hier im Kunden haben wir unsere Board-Komponente und können sie hier einfach in einer Immobilie lagern. Das ist völlig in Ordnung. können wir machen. Aber später werden wir ein Modell haben und hier werden die Dinge anders sein. Um nur zu erwähnen, dass wir hier eine Seite mit dem Board haben und dann eine Aufgabe getroffen haben, um diese Aufgabe innerhalb des Modells zu öffnen Das Hauptproblem ist, wenn wir die Seite neu laden, wir wollen zu dieser spezifischen Aufgabe zurückkehren, was bedeutet, dass wir in unserem URL-Slash-Board-Slash-Board-ID-Slash-Aufgaben-Slash-Aufgaben-ID haben möchten . Dann laden wir die Seite neu und holen uns zuerst unser Board, dann vielleicht alle Spalten, alle Aufgaben. Und wir wollen diese Aufgabe innerhalb des Modells lösen, aber hat es einen Mittelwert? Wir speichern zum Beispiel unser Board hier in der Board-Komponente, aber wir können diese Informationen nicht wirklich in unserer Aufgabenkomponente verwenden . Warum ist das so? Denn später werden wir unsere Aufgabenkomponente hier als untergeordnete Komponente dieses Pfades registrieren. Und wir können in keiner Weise auf einige Daten zugreifen , die in dieser Board-Komponente des Kindes gespeichert wurden . Was ist die Lösung für dieses Problem? Wir müssen einen Dienst in Anspruch nehmen. Wie können wir das machen? Zunächst möchte ich innerhalb eines Boards einen neuen Ordner erstellen , der Services genannt wird. Und hier können wir Board Dot Service erstellen, dot ds. Hier. Wir sollten unseren Board-Service hier nicht mit unserem Board-Service mischen , der Shared Services-Boards hat. Dieser Service dient nur dazu, Daten aus dem Backend abzurufen. Wenn wir unsere Boards bekommen wollen, verwenden wir gute Boards, langweilen uns, erstellen Boards und so weiter. Aber was wir innerhalb des Boards tun, das ist eine Art Zustand für diese spezielle Seite, was eigentlich bedeutet, dass wir hier unsere Board-Spalten, Aufgaben, alles, was wir auf dieser Seite haben, speichern werden unsere Board-Spalten, Aufgaben, alles, , und dann können alle Komponenten auf dieser Seite den Dienst verwenden, um diese Informationen über Streams abzurufen. Deshalb wollen wir hier unsere Klasse erstellen und es wird sich langweilen Service. Und hier oben sollten wir nicht vergessen, ein injizierbares Mittel zu verwenden. Was ich jetzt hier machen möchte, genau das Gleiche, was wir mit unserem aktuellen Benutzer gemacht haben. Nur um Sie daran zu erinnern, wir hatten hier unseren Service. Hier oben haben wir diesen aktuellen Benutzerstream erstellt , wir in unserer gesamten Anwendung verwenden können. Wir wollen genau das Gleiche tun. Jetzt hier, wir wollen hier erstellen Board war größer und das ist ein Stream und das ist in deinem Verhaltensthema. Und wir bekommen jetzt beide Board-Schnittstellen an. Und hier drinnen setzen wir jetzt nur weil wir standardmäßig kein Board haben werden. Wir haben es noch nicht geholt. Und nachdem wir dieses Board abgerufen haben, können wir es einrichten und den Stream aktualisieren. diese Weise müssen wir hier eine neue Methode schaffen, sagte Board. Und inside womb muss unser Board bereitstellen, das unsere Board-Schnittstelle ist, und das ist nichtig. Und hier was wir tun wollen, gut, diese Dartscheibe Stoller Punkt als nächstes zu nennen , weil wir einen Stream aktualisieren und uns innerhalb unseres Boards zurückziehen wollen . Jetzt sollten wir nicht vergessen, unseren Boardservice innerhalb eines Moduls zu registrieren . Also müssen wir hier unsere Anbieter erstellen und wir schreiben unseren Boardservice darin. Und jetzt können wir es direkt in unserer Komponentenplatine verwenden . Wir wollen hier also kein Property Board erstellen. Wir wollen hier in unseren Konstruktor tatsächlich eine neue Eigenschaft injizieren . Und es wird sich langweilen Service vom Bordservice. Und wie Sie sehen können, ist dies der Unterschied, den wir hier haben, sowohl Dienstleistungen als auch Boardservice und Boardservice. Und das ist ein großer Unterschied. Zuallererst ist dies ein Service für die Zusammenarbeit mit eBay. Der zweite Dienst ist eher wie ein Staat. Und was wir jetzt mit Abrufen von Daten nach dem Abonnieren tun können, können wir diesen Board-Service schreiben und sagen, Dot Set Board. Und wir werden innerhalb unseres Boards versorgt. In diesem Fall speichern wir das hier im Stream. Und jetzt können wir diese Informationen nicht nur innerhalb unserer Board-Komponente verwenden , sondern später auch innerhalb unserer Aufgabenkomponente. Und das ist extrem flexibel und die beste Lösung, die ich mir vorstellen kann, um Daten zwischen zwei Runden auszutauschen. Und nur um zu überprüfen , ob es funktioniert, möchte ich hier im Top-Stream für das Board erstellen. Also tatsächlich haben wir hier einen Board-Stream und wir wissen, dass dies eine beobachtbare Board-Schnittstelle ist. Also zeigen wir hier, dass wir ein Board brauchen. Es gibt keine andere Möglichkeit. Und um diesen Typskriptfehler ohne Initialisierer zu vermeiden, schreiben wir diesen Code direkt in den Konstruktor. Das ist völlig in Ordnung. Also hier können wir dieses Dotboard mit Dollar gleich schreiben, und hier wollen wir den gespeicherten Service dot verwenden. Und hier haben wir unsere Saite, die Board Dollar ist. Und du könntest sagen: Okay, warum benutzen wir das nicht direkt? Da wir hier im Board-Stream sind, können wir jetzt in unsere Komponente gelangen , ohne dass Null überhaupt nicht benötigt wird. Wir wollen einfach mit unserer Komponente arbeiten , wenn das Board nicht jetzt ist. Deshalb können wir hier schreiben, Pipe schreiben und dann das Ergebnis filtern. Also hier wird nur Filter Boolean eliminieren. Von hier aus werden wir nichts mehr bekommen , wenn es jetzt ist, wir werden nur unser Board aktualisieren. Wenn wir ein Board bekommen und jetzt in unsere HTML-Datei springen und hier unseren Board-Stream nur zum Testen rendern können , ist dies der Grund, warum Board-Dollar. Und hier verwenden wir eine einzelne Pipe , um diese Informationen zu rendern. Schauen wir uns das an. Ich lade die Seite neu und wir bekommen object, object weil wir im Wesentlichen benachbart sind und wir es mit Jason Pipe übergeben müssen. Schauen wir uns das nochmal an. Wir bekommen hier unser Board, und wie Sie sehen können, dies unsere Informationen unseres Boards, die vorab abgerufen wurden. Das ist Titel, Benutzer, Benutzer-ID. Die Idee ist also im Wesentlichen, dass dieser Dienst Informationen enthält, aber wir müssen diese Informationen nicht irgendwie in unserer Board-Komponente speichern . Wir verwenden einfach Streams aus dem Service und verwenden sie in jeder einzelnen Komponente , in der wir müssen. Beispielsweise schreiben wir bei Bedarf genau denselben Code in unsere Aufgabenkomponente Beispiel der Zugang für unseren Vogel. Was noch wichtiger ist, wir können Daten wie diese zuordnen, was sehr praktisch ist. 28. Erstellung von socket: In diesem Video starten wir einen interessanten Teil unserer Anwendung und sie richtet unsere Socket-Layer-Verbindung ein. Und nur um Sie daran zu erinnern, wir haben es bereits eingerichtet. Also Quetta, du bist im Backend. Also können wir hier in unserem Code Service Source Server Test öffnen. Und hier oben haben wir einen neuen IR-Server, und dann haben wir hier eine IR-Verbindung. Und hier ist unser Konsolen-Log Connect, was bedeutet, dass wir es erfolgreich eingerichtet haben. Gehen Sie also ins Backend, und jetzt müssen wir es auf dem Client implementieren. Und dafür werden wir genau dieselbe Bibliothek verwenden , die wir im Backend verwenden. Nur um Sie daran zu erinnern , dass wir Socket benutzt haben Das ist hier in der Konsole, ich möchte in unseren Client-Ordner springen. Und hier möchte ich ein neues Paket installieren, das socket Datta your dash client heißt . Und dies ist genau das gleiche Paket aus demselben Team, aber es dient zur Einrichtung unseres Kunden. Und dieses Paket hat nichts mit eckig zu tun. Das ist nur ein einfaches JavaScript. Also was wollen wir jetzt überhaupt machen? Zunächst möchte ich in der Quell-App unserer Kunden , den Shared Insight-Diensten, einen neuen Dienst erstellen, und es wird unser Service sein, mit Socket zu arbeiten. Das ist so hier. Nennen wir seinen Socket, DOD-Dienst dot ts. Und jetzt müssen wir im Inneren unsere Klasse erstellen , die Socket-Service genannt wird. Und natürlich sollten wir hier oben injizierbar nicht vergessen . Was wir also hier schaffen wollen, wir wollen eine Funktion schaffen, die für uns eine neue Verbindung generiert. diesem Grund können wir hier eine SetTab-Socket-Verbindung schreiben. Und hier bekommen wir unseren aktuellen Benutzer. Warum verwenden sie es aktuell, weil sie tatsächlich einige private Daten über die Socketverbindung senden wollen . Warum ist das so? Weil wir eigentlich Socket benutzen werden. Du bist auf der Board-Seite, was bedeutet, dass unser Benutzer registriert ist. Aber wenn wir in Yogis eintauchen, haben wir kein System wie GET, wie wir es für die Authentifizierung verwendet haben. Wir haben dort keine HTTP-Header und können unser Token nicht an unseren Socket anhängen. Aber es gibt eine Möglichkeit, unser Token mithilfe von Socket zu übergeben. diese Weise wird dies möglich. Wir möchten diese Verbindung für unseren aktuellen Benutzer einrichten. Und wir können dann bei jeder einzelnen Anfrage das Token vom CurrentUser innerhalb unserer Socket-Verbindung werfen . Wie ich hier schon sagte, bekommen wir als Argument den aktuellen Benutzer und diese aktuelle Benutzeroberfläche. Und zurück werden wir nichtig. Jetzt hier drinnen wollen wir unser Ion benutzen. Und eigentlich muss ich hier oben auf deiner Trommel eingeben. Und hier haben wir unseren Socket-IO-Client. Jetzt kann ich hier in der Notaufnahme eine URL angeben, unter der wir uns verbinden möchten. Und eigentlich können wir hier einfach versuchen, HTTP und unseren Port des Servers zu verwenden. Wir wollen das nicht verwenden, weil wir dafür Umgebungsvariablen haben, was eigentlich bedeutet, dass wir in die Quellumgebung des Kunden springen wollen , ja, und hier haben wir unsere API Euro, wir wollen Socket eine URL erstellen. Hier können wir die Sockets-URL erstellen, und das ist der http localhost. Hier haben wir 4.001 und müssen hier keinen Schrägstrich von acht Pi setzen , da wir unsere Socket-Layer-Verbindung direkt auf unserem Server einrichten . Und Sie könnten sagen, okay, aber wir könnten diese API wie eine einzelne Eigenschaft für API-URL und Socket-IO wiederverwenden . Ja, das könnten wir, aber ich empfehle Ihnen dringend , es auf zwei verschiedene Immobilien aufzuteilen. In diesem Fall ist es einfacher, es später zu teilen, wenn Sie Ihren Socket-Layer auf einen anderen Webserver verschieben möchten. Jetzt können wir in unserem Socket-Service unsere Umgebung nutzen. Das ist so, Environment Dot, wir haben Sockets, URL. Das ist genau das , was wir von innen nach außen oder Ihrer Verbindung geben müssen . Und ausgezeichnet. Jetzt möchte ich zusätzlich das Token von unserem aktuellen Benutzer bereitstellen, da wir die Socket-Layer-Verbindung nur für Login-Benutzer eingerichtet haben, was bedeutet, dass wir nie einen Fall haben , in dem wir dieses Token nicht haben. Auf diese Weise können wir Feldstunden schreiben und dann die Seite, auf der wir sprechen, was das aktuelle Benutzer-Punkt-Token ist. Und tatsächlich stellen wir hier als zweites Argument ein Objekt mit unserem Feld zur Verfügung und dieses Outfield innerhalb von Socket IO dient genau dazu, einen Benutzer zu authentifizieren. Und was wir zurückbekommen, ist das Ergebnis unseres AR ist diese Socket-Verbindung. Hier möchte ich diesen Socket gleich IR schreiben. Und hier müssen wir diese Eigenschaft erstellen, sie innerhalb des Sockets. Und wie Sie sehen können, sind dies unsere beiden Eingaben. Das ist nicht richtig. Wir wollen den Socket aus dem Socket Layer-Client importieren, oder er ist nicht definiert weil wir standardmäßig keinen Socket haben. Und dann haben wir es irgendwann eingerichtet, indem wir die Setup-Socket-Verbindung verwenden. Zusätzlich zu unserer Setup-Funktion möchte ich eine Disconnect-Funktion erstellen, was tatsächlich bedeutet, dass unser Benutzer irgendwann gesperrt wird und wir ihn von unserem trennen möchten Socket-Verbindung. Hier erstellen wir hier eine zusätzliche Funktion disconnect. Und das ist ganz einfach. Was wir hier nennen wollen, wir wollen diesen Punkt-Socket schreiben. Und hier haben wir eine Methode , die Disconnect genannt wird. Und wie Sie hier sehen können, bekomme ich keine automatische Vervollständigung, da dieser Socket möglicherweise nicht definiert sein kann. Und es gibt zwei mögliche Abweichungen, wie wir das beheben können. Zuallererst kann ich hier einfach ein Fragezeichen setzen und ich bin fertig. Aber ich möchte den Code nicht so schreiben. Ich möchte einen Entwickler wirklich darüber informieren , dass wir ein Problem haben, wenn wir keinen Socket haben. Wir können Disconnect nicht wirklich verwenden , bevor wir unsere Verbindung herstellen. Wenn wir diese Punktfassung nicht haben, wollen wir werfen und verengen. Also hier wird ein neuer Fehler geworfen. Und zum Beispiel ist hier keine Steckdosenverbindung hergestellt. Damit ist unser Basis-Socket-Service erfolgreich erstellt. Jetzt müssen wir irgendwann die Einrichtung einer Socket-Verbindung implementieren und sie wollen es wirklich in unserem App-Modul tun. Warum ist das so? Denn jedes Mal, wenn wir authentifiziert sind und Berlin, jetzt wo wir CurrentUser haben, möchte eine Verbindung aufbauen. Hier können wir in unsere App-Komponente springen. Und hier haben wir einen nächsten. Und nur um Sie daran zu erinnern, wir hier jedes Mal aktuelle Benutzer erhalten , wenn wir unsere Anwendung starten. Und hier stellen wir den aktuellen Benutzer ein und können, bevor wir hier eine Verbindung herstellen. Hier können wir privat schreiben und wir haben einen Socket-Service, und das ist unser Socket-Service. Jetzt hier bevor wir schreiben können, dass wir hier diese Punkte haben, Socket-Service, Punkt, Setup-Socket-Verbindung. Und tatsächlich bekommen wir hier unseren aktuellen Benutzer und wir können ihn reingeben. Speichern wir das und prüfen, ob es funktioniert, wie Sie hier sehen können, haben keine Fehler und springen dann in den Browser. Und hier ist es rot, wir bekommen einen Fehler. Kein Anbieter für den Socket-Service das beendet, weil wir unseren Socket-Service erstellt haben , aber wir haben nicht in ein Modul injiziert. Und hier verwenden wir den Socket-Service innerhalb unserer App-Komponente, was bedeutet, dass es sinnvoll ist, dieses Modul in unsere Anbieter einzufügen . diesem Grund können wir hier einen Socket-Service schreiben und wir loslegen. Schauen wir uns das an. Ich lade die Seite neu und wir erhalten einen weiteren Fehler. Was auch immer wir bekommen, wir stellen diese Anfrage auf Garn. Sie können es hier sehen, aber wir erhalten einen Fehler. Wir haben einen Kurs, was eine Cross-Origin-Politik bedeutet. Denn hier mit haben Sie keine Zugriffskontrolle erlauben Origin-Header auf der angeforderten Ressource. Und das ist eigentlich völlig richtig und wir müssen innerhalb von Serum herausfinden, warum es überhaupt passiert, weil unser Server keine Verbindungen von anderen Hosts zulässt und hier sicher einen anderen Host verwenden wird, das ist ein lokaler Host für 1200. diesem Grund müssen wir in eine Serverquelle gehen. Und hier haben wir unsere Serverstufen, und hier müssen wir unseren IIS-Server ein bisschen anders konfigurieren . Hier können wir als zweiten Parameter einige Optionen bereitstellen und wir suchen nach der Option , die als Kerne bezeichnet wird. Und im Inneren können wir den Ursprungsstern setzen und tatsächlich bedeutet Start, dass wir Verbindungen von jedem Host zulassen . Und beim Bahnprojekt möchten Sie vielleicht hier nur einen Host Ihrer Domain schreiben. Aber für unsere Zwecke ist der Ursprungsstern völlig gültig. Prüfen wir, ob es funktioniert. Ich freue mich jetzt über die Seite und wir haben keine Fehler. Jetzt können wir ins Netzwerk springen, und wie Sie sehen, haben wir hier WebSocket-Verbindungen. Also hier kommen wir zu Hunderten. Und wenn Sie in Ihrem Browser so etwas sehen können, bedeutet das, dass Ihre Anfrage der Socket-Verbindung das ist. Und tatsächlich können wir jetzt in unsere Backend-Konsole springen. Und hier können wir connect dreimal sehen , denn jedes Mal, wenn ich die Seite neu lade, wird eine neue Verbindung hergestellt, was bedeutet, dass wir erfolgreich eine Socket-Verbindung erstellt haben auf den Kunden. Jetzt ist die einzige Frage, was ist mit Disconnect? Wir erstellen eine Verbindung , konnten sie aber nicht verwenden, wo immer wir sie verwenden wollten. Eigentlich würde ich es innerhalb des Logouts verwenden wollen. Hier können wir in unsere App, das Gesundheitswesen und den Ergebnisdienst einsteigen . Und hier haben wir unseren Logout. Und hier entfernen wir zuerst unser Reden, dann wenn null und unser aktueller Benutzer. Und hier können wir Socket verwenden, um unsere Verbindung zu trennen , weil wir wissen wie wir es verwenden, ist es nicht mehr gesperrt. Wir benötigen diese Socket-Verbindung nicht. Dies ist hier im Konstruktor, wir können unseren neuen Socket-Service injizieren, und das ist unser Socket-Service. Jetzt können wir hier unten in unserem Logout diesen Socket-Service dot disconnect schreiben, und wir werden unseren aktuellen Benutzer trennen und unsere Socket-Verbindung schließen. 29. Verbinden und Verlassen von Board: In diesem Video möchte ich Ihnen zeigen, wie wir Sockets am Beispiel der Verbindung mit unserer Platine verwenden und sie von der Platine trennen können Beispiel der Verbindung mit . Was heißt das jemals? Tatsächlich Socket-IO einfügen. Wir haben so ein dünnes, das heißt Räume, was eigentlich bedeutet, wenn wir unser Backend nicht nur mit einer Socket-Nachricht oder einem anderen Kunden benachrichtigen unser Backend nicht nur mit einer Socket-Nachricht oder , wenn sie alle Clients definieren , die mit bestimmten verbunden sind zimmer. Und wenn wir über Boards im Trailer sprechen , ist das sehr sinnvoll. Wir möchten wirklich nur Benutzer benachrichtigen , die diesem speziellen Board beigetreten sind. Was zum Beispiel bedeutet, dass wir zwei verschiedene Benutzer haben. Ein Benutzer hat das Board voll geöffnet. Zweiter Benutzer öffnet das Board-Formular. Jetzt hat der erste Benutzer eine Aufgabe erstellt und wir müssen einen zweiten Benutzer über das Erstellen dieser Aufgabe informieren , da er mit diesem Raum oder diesem Board verbunden ist . Hier werden wir in diesem Video erläutern, wie wir beitreten und unseren Vorstand verlassen können. Und dafür müssen wir eine neue Methode in unserem Socket-Service erstellen . diesem Grund möchte ich hier unsere Circuit Service Tiers öffnen und eine neue Methode erstellen, die Emmet genannt wird. Warum wir diese Methode überhaupt brauchen, eigentlich Insights Socket selbst. Wir haben diese Punkte, Socket, Dot und Meet, und wir können nur eine Zeichenfolge wie foo liefern. Es wird unsere Botschaft sein. Und hier können wir einige Informationen bereitstellen, zum Beispiel Ambar-String. Auf diese Weise können wir normalerweise Sockets in unserer Anwendung verwenden , aber ich möchte sie aus zwei Gründen in eine zusätzliche Methode einbinden . Zunächst möchten wir eine Bibliothek isolieren und einen Wrapper erstellen. In diesem Fall können wir diese Verwendung, zum Beispiel Socket für Ihren Client, immer wegwerfen zum Beispiel Socket für Ihren Client, und eine andere Bibliothek verwenden. Zweitens möchte ich hier validieren , dass mit der Buchse ein Garn verbunden waren. Das ist so, hier ist unser Image und wir kommen hier, zuallererst, unser Veranstaltungsname, es ist nur eine Zeichenfolge. Und wenn Sie sich innerhalb von Socket IO nicht auskennen, emittieren wir immer nur mit eindeutigen Strings, die wir auf anderen Clients oder in unserem Backend hören . Und die zweite hier wird eine Nachricht sein in der ich jede Verschwendung schreiben werde, irgendeine, weil es eine Nachricht ist, die wir eine Zeichenfolge und kein Objekt oder irgendwelche Daten bereitstellen können , die wir mögen. Und hier bekommen wir eine Lücke, aber wir wollen drinnen machen. Zunächst werde ich diese Zeile kopieren und einfügen, um die Socket-Verbindung zu überprüfen. Denn wenn wir keine Steckdosenverbindung haben , können wir kein Fleisch verwenden. Danach. Wir können einfach diesen Socket-Punkt-Commit verwenden und wurden in unserem Ereignisnamen-Komma bereitgestellt. Und hier ist unsere Botschaft. Unsere Bildfunktion ist also bereit und jetzt können wir sie verwenden. Und eigentlich möchte ich es direkt in unseren App-Board-Komponenten, Board-Komponenten, Komponenten verwenden in unseren App-Board-Komponenten, . Und hier haben wir im Juni die Init-Methode. Und tatsächlich ist es ein netter Ort, um einfach hier den Beitritt des Benutzers zu platzieren, was bedeutet, dass jedes Mal wenn diese Komponente geladen wird, es bedeutet, dass die Benutzer zu diesem spezifischen Punkt gesprungen sind Route und wir müssen uns dem Benutzer anschließen, wenn er die Route geändert hat und wir diesen Raum oder dieses Board verlassen wollen. Also mit Trennen Sie einen Benutzer von diesem bestimmten Raum. Deshalb können wir das hier schreiben. Zuallererst müssen wir hier unseren Socket-Service injizieren. Das ist y, hier wird Socket-Service sein, und das ist unser Socket-Service. Jetzt können wir diese Methode verwenden und diesen Punkt Socket Service Dot schreiben. Und hier haben wir unser Image und wir müssen zuerst einen Einblick in unseren Veranstaltungsnamen und zweitens einige Daten geben. Also im Wesentlichen, was wir hier schreiben wollen, so etwas wie Boards beitreten. Und hier wird unsere Nachricht zum Beispiel ein Objekt mit Board-ID sein. Und hier geben wir die Board-ID dieser spezifischen URL an. Das ist diese Board-ID. Wir haben diese Informationen bereits. Warum ich diese Informationen in das Objekt gepackt habe. Weil deflate, wenn wir aus irgendeinem Grund mehr Informationen mit dem Objekt hinzufügen möchten, können wir es direkt tun. Wenn wir hier haben, muss ein String all diese Stellen von der Zeichenkette bis zum Objekt widerspiegeln . Und wie Sie hier sehen können, können wir jede Belastung ausstoßen. Wir können hier schreiben für. Es ist völlig in Ordnung, aber wir werden viele verschiedene Socket-Events haben und wir wollen sie irgendwie organisieren. diesem Grund bevorzuge ich hier Boards, die ein Plural einer Entität sind, wie Boards oder vielleicht Spalten oder Aufgaben. Und was ist passiert? Zum Beispiel haben wir uns angeschlossen, das ist nur ein Anfang. Wir können später so etwas wie gemeinsamen Erfolg erzielen, wenn es in einem synchronen Prozess ist, was eigentlich bedeutet, Vögel beitreten in Ordnung sind. Was nicht in Ordnung ist, ist, dass wir hier eine Zeichenkette schreiben wo direkt in TypeScript ist und wir unzählige verwenden müssen. Und eigentlich sind unzählig nur einige Konstanten innerhalb einer einzelnen Eigenschaft. diesem Grund möchte ich hier auf der rechten Seite unseren freigegebenen Ordner öffnen, und hier haben wir Typen. Hier. Ich möchte Socket-Ereignisse Punkt in m Punkt ts erstellen. Hier. Jetzt können wir unsere Enum exportieren, die ENM von Socket UN ist, und das ist nur ein Objekt, in dem wir Feldbretter join equals schreiben können , und hier schreiben wir Boards join. Zuallererst haben wir hier einen Codestil. Zweitens Luba hier nicht gezogen, eine Schnur. Genau hier drin verketten sich Socket-Ereignisse in m Dotboards, in diesem Fall an jeder einzelnen Stelle , an der dieselbe Zeichenfolge verwendet wird, aber wir werden sie niemals falsch schreiben , weil wir hier Justin unum verwenden, was eine Variable und keine einfache Zeichenfolge ist. Was diese Zeile also tut, sendet sie für unser Back-End in einer neuen Socket-IO-Nachricht aus. Hier wurden einige Zeichenketten und einige Daten bereitgestellt. Warum wir genau diese Daten bereitstellen, weil wir im Backend unserem aktuellen Benutzer beitreten möchten. Also unsere aktuelle Steckdosenverbindung zu der spezifischen Platine. Und das reicht aus, damit unser Backend darauf reagieren kann. Jetzt ist es an der Zeit, es auf der Back-End-Seite zu implementieren Hier müssen wir die Quelle unseres Servers öffnen. Und hier haben wir unseren Servertest. Und hier unten haben wir unsere eigene Verbindung. Das ist völlig in Ordnung. Jetzt können wir dieses Konsolenprotokoll entfernen und wir möchten mit eingeschaltetem Socket-Punkt auf einige Ereignisse reagieren und tatsächlich hören, worauf wir warten. Wir warten auf die Vorstandssitzung. Aber hier haben wir genau das gleiche Problem, wo wir im Backend sind und wir wollen nicht nur einfache Strings schreiben. Wir wollen sie auch in der Aufzählung organisieren. Und tatsächlich werden wir genau die gesamte Datei unserer Socket-Events im Client und im Sirup duplizieren . Und man könnte sagen, okay, das ist nutzlos. Wir können nur eine einzige Datei erstellen. Sie könnten, aber möglicherweise können Sie Ihren Client und Server in verschiedene Repositorys aufteilen und dann alles zwischen ihnen teilen. Deshalb möchte ich unseren Kunden und unser Backend wirklich isolieren. Was wir also hier in unseren Typen machen wollen, können wir genau das Gleiche schaffen. Es werden unsere Socket-Events sein, die keine Punkte aufzählen. Und jetzt könnten sie genau den gleichen Code platzieren , den wir auf dem Client haben. Was ich jetzt hier machen möchte, anstelle von Birds Join kann ich anstelle von Birds Join Socket Events in m Dot Boards Churn schreiben. Und wie Sie sehen können , stammt diese Eingabe von Socket-Ereignissen. So abonnieren wir unsere Veranstaltung vom Kunden mit socket, the tongue, aber von wo wir unseren Socket bekommen, ist dies unser erster Parameter hier. Wie Sie sehen können, ist dies Socket und hier haben wir Socket Dot an, aber hier müssen wir zwei Argumente angeben. Erstens ist es unsere Veranstaltung und zweitens unser Kohlberg. Was wir also hier bekommen, wo normalerweise einige Daten eingehen, und das sind genau die Daten , die wir vom Kunden bereitgestellt haben. Wir könnten hier etwas Logik schreiben, wollen es aber nicht, weil wir eigentlich alles geschrieben haben, was unseren Boards zu tun hat, innerhalb der Kontrolle. Und es ist sehr sinnvoll, unseren gesamten Socket-IO-Code auch innerhalb des Controllers zu schreiben . uns egal, ob es Socket Layer oder Justice GTP ist. Wir können den ganzen Code in unseren Controllern isolieren. Hier können wir hier den Controller-Punkt unseres Boards verwenden, zum Beispiel Join Board. Das wollen wir umsetzen. Und jetzt möchte ich zuerst mehr als Socket und dann Daten geben. Und wir werden in jedem einzelnen Fall, wenn wir mit Socket Layer arbeiten diese Informationen innen geben. Das ist dem, was wir mit unserem Express machen, sehr ähnlich . Hier. Wir verwenden Geburtenkontrolle oder Create Board. Und tatsächlich geben wir auf diese Weise direkt eine Antwort auf Insider-Anfragen. Und als nächstes, warum wir das tun. Wenn wir alles im Inneren bereitstellen, können wir tatsächlich verwenden, was wir wollen. Wenn wir ein Y'all brauchen, können wir beim Radfahren ein Garn verwenden. Wir können diese Informationen verwenden wenn wir Daten von der Veranstaltung benötigen, wir können sie auch verwenden. Und jetzt müssen wir nur noch unser Joint umsetzen. Deshalb möchte ich in unseren Controller-Sport einsteigen. Und hier unten müssen wir eine neue Funktion erstellen. Hier haben wir Expertenkegel, Joan Board, und wir kommen zuerst hierher, Iowa, was ein Server ist. Eigentlich haben wir hier viele Inverse. Deshalb müssen Sie vorsichtig sein, aber wir müssen hier unseren Server von Socket IO eingeben. Das ist wichtig. Hier bekommen wir ein Garn und es ist unser Server als Typ. Danach haben wir unsere Steckdose. Und Socket kommt auch von Socket IO. Und zu guter Letzt sind hier unsere Daten. Und tatsächlich wissen wir, dass wir im Inneren eine Board-ID angeben, die eine Zeichenfolge ist, und das sind genug Informationen für uns. So sieht also eine typische Funktion innerhalb des Controllers aus, wenn wir mit Socket Layer arbeiten. Und was wir jetzt drinnen machen wollen, wir wollen einfach Socket Dot Join schreiben. Hier stellen wir die Daten-Punktboard-ID zur Verfügung. Und das ist es, das ist nur eine einzige Zeile. Also was macht dieser Code, so wird Mi in dieser aktuellen Socket-Verbindung angezeigt. Also unser aktueller Benutzer für diese Board-ID, und das ist nur eine Zeichenfolge, nichts weiter. Aber eigentlich, wenn wir join und einige foo schreiben, sagen wir socket einfach, dass er den aktuellen Socket mit diesem Namen mit diesem Raum verbinden soll, aber wir haben keine Räume in unserer Anwendung, wir haben Boards, aber die Idee ist genau das Gleiche, wo unsere Benutzer dem Board beitreten und sie dann unsere Nachrichten an dieses spezielle Board erhalten. Jetzt wollen einige testen, ob unser Code funktioniert. Deshalb möchte ich hier nur einen Konsolenprotokollserver schreiben , Socket Join. Und hier werde ich in diesem Fall Komma Data Dot Board AD schreiben . Aber jetzt, wenn wir dieses Konsolenprotokoll sehen, bedeutet das, dass unsere Nachricht erfolgreich vom Client oder dem Backend gesendet wurde . Und unser Backend reagierte auf die Nachricht und begleitete unseren Benutzer in diesen Raum. Hier springen wir in unser Backend und laden die Seite neu. Und wie Sie sehen können, haben wir keine Fehler. Und tatsächlich wird unser Code mit dieser Board-Komponente und diesem Bild ausgelöst, weil unsere Komponente gerendert wurde. Und jetzt können wir in die Konsole springen und du kannst den Service Circuit oder deinen Join sehen. Und hier ist das d unseres Vorstands. Hier schließen wir uns unserem aktuellen Socket an. Und wie Sie im Browser sehen können, ist dies genau das d unseres Boards. Und jetzt wollen wir genau das Gleiche mit Wohnen und Verpflegung machen. Und was sie eigentlich tun wollten, ich möchte hier eine zusätzliche Methode erstellen, Zuhörer initialisiert und eigentlich alle meine Zuhörer wie Abonnements, zum Beispiel packe ich immer ein zusätzliche Methode. Dies ist der gleiche Name in wie zum Beispiel Daten abrufen. In diesem Fall packen sie im Juni nicht viele Informationseinblicke hinein. Hier möchte ich schreiben, Zuhörer initialisieren und hier live auf einer Seite abonnieren . Und tatsächlich können wir das tun, wenn wir eine Dürre-App verwenden und wir hier eine Dürre haben, aber keinen Router. So müssen wir hier den Router benutzen und es ist unsere Aufgabe. Und jetzt können wir hier ein Abonnement schreiben, um auf einer Seite zu leben. Und hier können wir diese Punkt-Router-Punkt-Ereignisse schreiben. Und hier haben wir uns angemeldet. Und tatsächlich abonnieren wir, wir bekommen hier Zugriff auf jedes einzelne Ereignis, das von einem Router ausgelöst wird. Und was wir hier schreiben wollen, wenn Ereignis, Instanz von hier haben wir Navigationsstart. Und der Navigationsstart ist der Beginn einer Änderung unserer Route. Und wenn das passiert, dann möchte ich hier die Konsole protokollieren und eine Seite verlassen. Also nutzen wir hier erneut Dürreereignisse, um alle Dürreereignisse zu abonnieren. Und wir erhalten jetzt mit Abonnieren Zugriff auf jedes einzelne Ereignis hier, um nach dem spezifischen Ereignis zu suchen , bei dem die Instanz von verwendet wird, und wir stellen hier den Navigationstapel zur Verfügung. Und hier ist unser Konsolenlog, in dem wir eigentlich eine Socket-Nachricht ausgeben wollen und diese Nachricht wird live in einem Board sein. Dann müssen wir einen Benutzer von diesem speziellen Board trennen . Schauen wir uns das an. Ich lade die Seite neu und wir haben eine enge Ich habe vergessen, hier oben ein Komma zu setzen. Also lass es uns jetzt tun und die Seite neu laden. Und wie Sie sehen können, haben wir keine Fehler, aber wir können nicht wirklich zu einer anderen Seite springen , auf der sie versuchen können, dies hier zu tun. Ich kann einfach zurückschlagen und wir verlassen die Seite, weil wir jetzt auf der Slash-Board-Seite sind. Und hier ist dieses Konsolenprotokoll, was eigentlich bedeutet, dass dieses Konsolenprotokoll jedes Mal ausgelöst wird , wenn wir eine Seite leben. Aber eigentlich möchte ich hier keinen Sockets Service Summit verwenden. Stattdessen möchte ich hier dieses Board Service Dot Leaf Board schreiben . Und eigentlich fragst du vielleicht, aber warum, warum nicht einfach in den Socket schreiben, inmitten der Antwort hier, es ist nicht auf LinkedIn , das wir innerhalb eines Board-Service machen wollen , wenn wir die Seite verlassen. Und tatsächlich haben wir hier im Overboard-Service den Stream des Boards und wir müssen ihn auch auf jetzt einstellen , als wir das Board verlassen haben, das ist hier. Lassen Sie uns unsere Leafboard-Methode erstellen und wir haben hier nur noch eine Lücke drin. Zuallererst, whoop, möchte dieses Board neben jetzt setzen, was eigentlich bedeutet, dass wir kein Board mehr haben. Und danach wollen wir diese Botschaft erfüllen , die den Vorstand verlassen wird. Deshalb müssen wir unsere gemeinsamen Typen öffnen. Und hier sind Socket-Events. Hier haben wir Boards Churn. Jetzt können wir diese Nachricht kopieren, einfügen und sie live als Boards benennen. Und das langweilt sich einfach. Verlasse. Jetzt werde ich diese Zeile kopieren und einfügen. Und jetzt können wir hier unseren Socket-Service nutzen. Aber dafür muss VM es hier in den Konstruktor injizieren. Hier haben wir also unseren Socket-Service, und das ist ein Socket-Service und wir verwenden ihn genau wie zuvor. Was ich hier schreiben möchte, ist dieser Dots Socket Service Punkt m es und wurde in unserem Eventnamen bereitgestellt. Und in diesem Fall werden es unsere Socket Events E und M Dot Boards live sein. Und eigentlich müssen wir hier bereitstellen, was der Vorstand wir leben müssen. Hier fehlt uns eine Board-ID, die eine Zeichenfolge sein muss, und wir müssen von unserer Komponente bereitgestellt werden. Hier möchte ich eine Board-ID angeben. Jetzt müssen wir unsere Komponente aktualisieren. Also hier haben wir unsere Board-Komponente, und hier im Live-Board schreibe ich diese Punkt-Port-ID. Jetzt müssen wir nur noch genau das Gleiche auf dem Server implementieren , das wir beim Joining gemacht haben, aber wir müssen live verwenden. Hier ist es Lass uns zurück in Silos springen, Server, Quelle, Server es, ja. Und hier haben wir unseren Verbindungs- und Port-Riesen. Was ich jetzt tun muss, ich möchte die Socket-Ereignisse in ihnen im Backend aktualisieren , und es werden auch Ports verlassen. Und hier bin ich live Boards. Nun, hier können wir diese Zeilen komplett kopieren und einen weiteren Socket registrieren, nicht für Boards aufgewühlt, aber für Dotboards live raten er hat einige Daten. Und hier wollen wir den Ports-Controller verwenden, nicht dem Board beitreten, sondern das Board verlassen. Und wir müssen jetzt diesen Live-Pod in unserem Controller erstellen . Und eigentlich wird es hier genauso sein. diesem Grund werde ich diese Methode komplett kopieren und sie einfach live hier nennen . Wir bekommen unsere IR als zuvor Sockel, da zuvor Insider-Daten enden, wir haben unsere Board-ID. Jetzt können wir hier im Konsolenprotokoll unseren Garten schreiben, um zu verlassen. Und hier ist die Datenplatine AD und anstelle der Steckdosenverbindung, wo genau hier, Socket Dark Leaf, und mit dieser einzigen Leitung, wo wir unsere aktuelle Steckdose aus diesem speziellen Raum bewegen , was bedeutet, dass wir wird keine Events von diesem Board bekommen. Prüfen wir, ob es funktioniert. Ich lade die Seite neu und wir sind drin. Jetzt bin ich hier versteckte Tasche und wir müssen den Abschnitt für unser Backend versenden. Schauen wir uns das an, wie Sie hier sehen können. Zuallererst hatten wir hier eine Steckdose, an die ich anschließe und mit diesem speziellen Raum beitrete. Und wenn ich dann zurückschlage, haben wir ein Blatt aus diesem Raum. Und genau so arbeiten ein Kunde und ein Betteln zusammen, wenn wir Socket IO verwenden. 30. Authentifizierung in socket.io: In diesem Video müssen wir die Arbeit an der Authentifizierung beenden, jetzt ein User Insights Socket. Aber zuerst wollen wir ein großes Problem lösen. Wie du hier siehst, bin ich eingeloggt und auf der Board-Seite. Aber was passiert, wenn ich mich abmelde? Also möchte ich einfach in die Anwendung springen und unser Token entfernen und die Seite neu laden. Ich bin jetzt direkt auf der Homepage. Das ist völlig gültig. Aber dann möchte ich mich irgendwann wieder authentifizieren. Ich klicke hier auf login und füge dann hier f2 auf gmail.com ein. Und unser Passwort, ich treffe hier das gleiche Mittel. Und wie Sie sehen können, haben wir keinen Fehler, aber nach dem gleichen Sprung in den Erstgeborenen und wir bekommen einen Fehler, wird die Socketverbindung nicht hergestellt, warum es passiert. Tatsächlich haben wir unsere Initialisierungs-Socket-Verbindung in unserer Quell-App, App-Komponente ts, diesem Code. Nach Page Lord holen wir den aktuellen Benutzer ab und richten hier die Socketverbindung ein, aber am Anfang sind wir nicht eingesperrt . Deshalb sind wir hierher gekommen und haben jetzt unseren aktuellen Benutzer eingestellt, dann haben wir uns erfolgreich angemeldet. Und nur um Sie daran zu erinnern, dass dies passiert, wo sich unsere Komponenten anmelden. Hier ist unser onsubmit hier, wo wir den Login abonnieren und wir sitzen hier und reden und aktuellen Benutzer, das ist völlig in Ordnung, aber wir haben unseren Socket nicht aktualisiert. Damit unsere Socket-Layer-Verbindung nach der Registrierung oder nach dem Login nicht existiert Registrierung oder nach dem Login und nicht live ist, wenn wir die Seite neu laden, wird diese Socket-Verbindung hergestellt. Auch dies ist offensichtlich nicht korrekt und wir müssen diese Verbindung nach dem Login oder nach der Registrierung herstellen. Und das ist extrem einfach. Was wir hier tun müssen, können wir einfach in unseren Konstruktor eine neue Eigenschaft injizieren, und es wird unser Socket-Service sein , der unser Socket-Service ist. Jetzt können wir diese Methode verwenden. So können wir zum Beispiel nach einem bestimmten Token diese Punkte Socket Service Dot schreiben. Und hier haben wir eine SetTab-Socket-Verbindung , damit sie Zugriff auf einen aktuellen Benutzer haben und wir werfen sie einfach in unsere Setup-Socket-Verbindung. Und genau das müssen wir in unserer Registrierung tun. Also hier injizieren wir zunächst unseren Socket-Service. private Socket-Service ist also ein Socket-Service. Und jetzt danach können wir diese Methode für unseren Erfolg einsetzen. Also nach dem Setzen des Tokens ist es dieser Dots-Socket-Dienst, Dot-Setup-Socket-Verbindung mit dem aktuellen Benutzer In diesem Fall funktioniert es ordnungsgemäß. Ich möchte wieder reden, gesprungen oder logge mich ein und versuche jetzt, mich anzumelden. Also hier ist voll auf gmail.com und unser Passwort, ich bin hittin sagen gemein, und dann springe in den ersten Teil. Und wir haben derzeit keinen Fehler, da wir unsere Socketverbindung direkt nach dem Einrasten erfolgreich eingerichtet haben. Aber wir machen nichts mit unserer Authentifizierung innerhalb von Socket IO, und genau das wollen wir tun. Was passiert also innerhalb unserer Setup-Socket-Verbindung? Hier werden wir in unser aktuelles Benutzer-Token geworfen. Das ist völlig in Ordnung. Von vorne und von der Seite haben wir alles getan , was wir brauchen. Aber jetzt müssen wir in einen Server springen und ihn entsprechend analysieren. Dafür muss der Boom innerhalb unserer Serverstufen springen. Und hier ist deine eigene Verbindung. Und eigentlich vor unserer eigenen Verbindung, schreibe hier weiter, dot use. Hier haben wir unsere Funktion und es wird unsere Middleware sein. Und danach haben wir unsere eigene Verbindung, was bedeutet, dass sie genau dieselbe ist, wie unsere Middleware hier unsere Anfrage authentifiziert und weiß , dass wir eingesperrt sind, weil unsere Socket-Verbindung ist nur für eingeloggte Benutzer verfügbar. Hier schreiben wir IOUs und innerhalb müssen wir die Funktion bereitstellen. Und hier wird es eine asynchrone Funktion sein, nur weil wir unseren CurrentUser aus der Datenbank holen wollen . Und hier bekommen wir zuerst unseren Socket, der Socket ist , und wir bekommen, und die nächste Funktion, weil es eine synchrone Funktion ist , die wir hier schreiben wollen , try and catch. Also zuerst müssen wir direkt versuchen und wo, Küche und Irrtum und was wir innerhalb des Fangs passieren werden. Wir wollen einfach als nächstes hier schreiben und Einblicke in eine neue Ära einleiten, zum Beispiel mit unserem Authentifizierungsfehler. Und hier ist eine super wichtige Sache , an die Sie sich erinnern müssen. Wir haben keine Fehler im Socket. Sie sind überhaupt nicht da. Wir propagieren keine Fehler an den Client zurück, was bedeutet, dass wir, wenn wir beispielsweise im Backend einen Fehler erhalten , einfach eine Nachricht an den bestimmten Kunden senden möchten . Wir können eine Verengung senden, die wir gerade in ein Objekt werfen möglicherweise eine Fehlermeldung mit Fehlercode oder was auch immer Sie bevorzugen. Und es ist wichtig, sich daran zu erinnern. Socket Layer funktioniert also nicht genau auf die gleiche Weise, wie sollten es Fehler sein? Und jetzt ist das erste , was wir in unserem Versuch tun möchten , unser Gespräch von der Anfrage aus zu bekommen. Und hier können wir Socket Dot, Handshake, Dot, House, Dot Token schreiben . Und es wird genau das sein , was wir hinter uns haben. Und tatsächlich bekommen wir hier den Token, und sie wollen das nicht, denn eigentlich möchte ich hier eine Zeichenfolge bekommen. Deshalb kann ich hier runde Klammern schreiben und einfach S strain schreiben. Und wenn wir dieses Token nicht bekommen, dann möchte ich hier eine leere Zeichenfolge verwenden. Warum mache ich das? Denn hier wollen wir Jason Verify verwenden, um unser Token zu verifizieren. Und in diesem Fall wollen wir nicht, dass es undefiniert ist. Es. Wir können es überprüfen, wenn es sich um eine Zeichenfolge handelt. Das ist so hier. Wir können jetzt versuchen zu analysieren, indem wir JSON-Web-Token verwenden. Hier oben können wir also GPS aus unserem JSON Web Token-Paket importieren . Jetzt können wir zu unserem Code hier zurückkehren und ihn verwenden. Also hier werden wir JWT Punkt haben, und hier haben wir es überprüft. Und jetzt müssen wir im Inneren zuallererst unser Ziel erreichen. Aber nur um Sie daran zu erinnern, innerhalb eines Tokens wir innerhalb eines Tokens Bearer-Space und dann unser Token haben, hier möchte ich es nach Leerzeichen aufteilen und das zweite Argument übernehmen. Und danach müssen wir hier ein Geheimnis verraten. Und nur um dich daran zu erinnern, was das Geheimnis ist, das es aus unserer Konfiguration kommt. Und das verwenden wir, um unser JSON-Token zu analysieren. Und das bekommen wir zurück. Wir bekommen hier eine Schnur oder ein TVT-PE-Los. Aber hier wollen wir wirklich sagen, was wir zurückbekommen. Hier. Wir bekommen wie immer unser Objekt, wir sagen D, welches eine Zeichenfolge ist. Und zweitens bekommen wir eine E-Mail, die ebenfalls eine Zeichenfolge ist. In diesem Fall erhalten wir hier korrekte Daten und können jetzt einen Benutzer abrufen, genau wie wir es in unserer Auth-Middleware getan haben. Und dafür müssen wir hier oben einen Benutzer eingeben. Deshalb verwenden wir jetzt ein Benutzermodell, genau wie zuvor. Also verwenden wir einfach Slash-Modelle Slash-Benutzer. Und jetzt können wir hier eine Anfrage stellen. Also hier wollen wir unseren Benutzer zurückholen, und hier möchten wir eine Anfrage an die Datenbank mit dem Benutzer dot stellen . Und hier ist unser guter Tschüss. Hier können wir nach ID suchen, da wir NAD Insight Data Dot ID haben . Und wenn wir unser brauchbares nicht haben, wollen wir einen Fehler werfen. Wenn wir also keinen Benutzer gefunden haben, bedeutet das, dass wir hier nicht eingesperrt sind. Wir führen einfach return next aus und wir werden in einen Authentifizierungsfehler der neuen Ära geworfen, genau wie wir es in unserem Catch getan haben. Und danach wollen wir diesen Benutzer in unserem Socket aufschreiben . Eigentlich ist Socket unsere Instanz, und wir können in die zusätzlichen Informationen schreiben , wie wir es zuvor mit Anfrage getan haben. In diesem Fall können wir später in jedem einzelnen Controller auf diesen aktuellen Benutzer zugreifen. Dies ist der Weg hier, socket dot user entspricht user , den wir gefunden haben. Und wie Sie hier sehen können, erhalten wir direkt eine Fehlereigenschaft Benutzer existiert nicht auf dem Typ Socket und wir müssen genau das Gleiche tun , was wir mit der SAML-Anfrage gemacht haben. Nur um Sie daran zu erinnern, haben wir eine ausdrückliche Anfrage erstellt, in wir unsere Anfrage erweitert haben , um den Benutzer einzubeziehen Und jetzt wollen wir genau das Gleiche machen , aber mit unserer Steckdose. Das ist so hier. Lassen Sie uns Socket-Punkt-Schnittstelle dot ds erstellen. Und hier drinnen wollen wir eine neue Schnittstelle erstellen, Socket heißt. Und hier wollen wir extends von Socket, Socket verwenden. Eigentlich habe ich hier einen ziemlich seltsamen Namen , weil das keine gültige Eingabe aus dem Socket ist. Das ist so hier. Ich möchte Socket als Socket oder deinen Socket importieren. Und ich mache das von Socket aus oder nur weil wir nicht genau den gleichen Namen haben können. Also hier Gabun, um unseren Socket zu exportieren und hier waren wichtige Sockets, das ist ungültig. Hier wollen wir unseren Eingang von Socket IO umbenennen und auf diese Weise von unserem Socket Socket Socket erweitern. Und wir möchten hier unseren Benutzer hinzufügen. Und es wird nicht immer so gemacht , hier gibt es ein Fragezeichen, und dies ist ein Benutzerdokument , das wir auch hier oben von unserer Benutzeroberfläche importieren müssen , Unsere Socket-Schnittstellen dort. Jetzt können wir wieder in unseren Server springen und ihn anstelle des einfachen verwenden. Also nur um Sie daran zu erinnern, hier haben wir eine Eingangsbuchse von Socket IO. Das ist nicht mehr gültig. Hier Woburn um unseren Socket zu invertieren, und hier sind unsere Typen Slash Socket. Prüfen wir, ob es funktioniert. Ich scrolle hier nach unten und wir haben hier keinen Fehler mehr. Der Socket-Benutzer ist vollständig gültig und es ist entweder ein Benutzerdokument oder es ist nicht definiert. Prüfen wir nun, ob unser Code funktioniert. Also springe ich hier in die Konsole und wir haben keine Fehler, also funktioniert es. Was ich jetzt tun möchte, ich möchte in unsere Controller-Boards springen. Hier drin machen wir Join-Board. Also hier anstelle von Data Board AT kann ich hier einen Benutzer von Mama, einem Socket, anmelden. Und tatsächlich ist der Socket-Punkt-Benutzer hier offensichtlich ungültig, da wir hier keine korrekte Schnittstelle verwendet haben. Das ist y hier oben. Wir müssen keinen Socket von Socket IO verwenden, aber wir müssen unsere Socket-Schnittstelle importieren, die wir gerade aus unserer Slash-Socket-Schnittstelle erstellt haben. Hier haben wir keinen Fehler. Lass uns in die Konsole springen und prüfen, ob sie funktioniert. Und dafür müssen wir diese Seite einfach neu laden und wir haben keinen Fehler. Schauen wir uns jetzt die Konsole an. Sie können sehen, dass es hier keine Nachricht gibt, was bedeutet, dass wir etwas vergessen haben. Und was wir vergessen haben, ist in der sayo use to write next, was eigentlich bedeutet, dass nach dieser Zeile unser Code nirgendwohin kommt. Das ist y hier, muss aber als nächstes schreiben, und in diesem Fall muss es funktionieren. Lass uns nochmal nachsehen. Hier lade ich die Seite neu. Wir springen in unser Backend und wie Sie sehen können, finden hier unsere Informationen. Also Socket Layer beitreten und wir bekommen hier unseren Benutzer, und hier bekommen wir zwei Konsolenprotokolle, denn jedes Mal, wenn Sie die Seite aktualisieren, bekommen wir diesen Socket IO zum Beitritt, weil dies Missbräuche passieren. Wir überprüfen unseren Benutzer, wir holen ihn aus der Datenbank. Jetzt ist es für uns in unserem Controller verfügbar. Mit diesem Code haben wir unseren Benutzer erfolgreich von der Anfrage erhalten. Und jetzt haben wir in jeder einzelnen Aktion innerhalb des Controllers über eine Schaltung, innerhalb des Controllers über eine Schaltung, ein Garn, diesen Benutzer schnell zur Verfügung. 31. Spalten erhalten: In diesem Video beginnen wir mit der Implementierung unserer Kolumnen. Und ich denke, es ist eine nette Aufgabe , dass man versucht, sie selbst umzusetzen. Was wollen wir also umsetzen? Ein Top? Wir haben unser Board und wir sind bereits über unseren Kunden zitiert und haben es im Backend und beim Kunden implementiert . Jetzt müssen wir Spalten implementieren. Warum brauchen wir Säulen? Dies befindet sich wirklich in einem Board, in dem wir Aufgaben speichern und unsere Benutzer Spalten innerhalb des Boards erstellen können, was bedeutet, dass die Spalte den Benutzern gehören muss. Wir müssen also 3D verwenden, aber auch Board AT, da unsere Spalte ohne Board nicht existieren kann und das ist y. Hier sind drei Schwierigkeitsgrade für Sie. Zunächst einmal, wenn Sie das schwierigste Level wollen, pausieren Sie das Video jetzt und implementieren Sie auf dem Backend-Festival ein Modell für die Kolumne Geben Sie dann für die Spalte ein und dann eine get-Methode, um eine Liste der die Spalten in unserem Board wenn du es auf der zweiten Ebene ausprobieren möchtest. Unter meiner Anleitung finden Sie hier einige Tipps, wie das Set innerhalb unserer Servicetypen genau wie bei Board erstellt werden muss . Wir müssen hier eine Spalte erstellen und wir benötigen hier eine Schnittstelle für die Spalte und auch eine Schnittstelle für das Spaltendokument. Es wird also unserem Board sehr ähnlich sein. Danach möchten wir in unserem Server eine neue Route erstellen. Und hier werden wir apt-get API-Boards haben, Board AT genau wie hier, Schrägstrich-Spalten. Und es wird eine GET-Anfrage sein, um alle Spalten dieses bestimmten Ports abzurufen. Und wir brauchen diese Menge wirklich innerhalb unserer Route. In anderen Fällen wissen wir nicht, für welches Board wir unsere Kolumnen erhalten müssen. Dazu müssen wir in Ihrem Controller implementieren , der columns-Controller ist, und wir müssen innerhalb der Methode get columns implementieren , genau wie wir es hier im Inneren haben. Langweile dich. Und sie haben es getan, ist, dass wir alle unsere Spalten bis zu diesem Zeitpunkt AD aus der Datenbank holen wollen . Wenn du es also selbst ausprobieren möchtest, pausiere das Video jetzt einfach. Und jetzt die einfachste Variante, lass es uns gemeinsam umsetzen. Und wir fangen hier an. Zuallererst von unseren Typen. Hier wollen wir einen neuen Typ erstellen , der Column Dot Interface ab.js sein wird. Und eigentlich möchte ich unser Board komplett kopieren und einfügen , weil es super ähnlich sein wird. Also hier haben wir unsere Schnittstelle und Datenspalte. Und was brauchen wir in unserer Kolumne? Zunächst benötigen wir einen Namen, was bedeutet, dass der Titel vollständig gültig ist, auch hier erstellt und aktualisiert wird. Und wir haben hier UserID , weil es das Set ist. Möglicherweise benötigen wir Informationen, wer diese spezielle Spalte erstellt hat. Und danach möchten wir einen Hinweis auf unseren Vorstand haben. Hier haben wir ein Board AT. Und es ist die gleiche Objekt-ID für Schematypen, genau wie wir es hier oben für unseren Benutzer haben. Und jetzt wollen wir hier anstelle unseres Board-Dokuments unser Spaltendokument erstellen und wir werden hier erweitert Dokument und unsere Spaltenschnittstelle, die wir gerade erstellt haben. Und jetzt ist es an der Zeit , unser Modell zu erstellen. Also hier haben wir Bohr-Modell, jetzt brauchen wir ein Säulenmodell. Also hier haben wir ein Board Tränen. Jetzt müssen wir hier die Spalte Ts erstellen. Und eigentlich werde ich alles von unserem Board kopieren und einfügen , weil es super ähnlich ist. Was wir hier haben, wir erstellen hier ein Spaltenschema, und hier verwenden wir das NADH-Board-Dokument, aber stattdessen das Spaltendokument, das wir gerade hier erstellt haben, Board-Dokument oben, das wir entfernen können. Hier wissen wir, dass wir unseren Titel haben, wir verwenden 3D, es ist erforderlich. Und die letzte hier ist unsere Board-ID, die eine Typobjekt-ID ist, und sie ist auch erforderlich, und es ist unser Modell des Typspaltendokuments und der Name ist Spalte. Und hier haben wir unser Spaltenschema. Wie Sie sehen können, ist es unserem Board sehr ähnlich. Und tatsächlich werden viele Modelle , die Sie in Ihren zukünftigen Anwendungen erstellen werden , wirklich so aussehen. Also haben wir erfolgreich unseren Typ und unser Modell entwickelt. Jetzt müssen wir innerhalb unserer Service-Tiers generieren und nutzen . Und hier möchte ich diese Zeile mit einer Pi-Board-ID kopieren und einfügen . Und hier haben wir ein Get auf genau diese Route Schrägstrichspalten, weil wir, wie gesagt, unsere Spalten für diesen speziellen Punkt bekommen wollen. Und hier müssen wir unsere Middleware verwenden da diese Anfrage nur für eingeloggte Benutzer gilt. Und hier müssen wir nicht den Controller unseres Boards verwenden , der hier einen neuen Controller haben möchte, columns controller, und hier können wir es zum Beispiel get columns nennen , aber wir haben keinen columns controller tall. Also hier möchte ich den Controller des Paste Boards hier oben kopieren und ihn einfach zwei Spalten nennen controller Von Slash-Controllern Slash-Spalten. Und unser letzter Schritt besteht darin einen neuen Controller zu erstellen , der als Spalten bezeichnet wird. Und das ist der Controller, um alle unsere Aktionen für die Spalten zu verwalten . Also hier erstellen wir unsere Spalten dot ts. Und hier möchte ich nur eine Methode von unseren Boards kopieren und einfügen , weil sie super ähnlich ist und es gute Boards sind. Springen wir also zurück in Treppe unserer Säulen und fügen diese Methode hier ein. Zuallererst ist es nicht langweilig, sondern bekommt Säulen. Und wir brauchen hier eine ausdrückliche Anforderungsschnittstelle, weil wir nach dem aktuellen Benutzer suchen wollen. Und hier brauchen wir unsere nächste Funktion. Und auch wir müssen hier auf die Antwort von Express eingehen. Und hier suchen wir wie immer nach CurrentUser. Wir werfen für 01, wenn es nicht da ist. Aber jetzt müssen wir hier nicht gelangweiltes Modell verwenden, sondern das Modell spalten. Lassen Sie uns hier das Modell der obersten Spalte eingeben , aus dem wir gerade erstellt haben. Und hier schreiben wir Slash-Modelle Slash-Spalte. Und jetzt warten wir hier darauf, eine Anfrage für die Suche nach einem Spaltenmodell zu stellen . Aber anstatt unsere Spalten zu finden, erhalten wir hier ein Array nach Benutzer-ID. Wir wollen sie von unserem Vorstand AD finden. In diesem Fall erhalten wir unglückliche Spalten für dieses spezielle Board. Und wir erhalten diese Informationen von request dot, params dot, und hier haben wir die Board-ID. Also zurück bekommen wir ein Array unserer Spalten und wir wollen dem Kunden einfach mit diesem Array antworten. Und eigentlich sind wir fertig. Prüfen wir, ob es funktioniert. Ich springe ins Backend. Es liegen keine Fehler vor. Jetzt möchte ich eine Anfrage stellen, und hier habe ich unsere API, aber anstelle von Slash-API-Slash-Boards möchte ich hier Slash und dann NAD haben. diesem Grund möchte ich aus unserer Anwendung das d unseres Boards kopieren, möchte ich aus unserer Anwendung das d unseres Boards kopieren um es hier in den Postboten einzufügen. Wir stellen eine GET-Anfrage und klicken auf Senden. Wie Sie sehen können, wo ich eine Nachricht bekomme wo ich nicht autorisiert bin, was bedeutet, dass ich mich zunächst einloggen muss. Das ist mein Benutzer, ich melde mich an und hier erhalte ich ein Token. Lass uns dieses Stalking kopieren und es noch einmal versuchen. Hier ist eine GET-Anfrage für einen matschigen, unbegründeten Punkt. Hier ist AD und sie haben hier Schrägstrichspalten verpasst. Dies ist eine Anfrage zum Abrufen, und hier ist unser Header. Das ist Bier. Und dann werde ich mein Token setzen, ich drücke jetzt senden und wir bekommen unsere Antwort, die ein leeres Array ist. Und eigentlich ist es völlig richtig, weil wir keine Spalten in unserer Datenbank erstellt haben. Aber um es sicher und sauber zu machen, erstellen wir sie von der Konsole aus, damit wir überprüfen können, ob es wirklich für Behinderte funktioniert . Springen Sie in die Konsole und versuchen Sie Docker Exec minus 18 MongoDB, Mongo , wie wir es zuvor für unseren Vorstand getan haben. Jetzt müssen wir hier unsere L Trello-Datenbank verwenden. Also nützlicher Trailer und jetzt möchte ich einen Datensatz in unsere Kolumnensammlung einfügen. Deshalb können wir hier db dot columns, dot insert schreiben, und hier drinnen wollen wir zuerst auf title werfen, zum Beispiel die erste Spalte. Also hier müssen wir eine Benutzer-ID angeben, und hier müssen wir schreiben, dass das Datum ein Objekt mit einer Zeichenfolge ist mit einer Zeichenfolge ist , die wir aus der Anfrage entnehmen müssen. Und zuletzt wird hier unser Board AT sein, und es ist auch eine Objekt-ID und innerhalb der Zeichenfolge. Also langweilen wir das D. Wir wissen schon, wir können es einfach hier vom Postboten nehmen und sie werden es hier ablegen. Aber unser Benutzer AT, wir können in unserem Backend nachschauen. Wie Sie hier sehen können, habe ich immer noch dieses Konsolenprotokoll mit unserem Benutzer. Und hier ist das D meines Benutzers, mit dem ich eingesperrt bin. Hier in unserer Benutzer-ID füge ich den Hash meines Benutzers ein. wir die Eingabetaste. Und wie Sie sehen können , wo eine eingefügt wird. Jetzt können wir überprüfen, ob es richtig ist. Also db dot Spalten, Punktsuche und nur runde Klammern. Und wie Sie hier sehen können, ist unsere Antwort. Schauen wir jetzt in Postman nach, ob es funktioniert, ich klicke hier erneut auf Senden, und wir bekommen innerhalb des Arrays ein einzelnes Objekt. Hier sind unsere AD Boyd AD-Benutzer-ID und der Titel, was bedeutet, dass wir unser Spaltenmodell erfolgreich erstellt haben und die erste Anfrage, alle Spalten für diese spezifische Bindung abzurufen. 32. Erstellen einer Spalte mit Websockets: Im vorherigen Video haben wir erfolgreich eine Methode erstellt , um eine Liste unserer Spalten für das Board zu erhalten. In diesem Video konzentrieren wir uns auf den Back-End-Teil der Erstellung unserer Kolumne. Und wir werden es nicht auf die typische Weise tun , weil wir hier kein HTTP verwenden werden. Wir werden es mit Socket erstellen indem wir Spalten mit Socket erstellen müssen? Denn tatsächlich ist dies der Fall, in dem Woburn alle anderen Personen , die in unserem aktuellen Board schauen, über die Erstellung der neuen Kolumne informiert alle anderen Personen , die in unserem aktuellen Board schauen . In diesem Fall sehen alle Benutzer mit dieser einzelnen offenen Tafel dieser einzelnen offenen Tafel direkt unseren nukleierten Teil. Wie sollen wir das also machen? Und wir beginnen hier innerhalb eines Quellservers. Sie wussten tatsächlich schon, wie wir die Dinge machen. Wir haben hier deine eigene Verbindung und hier ist unsere Steckdose an. Hier müssen wir in Ihrer Steckdose nachdenken. Warum ist das so? Da wir tatsächlich auslösen werden, erstellen Sie genug Spalte auf einem der Clients, was eigentlich innerhalb oder Angular-Anwendung bedeutet. Im nächsten Video werden wir einen Frontend-Pod mit dem Formular zum Erstellen einer Spalte erstellen. Und dann werden wir ein Ereignis für unser Socket IO ausgeben. Deshalb müssen wir uns hier diesem Inmitten anschließen. Unser erster Schritt wird darin bestehen, hier eine neue Veranstaltung zu erstellen. Und eigentlich möchte ich hier drei Ereignisse erstellen, weil wir eine asynchrone Operation haben, wir beginnen mit der Erstellung einer Spalte, dann haben wir Erfolg und Misserfolg. Und sie sagten, wir können nicht wirklich Fehler von der Socket IO bekommen. diesem Grund ist es sehr sinnvoll, alle unsere Veranstaltungen als Erfolg und Misserfolg von Start zu organisieren . Und im Falle eines Board-Beitritts brauchen wir es nicht. Wir brauchen nur ein einzelnes Ereignis, da es sich im Wesentlichen nicht um eine synchrone Operation handelt nicht um eine synchrone Operation bei der wir hier keinen Erfolg haben, aber wir haben es mit create another column. So ist es hier, Nennen wir es Columns grade. Und das ist eine Zeichenfolge, und wir können sie columns colon nennen und dann diese erstellen. Sie können sehen, dass ich die gleiche Notation wie hier oben verwende , wir haben eine Entität und sie ist Plural, und dann unser Verb, was wir jetzt hier machen, können wir diese Zeile zweimal einfügen , weil wir müssen hier erstellen, Spalten schaffen Erfolg und Spalten schaffen Misserfolge. Hier auf der rechten Seite haben wir Spalten mit camelCase erfolgreich sind, und hier Spalte create failure. Unsere Veranstaltungen sind also bereit und jetzt können wir unsere Serverstufen öffnen. Und hier wollen wir noch einen Socket aufschreiben. Also hier wollen wir jetzt darauf reagieren, dass Socket-Ereignisse in ihnen nicht vorhanden sind. Und hier haben wir Spalten grade, und es gibt einen zweiten Parameter, mit dem wir einige Daten bekommen , mit denen wir nicht einmal wissen , was diese Daten sind. Jetzt wollen wir hier drinnen unser Spalten-Steuerelement verwenden und wir haben es auch erstellt, aber wir hatten keine Socket-Informationen darin. Hier wollen wir eine neue Methode erstellen , die Create column heißt. Und wir geben genau das Gleiche hinein, was wir hier im Live-Board getan haben, zum Beispiel ist es ein Coma Socket gemeinsame Daten, in diesem Fall an allen Stellen, an denen der Code und alle Parameter geschrieben werden auf die gleiche Weise. Deshalb ist es einfacher, unsere Anwendung zu verstehen. Jetzt ist es an der Zeit, diesen Abschnitt innerhalb des Controllers zu erstellen . An dieser Stelle springen wir zurück in die Spalten unserer Controller. Hier haben wir Get-Kolumnen. Und eigentlich schreiben wir hier von Grund auf unsere neue Methode. Also hier haben wir unsere Konstante und es ist create column. Und das ist eine asynchrone Funktion, in genau alle Sachen abgerufen werden, wie wir sie zuvor bekommen haben. Zuallererst ist es also ein Garn und es ist Serum. Zweitens haben wir hier unseren Socket, den Socket, und der letzte sind Daten. Die Frage ist also, welche Daten wir erhalten, um eine Spalte zu erstellen? Und wir brauchen zwei Dinge. Zuallererst und Name der Spalte. Und zweitens unsere Board-ID. Dies sind die Informationen , die wir bereits in unser Modell geschrieben haben. Deshalb haben wir hier Body D und es ist eine Zeichenfolge. Und zweitens haben wir hier den Titel. Es ist auch eine Zeichenfolge. Und nur um Sie an den Moment zu erinnern , in dem Sie unsere beiden Eingänge hier sind, Socket, sollten Sie wissen, wie man es vom Typ eingibt Socket-Schnittstelle, nicht vom Socket-IO, weil wir müssen verwendet eine Benutzereigenschaft innerhalb dieser Schnittstelle. Und jetzt drinnen haben wir try-catch, genau wie immer, weil wir hier eine asynchrone Operation machen und innerhalb des Käfigs, was wir machen wollen, haben keinen Zugriff auf next, aber wir können hören etwas, das du zum Beispiel hier schreiben möchte ich socket Datta meet und wir werden in unsere Socket-Ereignisse E und M dot geworfen, und hier ist ein Fehler, also erstellen Spalten einen Fehler. Und zweitens möchte ich hier eine Botschaft zurückgeben. Aber das Hauptproblem ist , dass diese Sarah unbekannt ist und das völlig normal ist, weil wir im Fang sind, wir können nicht wissen, was die Sarah ist. diesem Grund müssen wir, wenn wir eine Nachricht aus dem Fehler lesen müssen, etwas Ähnliches versuchen. Hier wollen wir also unsere Fehlermeldung lesen und können überprüfen, ob unser Pfeil ein Beispiel für eine Ära sein muss. In diesem Fall können wir hier die Fehlermeldung lesen. Und in einem anderen Fall, in dem wir unseren Fehler hier einfach als zweiten Parameter stringieren möchten , können wir einen Einblick in unsere Fehlermeldung geben, die eine Zeichenfolge sein wird. In diesem Fall ist dies das bestmögliche Elternteil und sagt TypeScript. Sie können mit einem unbekannten Fehler in catch arbeiten. Aber hier ist das Problem. Wir werden diese einzelne Zeile in jede einzelne Aktion schreiben , wenn wir einen Fehler erhalten, und wir wollen eine Nachricht lesen und wir werden sie in jedem einzelnen Bild innerhalb von catch verwenden . Deshalb möchte ich diesen Code verschieben, um ihr zu helfen. Und wir haben unsere Helfer noch nicht. diesem Grund Quelle von Erkenntnissen. Lassen Sie uns Helfer dot ds erstellen und diese Methode zurück. Hier kann ich eine neue Methode erstellen , die eine Fehlermeldung erhält. Und wir bekommen hier unseren Fehler und er ist unbekannt. Das ist also genau das, was wir in Catch Butt Back bekommen. Wir wollen eine Zeichenfolge bekommen. Jetzt kann ich diese Zeile vollständig kopieren und hier einfügen. Brauche hier keine ständige Nachricht. Wir können diese einzelne Zeile einfach zurückgeben. Wie Sie sehen können, sieht es so aus. Wir bekommen hier Fehler unbekannt, wo Chicken Instanz von Error und gut geschrieben entweder Fehlermeldung oder String-Ära. Und jetzt können wir hier in unserer Säulentreppe diese Methode importieren. Deshalb können wir hier destrukturieren, eine Fehlermeldung erhalten und das kommt von unseren Helfern. Und jetzt können wir hier statt dieser Zeile hier schreiben, Fehlermeldung erhalten und wurden in unserer Ära bereitgestellt. Und jetzt ist dieser Helfer super schnell nutzbar. Jetzt müssen wir unseren Code innerhalb des Stammes schreiben. Also müssen wir zuerst prüfen, ob Burlington oder nicht. Wir machen das nur für TypeScript weil sie aufgrund der IOUs und unserer Middleware, die wir zuvor erstellt haben , hier eingeschlossen waren der IOUs und unserer Middleware, die . Aber hier müssen wir überprüfen, ob put keinen Socket-Punkt-Benutzer hat. Und nur um Sie an diese Socket-Schnittstelle zu erinnern, muss unsere Schnittstelle sein und nicht von Socket Ion. Hier drinnen können wir genau das gleiche Zeug ausstoßen. Also hier ist Steckdose und Fleisch und wurden in einer Steckdose bereitgestellt. Ereignisse, die ENM-Spalten erstellen, schlagen fehl. Hier drinnen können wir einfach die Zeichenkette schreiben user ist nicht autorisiert. Was also diese Zeile macht, wir senden eine Nachricht an unseren Socket, was bedeutet, dass wir einen Kunden haben und dieser Kunde eine Nachricht sendet, bitte erstellen Sie eine Spalte. Und dann entweder hier im Käfig, hier innerhalb des CIF wird nur an einen einzigen Kunden gesendet, der uns eine Nachricht sendet , diese Nachricht zurück. Und dieser Kunde kann auf diese Nachricht hören und etwas entsprechend tun. Und nachdem wir uns getroffen haben, können wir hier einfach eine Rückkehr anrufen , mit der wir nichts tun wollen. Aber wenn wir einen Socket-Benutzer haben, können wir unsere Spalte erstellen. Also versuchen wir hier, dass wir eine neue Spalte haben und um sie zu erstellen, müssen wir ein neues Spaltenmodell verwenden. Eigentlich Spalte Modellwelt mit dem umgekehrten hier oben. Also können wir es hier benutzen. Um also eine Spalte, das Modell, zu erstellen , müssen wir zunächst einen Titel liefern , und es ist ein Datenpunkttitel. Zweitens wollen wir hier die Board-ID angeben und es ist Theta Dot Board AT. Dies sind die gesamten Informationen von unserer Veranstaltung. Und zu guter Letzt ist unsere Benutzer-ID. Es ist eine Entzündung von der Socket Dot User Dot ID. Also hier haben wir erfolgreich eine neue Spaltennummer erstellt, in der Datenbank speichern müssen. Das ist mein hier. Holen wir uns unsere gespeicherte Kolumne zurück , weil wir auch hierher kommen wollen NAD. Und wir warten auf unsere neue Kolumne, die dot save erstellt wurde. Wir warten darauf, es in der Datenbank zu speichern. Und danach wollen wir diese Informationen nicht nur an unseren Socket senden . Wir möchten alle Personen, alle unsere Kunden, die unseren Vorstand abonniert haben, benachrichtigen . Was eigentlich bedeutet, dass wir diese Nachricht senden, nicht nur Vektor-Socket, wir senden diese Nachricht an viele Leute. Und wir können diesen Code mit Socket hier so schreiben. Es ist also nicht Socket Dot zwei und k im Inneren, wir stellen Datenpunkt AD zur Verfügung. Und nur um Sie hier vor Inboards zu erinnern wo wir Join-Code mit John Boyd geschrieben haben, hier geschrieben haben, Socket Join, Daten, Port-ID. Hier. Jetzt haben wir ein Zimmer mit einem d unseres Boards. Und jetzt können wir hier einige Daten für alle Benutzer treffen , die sich in diesem Raum mit I2 befinden. Hier ist unser Data Board AT dot m meet und wurde in unseren Socket-Events ENM bereitgestellt, und in diesem Fall wird es ein Erfolg sein. Dies ist meine Kolumne, die Erfolg schafft. Hier möchten wir auch die gesamten Informationen unserer gespeicherten Spalte bereitstellen . Und eigentlich ist das genauso wie die Verwendung von HTTP, aber diese Informationen werden an alle unsere Benutzer gleichzeitig weitergegeben , wenn sie dieses spezielle Board abonniert haben . Jetzt hier ohne schwierige Client-Logik möchte ich testen, ob es überhaupt funktioniert. Das ist y hier, zum Beispiel, nach unserem i2, möchte ich eine gespeicherte Spalte für das Konsolenprotokoll schreiben , damit wir überprüfen können, ob wir hierher kommen. Jetzt danach, möchte ich in unsere Kunden Quelle, App, Board, Komponenten, Board-HTML hier rein springen unsere Kunden Quelle, App, Board, Komponenten, Board-HTML , ich möchte nur zum Testen, um eine Schaltfläche zu erstellen wurde geklickt. Also klicken wir auf den Button und hier haben wir eine Testfunktion. Wenn wir jetzt auf den Button klicken, möchte ich diese Veranstaltung kennenlernen. diese Weise haben wir hier unsere Testfunktion und im Inneren möchte ich diesen Socket-Service Punkt und Fleisch schreiben diesen Socket-Service Punkt und und wurde innerhalb unserer Veranstaltung bereitgestellt. Und in unserem Fall ist es Spalten erstellen und es gibt einen zweiten Parameter, den wir hier ein Objekt mit pour the tea bereitstellen müssen , das diese Board-ID sein wird. Und zweitens muss der Titel für diese einzelne Zeile unserem Backend mitteilen, für diese einzelne Zeile unserem Backend mitteilen, dass wir diese spezielle Spalte für diesen Teil erstellen möchten . Jetzt können wir zum Backend springen und prüfen, ob es funktioniert. Wie Sie sehen können, haben wir keine Fehler in der API. Öffnen wir nun einen Browser und laden die Seite neu. Und wir sind hier auf unserer Single-Board-Seite. Hier drin ist ein Knopf. Und eigentlich habe ich vergessen, den Text in den Button zu schreiben. Also lass uns hier testen, damit wir wenigstens einen Button sehen können und dann einmal auf den Button klicken. Jetzt springen wir rein, winkte. Und tatsächlich bekommen wir hier die Spalte „Letzte Nachricht gespeichert“, was bedeutet, dass unser Backend unsere Anfrage erhalten hat. Und das passiert in unseren Service-Stufen mit diesem Code, bei dem wir die Spaltennote abonniert haben. Und dann auf der Seite, wo Colin, unser Spalten-Controller, eine Spalte erstellt , und innerhalb dieser Funktion überprüfen wir zunächst, ob wir eingesperrt sind. Danach generieren wir eine neue Spalte mit diesen Daten , die wir von der Veranstaltung erhalten haben. Dann haben wir diese Spalte gespeichert und die Nachricht an alle unsere Benutzer , die diesen Punkt abonniert haben. Wir werden diesen Code im nächsten Video eingehend testen. Aber wie Sie hier sehen können, ist meine ständig gesperrte gespeicherte Spalte. Und genau das sehen wir hier im Konsolenprotokoll, was bedeutet, dass wir unsere Arbeit zwischen Socket auf dem Client und Socket im Backend erfolgreich implementiert Arbeit zwischen Socket auf haben. Und in Bezug auf die Erstellung unserer Kolumnen. 33. Spalten erhalten: Im vorherigen Video haben wir erfolgreich das Nomen-Backend vorbereitet ein Off unserer Kolumne erstellt. Bevor wir jedoch das Inline-Formular implementieren , um eine Spalte auf dem Client zu erstellen, müssen wir zumindest unsere Boards-Seite erstellen, da sie vorerst vollständig leer ist und auch unsere Spalten rendern. diesem Grund möchte ich als Erstes auf unserem Kunden die Schnittstelle für den Kegel erstellen, da wir sie noch nicht haben. diesem Grund müssen wir uns für Sets, Quellen und gemeinsam genutzte Typen einsetzen . Und hier müssen wir die Spaltenschnittstelle Ts erstellen. Und lassen Sie uns hier unsere neue Oberfläche ausprobieren, bei der es sich um eine Spaltenschnittstelle handelt. Und im Inneren bekommen wir zuallererst NAD, was eine Zeichenfolge ist. Zweitens bei title, was eine Zeichenfolge ist. Und zuletzt hat es erstellt, was eine Zeichenfolge ist. Und eigentlich bekommen wir auch hier einen aktualisierten Kopf , der auch eine Zeichenfolge ist. Unser nächster Schritt besteht darin, einen Service mit der Methode zu erstellen , mit der alle Spalten für dieses spezielle Board abgerufen werden. Und eigentlich haben wir hier keinen solchen Service. Wir haben nur einen Boards-Service , einen zustandslosen Dienst nur mit Methoden wie Boards bekommen, sich langweilen, Boards erstellen und so weiter. Wir müssen genau das Gleiche tun. Aber für Spalten möchte ich aus diesem Grund hier Spalten erstellen, Service Dot ts. Und wie Sie sehen können, wo in AP geteilt wird und nicht im Board. Jetzt hier zunächst injizierbar mit Biomasse-Merkmalen und zweite Schleife, um unsere Klasse zu exportieren, die unser Säulen-Service sein wird. Jetzt müssen wir Sie dem Kunden vorstellen, da wir Anfragen stellen, um eine Liste unserer Spalten zu erhalten. Das ist so hier. Zuallererst müssen wir einen Konstruktor schreiben. Und hier bekommen wir ein HTTP, das ein HTTP-Client ist. Das reicht. Nobu muss die Methode get columns erstellen, die für uns Spalten aus dem Backend liefert, und im Backend haben wir diese Methode bereits erstellt. Hier müssen wir hier zuallererst eine Board-ID besorgen. Dies ist eine eindeutige Kennung, um eine Liste von Spalten für dieses spezielle Board zu erhalten. Und zurück bekommen wir ein Array unserer Spalten, offensichtlich als Observable, weil es immer von HTTP ist, wo Observables abgerufen werden, hier beobachtbar von der Spaltenschnittstelle und vergessen Sie nicht, dass es ein Reihe. Jetzt machen wir hier drinnen genau das Gleiche wie an Bord. Wenn Sie also nicht alles erneut eingeben möchten, können Sie einfach kopieren und einfügen, um sich zu langweilen, und schon kann es losgehen. Der Code ist sehr ähnlich. Also wollen wir hier zunächst eine URL erstellen, und hier möchten wir zunächst unseren DOD-API-URL-Slash für die Umgebung zusammenführen . Hier haben wir unseren Boards Schrägstrich n. Hier wollen wir Board-ID-Schrägstrichspalten injizieren. Und danach müssen wir nur noch eine HTTP-GET-Anfrage stellen. diesem Grund möchte ich hier dieses http.get zurückgeben und wir müssen das zurückgeben, wo unser Spalten-Interface-Array bekommen. Und hier drinnen geben wir unsere URL an. Und mit diesem Code erhalten wir unsere Spalten für ein bestimmtes Board. Und jetzt ist es an der Zeit, den Service in unserer Komponente zu nutzen . Aber dafür müssen wir in unser App-Board springen , Board-Molekül. Und der Input hier innerhalb der Anbieter ist in Ihrem Dienst und es wird unser Säulen-Service sein. Jetzt können wir hier in Komponenten, Board, Board-Komponente springen und diese Daten hier abrufen. Jetzt wollen wir hier in unseren Abrufdaten unsere Spalten abrufen. Aber für diesen Insider-Konstruktor müssen wir diesen Dienst injizieren. Und es war columns service, das ist ein Columns-Service , den wir gerade erstellt haben. Jetzt können wir hier in unsere Abrufdaten springen und hier this.com Service Get Columns verwenden. Das ist genau die Methode , die wir gerade entwickelt haben. Und hier drinnen stellen wir jetzt an dieser Stelle diese Informationen bereits zur Verfügung. Aber hier wollen wir genau das Gleiche machen, aber wir wollen diese Spalten nicht direkt hier in der Komponente speichern . Dafür haben wir bereits unseren Boardservice geschaffen. Darin können wir all diese Informationen speichern. Deshalb können wir hier schreiben, abonnieren und wir bekommen unsere Kolumnen zurück. Und was wir mit Spalten machen wollen , die wir hier in Ihrer Methode benötigen, diesen Board-Service, DOD, zum Beispiel, setzt Spalten. Und drinnen werfen wir unsere Liste von Spalten. Und jetzt müssen wir nur noch diese Methode implementieren set-Spalten. Hier öffnen wir die Boards Services , unseren Boardservice. Und wir machen genau das Gleiche wie hier. Wir sagten Vorstand. Also hier sind eingestellte Spalten. Wir erhalten unser Array von Spalten, dem es sich um ein Spalten-Interface-Array handelt. Hier bekommen wir eine große Lücke und wir brauchen hier einen neuen Datenstrom. Hier kann ich unseren Boss-Stream kopieren, einfügen und ihn als Spaltenstream bezeichnen. In diesem Fall kann jeder einzelne Ort unserer Bewerbung, wenn wir dieses Board verwenden, wenn wir dieses Board verwenden, abonnieren und die Liste der Spalten abrufen , die wir jetzt haben. Und tatsächlich wird dies ein Verhaltensthema des Column-Interface-Arrays sein. Und wir müssen hier jetzt nicht angeben, da wir hier standardmäßig einfach ein leeres Array bereitstellen können. Und jetzt können wir in unserer set columns-Methode diese Punktspalten einfach dot next nennen. Und wir bieten Einblicke in Spalten, die vorab abgerufen wurden. Kehren wir nun zu unserer Komponente zurück und lesen diesen Stream. diesem Grund haben wir hier oben bereits dieses Board, Dollar, das ein Stream ist. Und jetzt müssen wir Spalten erstellen. Dollar, ein String für unsere Spalten, und es ist ein beobachtbares für Spalten-Interface-Array. Und jetzt können wir hier direkt nach diesem Punkt schreiben , diese Punktspalten. Und hier verwenden wir diesen Board Service Dot. Und hier haben wir unsere Kolumnen. Wir brauchen hier keinen Boolean Pipefilter , da dies einfach ein Array ist. Es ist entweder leer oder älter, das Feld mit unseren Spalten, die Hauptidee ist, dass wir keine Streams haben und wir sie direkt im HTML verwenden können. Aber hier möchte ich dir eine noch bessere Variante zeigen, denn eigentlich haben wir hier schon zwei Streams später. Wir werden eine weitere für Aufgaben haben, was bedeutet, dass wir drei verschiedene Datenquellen haben und wir unsere Seite rendern möchten , wenn alle Datenquellen erfüllt sind. diesem Grund können wir diesen Code ein bisschen anders umschreiben . Wir können hier diese Punktdaten mit größer schreiben. Und das ist eine spezielle Notation, die ich verwende. Dies ist eine sehr beliebte Variante, wie Sie Ihre Daten für Ihre Komponente verwalten können. der Regel haben Sie eine Seite mit vielen Datenquellen und möchten diese in einem einzigen Stream kombinieren. Und dann kannst du die ganze Seite nur ausführen , wenn du alle Streams erfüllt hast. Und wir werden den Stream mit den Daten erfüllen , wenn wir Sie in Ihre Daten aufnehmen. Hier möchte ich kombinierte neueste schreiben und wurde in einer Reihe von Streams und Festivals bereitgestellt . Hier können wir diese Zeile mit Boards Stream kopieren und einfach hier einfügen. Und danach nehmen wir diese Port-Service-Spalten und fügen sie auch hier ein. Offensichtlich müssen wir direkt hier Komma, denn das sind zwei verschiedene Streams. Die Hauptidee ist, dass wir die Streams kombinieren. Und hier wollen wir das mit pipe und map machen, weil wir das tatsächlich als Array bekommen und die wollen ein Objekt hier, das ist y. Hier innerhalb der Map können wir die Struktur direkt steuern, zuallererst, ein Brett und hier ist Ordnung wichtig. Zweitens haben wir hier Kolumnen. Danach wollen wir die Daten in einem anderen Format als Objekt zurückgeben . Und hier kehren wir zuallererst an Bord zurück und zweitens unsere Kolonnen. Also was macht dieses Ding überhaupt für uns. Also bekommen wir hier Daten, was eigentlich bedeutet, dass wir hier keine zwei Streams benötigen. Wir können jetzt hier erstellen und Stream-Daten verwenden. Und das sind die gesamten Daten für unser Bauteilboard. Jetzt sagen wir hier, dass dies ein Observable des Objekts ist. Und zuallererst haben wir hier ein Board, das eine Board-Schnittstelle ist. Und zweitens bekommen wir hier unsere Spalten, denen es sich um ein Spalten-Interface-Array handelt. Und jetzt können wir Board Dollar und Columns Dollar entfernen, wir brauchen sie nicht mehr. Der Hauptpunkt ist, dass unsere Logik darin bestand, Daten abzurufen und in diesen Daten festzulegen, dass der Wortdienst dort bleibt. Dies ist nur eine Kombination aus zwei Streams, um diese Daten für unsere Komponente abzubilden. Jetzt stellt sich die Frage, wie wir diese Daten in unserem HTML verwenden werden . Hier möchte ich alles entfernen und eigentlich auch hier den Test auf der Unterseite entfernen. Wir brauchen es überhaupt nicht. Jetzt möchte ich einen Marker für unsere Seite schreiben. Zunächst möchten wir hier die obere Leiste unserer App rendern. Es ist schon da. Danach lassen Sie uns das Board ausführen. Also hier werden wir div class board haben, und hier ist ein Trick, den wir hier in GE verwenden, aber wir liefern Insight Data Dollar, das ist unsere kombinierte neueste Synchronisation als Daten, und das ist es. Die Hauptidee ist, dass wir nicht mehr mit Streams im Inneren arbeiten. Wir arbeiten mit Daten als lokalem Eigentum. Und das wird für uns eine lokale Immobilie direkt in diesem Div schaffen . Jetzt wollen wir hier zunächst unseren Board-Header-Container erstellen. Hier ist der Div-Klasse-Board-Header-Container. Und schließen wir dieses Div. Aber wir werden das späte ausführen Insight ist ein Inline-Formular für die Aktualisierung unseres Boards. Hier schreibe ich einfach eine Inline-Formularbindung, damit wir sie nicht vergessen. Danach werden wir unser div mit den Klassenspalten rendern und innen möchte ich eine G for -Schleife für jede einzelne Spalte erstellen . Das ist hier y, Klassenspalte und dann G4. Und hier können wir eine Lead-Spalte von Datenpunktspalten schreiben. Wie Sie hier sehen können, benötigen Sie keine asynchronen Pipes, da wir unsere Dateneigenschaft auflösen und diese Daten darin erhalten, und diese Daten werden automatisch aktualisiert, wenn die Der Stream von Spalten wird ebenfalls aktualisiert. Hier schließen wir unsere Spalte und dann wollen wir unseren Div-Klassenspaltentitel rendern. Jetzt drinnen werden wir noch einen Spaß haben. Dies ist hier in Zeilenform zum Aktualisieren der Spalte. Und nach dieser Kolumne haben wir noch eine in Linienform. Also hier haben wir ein Inline-Formular zum Erstellen einer Spalte. Das ist also unser grundlegendes Markup. Eigentlich haben wir hier nicht viel gerendert, aber zumindest rendern wir hier bei Spalten, die wir aus unseren Daten erhalten. Prüfen wir, ob es funktioniert. Ich springe zur Konsole und wir erhalten eine Fehlermeldung. Epitope ist für uns nicht verfügbar, daher müssen wir es in unser Board-Modul importieren. Also hier in den Eingängen können wir einfach das obere Balkenmodul hinzufügen. Wie Sie jetzt sehen können, habe ich keine Fehler, also laden wir die Seite neu. Eigentlich ist es schon da. Wir können unsere schöne obere Bar sehen. Hier sind einige Platzhalter und das sind eigentlich schon unsere Kolumnen. Und ja, wir sind beim Titel nicht nur zum Testen im Trend, wir können es sehr schnell machen. Lass uns wieder in unser Board springen, und hier ist der Titel für unsere Kolumne. Anstatt eines Inline-Formulars zum Aktualisieren der Spalte können wir hier einfach den Spaltenpunkttitel rendern. Ich lade die Seite hier neu, wir bekommen die erste Spalte und das erste Formular. Dies sind genau diese beiden Spalten , die bereits erstellt wurden. Zuallererst in der Konsole von MongoDB. Und zweitens in der letzten Vorlesung, in der wir mit der Veranstaltung erstellt haben , unsere neue Kolumne. Und sie empfehlen Ihnen dringend, kombinierte neueste Daten zu verwenden , um Daten wie diese in all Ihren Anwendungen zu kombinieren. Dies ist äußerst effizient und skalierbar. 34. column erstellen: In früheren Videos waren wir erfolgreich Event-ID-Spalten für unser Board und jetzt können wir mit Formular für unsere Kolumne erstellen fortfahren. Und nur um Sie daran zu erinnern, dass wir im Backend bereits die gesamte Logik implementiert haben, wir im Backend bereits die gesamte Logik implementiert um eine Spalte mithilfe von socket a yarn zu erstellen, und jetzt müssen wir sie nur noch auf dem Client implementieren. Und zunächst möchte ich mit etwas HTML beginnen. Und eigentlich sind wir hier bereits vorbereitet Inline-Formular zum Erstellen von Spalten. Genau hier wollen wir unsere Inlandsfirma einsetzen und wir haben sie bereits. Wir müssen nur die richtigen Daten liefern. Hier schließen wir unser Inland-Formular anstelle der Nachricht. Und was müssen wir jetzt hier geben? Zuallererst müssen wir eine Klasse festlegen. Und nur um Sie daran zu erinnern, dass dies eine übergeordnete Klasse mit Stilen ist, die wir für unser Inline-Formular für diesen speziellen Fall hier außer Kraft setzen Unsere Klasse wird ein Spaltenformular erstellen. Danach wollen wir einen Standardtext festlegen. Das werden wir standardmäßig sehen, und es ist der Text, zumindest auch hier, zumindest auch hier, wir müssen eine Schaltfläche zum Absenden dieses Formulars rendern. Deshalb können wir hier schreiben , dass wir seine Button-Eigenschaft wollen. Und es ist wahr, dass wir danach unseren Schaltflächentext bereitstellen möchten, und dieser Text wird es zumindest sein. Also hier wollen wir unseren Standardplatzhalter ändern. diesem Grund können wir hier einen Eingabe-Platzhalter schreiben, und hier können wir den Namen der Add-Spalte schreiben. Und zu guter Letzt ist natürlich hier handle submit. Und dies ist ein Callback , bei dem wir einen Titel unserer Kolumne erhalten , die wir erstellen möchten. Also hier möchte ich eine neue Methode hinzufügen, die Create column heißt und dann Site, wo unser Titel durch Ereignis abgerufen wird. Und das Letzte , was wir tun müssen, ist, dass wir diese Grade-Spaltenfunktion in unserem Board erstellen müssen . Hier bekommen wir einen Titel als Sorte von unserem Inland Forum. Und hier ist innen nichtig und sie wollen nur hier protokollieren, Spalte erstellen und einen Titel sehen. Laden wir die Seite neu und schauen uns an, wie sie funktioniert. Und eigentlich bekommen wir hier eine Nachricht. Inline-Formular ist kein bekanntes Element unseres Moduls. Hier müssen wir wieder in unser Board-Modul springen. Und hier in den Eingaben möchten wir unser Inline-Formularmodul eingeben. Wie Sie im Browser sehen können, haben wir jetzt einen neuen Button. Zumindest können wir auf diesen Button klicken. Und wir sehen jetzt unsere Eingaben, die gestylt sind, und unsere mindestens Taste. Und wenn Sie sich fragen woher alle Stile kommen, wie er Ihnen zuvor gesagt hat, wie er Ihnen zuvor gesagt hat stylen wir alle Inline-Formularelemente mit unserem übergeordneten und dynamischen Fall hier wurde es erstellt spalten-Formular. Hier können Sie die Stile zum Erstellen von Spaltenformularen und dann zur Inline-Bearbeitung von Formularcontainern sehen . Deshalb ist unser Formular so teilbar. Und jetzt überprüfen wir, ob wir eine neue Spalte hinzufügen können. Hier tippe ich etwas, zumindest schlage ich zu. Und in der Konsole können wir unsere Kreditspalte und unseren Titel der Spalte sehen , was eigentlich bedeutet, dass wir hier ein Ereignis für unseren Socket ausgeben können , für unser Back-End, aber ich möchte es wirklich besser machen. Ich möchte unseren Input spezifizieren. diesem Grund haben wir hier in solchen geteilten Typen Board und Column, aber ich möchte einen Input erstellen. Was heißt das? Genau wie wir in unseren Eulentypen hatten, hatten wir hier eine Anmeldeanfrage und eine registrierte Anfrage, die im Wesentlichen ein Teil unserer Anfrage ist. Normalerweise möchten wir es entweder als Anfrage benennen oder vielleicht möchten Sie eine Worteingabe. diese Weise können wir hier bei gemeinsam genutzten Typen unsere Spalteneingabe erstellen oder Sie können sie auch als Spaltenanforderung bezeichnen. Nehmen wir an, dies ist die Spalteneingabeschnittstelle Ts, und dies sind die Daten, die wir für das Back-End bereitstellen müssen , um unser Ereignis zu senden. Und hier wollen wir es innerhalb einer Schnittstelle spezifizieren. In der gesamten Anwendung wird also wissen, wie wir Ihre Spalte erstellen. Das ist so hier, Nennen wir es Column Input Interface und die Hauptunterschiede, es ist keine ruhige Schnittstelle, es ist Eingabe. Deshalb ist es ein Körper. Und hier haben wir unseren Titel, der eine Zeichenfolge ist. Das müssen wir für unser Backend sorgen. Und zweitens eine Board-ID, die ebenfalls eine Zeichenfolge ist. Und jetzt können wir diese Eingabeschnittstelle in unserer Board-Komponente verwenden . Hier können wir also anstelle des Konsolenprotokolls unsere Spalteneingabe erstellen und wir wissen, dass der Typ hier ist, Spalteneingabe, und hier müssen wir jetzt alle möglichen Werte angeben. In unserem Fall ist es nur ein Titel. Und zweitens Vorstand, AD und Körper. Haben wir innerhalb dieser Punkt-Port-ID? Und wie Sie hier sehen können, haben wir einen richtigen Typ, und jetzt müssen wir ihn in unsere Socket-IO werfen. Das ist hier, diese Spalte Service Punkt erstellen Spalte. Und eigentlich haben wir hier keine create column-Methode. Deshalb müssen wir es schaffen. Ich möchte in unsere Shared Services-Kolumnen springen. Und hier haben wir gerade eine Kolumne bekommen. Hier wollen wir einen Kegel erstellen. Aber diese Methode wird mit diesem GTP nichts anfangen. Es wird unser Socket IO verwenden, und das ist völlig normal, während die späten, all diese Methoden innerhalb unserer Dienste und wir einfach unsere Dienste aufrufen. Das ist so hier, Lass uns die create column Methode machen und wir bekommen hier unsere Spalteneingabe. Das ist wirklich nett, dass hier eine Schnittstelle erstellt wurde. Hier können wir es wiederverwenden und es wird unsere Spalteneingabeschnittstelle sein und zurück werden wir void bekommen. Und nur um Sie hier mit HTTP daran zu erinnern, holen Sie sich immer ein Observable zurück. Aber in der Socket-Layer wird es so nicht funktionieren. Mit Socket haben Sie einen einzigen Datenfluss. Hier ist das Einzige, was wir tun wollen , unsere Emission auszulösen. Aber dafür müssen wir hier unseren Socket-Service injizieren, und dies ist unser Socket-Service, den wir erstellt haben, und wir können ihn jetzt innerhalb dieser Methode verwenden. Also dieser Punkt, Socket Service Punkt und treffen sich, und wir müssen hier einen Namen geben. Lassen Sie uns also zuerst überprüfen, ob wir einen solchen Namen in unseren gemeinsamen Typen haben, wir Socket-Ereignisse haben, und hier haben wir nichts. Und tatsächlich können wir diese Enumeration im Back-End öffnen , weil interne Typen aber auch Socket-Ereignisse haben. Und hier haben wir Spalte erstellen, Erfolg und Misserfolg, und es ist genau dasselbe. Deshalb werde ich es komplett kopieren und einfügen. Und jetzt können wir es hier anstelle des Ereignisnamens verwenden, wir können hier schreiben Socket-Ereignisse ENM enden hier nicht. Wir wollen die Spaltenbewertung auslösen und sie dann als Parameter speichern. Wir möchten unserer Spalte einen Input geben. Es gibt uns einen weiteren Vorteil, unseren Code mit Socket innerhalb des Dienstes zu schreiben . Wir isolieren diesen Code innerhalb eines Dienstes. diesem Grund weiß unsere Komponente nicht , dass wir hier zum Beispiel Socket-Layer verwenden Wir nennen hier einfach die Spalte Service Dot Grade Column, und wir werden in unserer Spalteneingabe angegeben. Prüfen wir, ob es hier funktioniert, wir können versuchen, eine neue Spalte zu erstellen. Ich klicke auf Hinzufügen. Und jetzt können wir in unserer winkenden Spalte die gerettete Spalte sehen. Und nachdem Sie die Seite neu geladen haben, können Sie hier sehen, dass der Kegel erstellt wurde, was im Wesentlichen bedeutet, dass er funktioniert, aber wir aktualisieren unsere Seite nicht im laufenden Betrieb. Und natürlich möchten wir diese Seite zunächst für unseren aktuellen Benutzer aktualisieren , zweitens auch für alle anderen Benutzer. Dafür müssen wir jedoch unseren Socket-Service verbessern. Warum ist das so? Denn was wir eigentlich innerhalb der Front tun müssen, müssen wir uns auf komfortable Weise für unseren Erfolg anmelden. Und nur um Sie daran zu erinnern, in unserem Backend, hier in den Controller-Spalten, wir in unserem Backend, hier in den Controller-Spalten, ein Treffen haben und tatsächlich sind dies Ihre beiden, die diese Nachricht an alle Benutzer senden , die abonniert sind zu diesem speziellen Raum. Deshalb müssen wir das tun. Wir möchten dieses spezielle Ereignis abonnieren, das die Erstellung einer Spalte erfolgreich sein wird, aber wir wollen es ineffizient machen. Und dann sagte Socket-Schicht, es ist nicht effizient. Wir wollen es auf Angular-Art machen. diesem Grund müssen wir unseren gemeinsam genutzten Service, den Socket-Service, öffnen . Und hier möchte ich nach dem Treffen eine weitere Methode erstellen und sie heißt Listen here. Zuallererst möchte ich es hineinschreiben. Und wenn Sie nicht wissen, wie man Generika verwendet, Die Hauptidee hier ist, dass wir jeden Datentyp für die Bindung innerhalb des Hörens bereitstellen können , und es wird das sein, was wir von der Socket-IO zurückbekommen. Also hier stellen wir t zur Verfügung und hier wird der Ereignisname eine Zeichenfolge sein. Und zurück möchte ich von t beobachtbar werden. Und das ist im Grunde die Idee. Diese Methode gibt uns ein Beobachtbares zurück. Es ist nicht bequem, mit Socket Layer innerhalb des Winkels zu arbeiten. Deshalb wollen wir es hier auf Observable umstellen. Zunächst einmal gut, um zu überprüfen, ob wir Socket IO haben oder nicht. Deshalb kann ich diese if-Bedingung hier kopieren, denn wenn wir keinen Socket haben und du verbunden bist, dann sollten wir nichts tun. Danach. Ich möchte ein neues Observable zurückgeben. Und hier drinnen müssen wir eine Funktion bereitstellen. Und hier haben wir nur ein einziges Argument , das ein Abonnent ist. Und jetzt können wir es drinnen trocknen. Steckdose an. Dies ist nur ein einfacher Code von Socket Ion. Hier haben wir unseren Eventnamen, was bedeutet, dass wir den Client für diesen Ereignisnamen abonnieren , den wir als Parameter übergeben haben. Hier ist unser zweiter Parameter, hier bekommen wir einige Daten und was wir tun wollen, wir wollen unseren Abonnenten als nächstes mit den Daten ausgeben. Also was macht dieser Code überhaupt? Zuallererst müssen wir dies und das hier versuchen, Sie können sehen, dass wir einen Fehler bekommen. Objekt ist möglicherweise nicht definiert. Und tatsächlich ist das ein TypeScript-Problem, denn hier kann er nicht verstehen, dass dieser Code mit Eve es undefiniert abdeckt. Was wir stattdessen tun können, können wir hier schreiben con socket entspricht dem Socket. Und danach decken wir diesen Sockel hier ab. Und dann anstelle dieser Schaltung, wo nur Socket verwendet wird und in diesem Fall wenn nicht, bekomme ich es im TypeScript-Theorem. Was ist also die Idee dieser Funktion? Wir werden es so benutzen. Also hier ist zuhören. Dann stellen wir einen Datentyp bereit, zum Beispiel einen String. Und danach hier zurückziehen und Event, zum Beispiel Spalte erstellen oder Spalte schafft Erfolg. In unserem Fall, dieser einzigen Linie, wird es uns ein Beobachtbares zurückgeben. Deshalb können wir danach schreiben, zum Beispiel abonnieren und hier, und wir werden hier unsere Daten bekommen. Sie werden gleich sehen, wie wir diese Funktion verwenden werden. Die Hauptidee ist, dass diese Funktion schnell und beobachtbar ist. Wir werden mit Socket Layer diesen speziellen Ereignisnamen abonnieren . Und wenn dieses Ereignis ausgelöst wird, werden wir einfach unser Observable aktualisieren. Dies ist eine wirklich bequeme eckige Art , Dinge mit Socket Layer zu tun. Versuchen wir nun, diese Funktion zu verwenden. Ich möchte zurückspringen und sagen , dass unsere Board-Komponente, und hier haben wir unsere initialisierten Zuhörer. Und hier ist ein wirklich netter Ort, um sich die Ereignisse anzuhören. diesem Grund möchte ich hier diese Dot-Socket-Service-Dot-Lektion schreiben . Und hier müssen wir den Typ angeben , da er obligatorisch ist. Und hier werden wir das nicht bieten. Wir bekommen unsere Kolumnen-Oberfläche zurück. Das bekommen wir nach dem Erstellen der Spalte. Und hier ist unser Veranstaltungsname und wir möchten hier abonnieren Socrative endet in einer Punkt-Spalte schafft Erfolg, weil wir auf den Erfolg warten. Und hier, danach können wir schreiben, abonnieren Sie einfach und wir bekommen hier eine Kolumne. Und hier können wir diese Spalte einfach protokollieren. Also noch einmal, was diese Linie tut, sie schafft für uns ein neues Observable und wir können es einfach als Observable verwenden. Am wichtigsten ist, innen wo rechts und Steckdose an. Also warten wir auf unsere Emission. Lassen Sie uns jetzt überprüfen, ob es hier funktioniert, ich möchte eine neue Spalte erstellen und ich schlage zumindest zu. Und Viola, wie Sie in der Konsole sehen können, bekommen wir unsere Kolumne. Und eigentlich ist das dieser Code mit dem Erfolgsereignis. Und hier bekommen wir genau unsere Spalte, die in der Datenbank gespeichert wurde , denn wie Sie sehen können, ist hier eine 80 unserer gespeicherten Spalten. Und jetzt können wir etwas auf dem Client tun, um die Schleife zu aktualisieren, ist viel ambulant unser Board, aber es ist nicht groß, wie Sie hier sehen können. Ich habe denselben Tab für denselben Benutzer geöffnet. Aber der Unterschied ist , dass der Socket hier anders ist , weil wir jedes Mal wenn wir eine neue Registerkarte öffnen, aber eine neue Verbindung mit einem anderen Socket-Ion herstellen. Deshalb werden wir versuchen, eine Liste hinzuzufügen, wenn wir hier sind. Und ich schlage gerade hier, zumindest bekommen wir hier dieses Spaltenkonsolenprotokoll. Aber eigentlich bekommen wir hier auch dieses Spaltenkonsolenprotokoll da dies zwei separate Registerkarten sind, zwei separate Benutzer, was eigentlich bedeutet, ob zwei verschiedene Clients sein werden verbunden und dieses Board öffnen, erhalten sie gleichzeitig unsere Veranstaltung zur Erstellung einer neuen Kolumne. Und das ist im Wesentlichen die Kernfunktionalität, die wir innerhalb des Socket-Ions erreichen wollen. Jetzt müssen wir eine Liste unserer Kolumnen irgendwie ändern. Und eigentlich ist das hier so. Ich möchte diesen Dotboard-Service schreiben und vorsichtig sein, nicht schlecht, es ist nicht unser staatenloser Service mit Funktionen, sondern unser Board-Service für den Kunden. Hier müssen wir eine neue Methode erstellen , die Add Column heißt. Und wir können einfach in unsere Kolumne werfen, was im Wesentlichen bedeutet, dass unsere Komponente nichts über Geschäftslogik weiß, wie man mit Spalten in unserem Board arbeitet, weiß es. Deshalb müssen wir hier in unseren Board-Service springen und können hier eine neue Funktion erstellen , die ABC-Spalte genannt wird. Und hier kommen wir auf Ihre Spalte vom Typ, Spaltenschnittstelle und zurück wir werden ungültig, weil wir uns nicht um die Rückkehr kümmern. Wir müssen lediglich unseren Stream aktualisieren. Und nur um Sie daran zu erinnern, dass wir hier oben einen Stream unserer Kolumnen haben. Und jetzt müssen wir das irgendwie aktualisieren. diesem Grund möchten wir, was wir hier schreiben können, zunächst unsere Kolumnen aktualisieren. Das ist y. Lassen Sie uns hier aktualisierte Eigenschaftsspalten erstellen. Hier müssen wir zunächst das verbreiten , was wir jetzt haben. Und das ist dieser Kolumnen-Stream. Und hier haben wir eine Funktion getValue, und sie liest nur den Wert aus unserem Stream, den wir derzeit haben. Und am Ende müssen wir in Ihre Kolumne schreiben. Das wird also unser neues aktualisiertes columns-Array sein. Wie Sie sehen können, ist der Typ korrekt. Dies ist ein Array von Spalten und Schnittstellen, und jetzt können wir es einfach mit diesen Spalten als nächstes aktualisieren. Und hier werfen wir aktualisierte Kolumnen auf der Website ein. Also erstellen wir einfach in Ihrem Array und schreiben es in unseren Stream. Prüfen wir, ob es funktioniert. Ich lade die Seite neu. Hier am Ende haben wir mindestens einen Button und tatsächlich sieht er irgendwie kaputt aus, weil er herausgezoomt ist. Jetzt erstellen wir hier eine neue Spalte. Ich klicke auf Liste bearbeiten. Und wie Sie direkt hier sehen können, sehen wir unsere neue Spalte, was bedeutet, dass dieser Code unseren Stream aktualisiert und dann unsere Komponente den Stream hier oben abonniert hat kombiniert spätestens, diese Spalten werden aktualisiert. Und dann senden wir diese Komponente automatisch erneut. Noch einmal, wie funktioniert das alles? Zuallererst bekommen wir hier unsere Firma im Inland. Und diese Firma im Inland produziert für uns nur den Titel. Danach erstellen wir dieses Objekt mit title und Boyd AD und werfen es in unseren Column-Service. Hier ist unsere Kreditspalte. Hier treffen wir unsere Veranstaltung und werfen unsere Daten ein, nachdem dieses Backend dieses Ereignis empfangen hat, erstellt für uns die Spalte und die Mittel für alle Benutzer in diesem Raum, in diesem Forum, die Nachricht dass wir unsere Kolumne erfolgreich erstellt haben. Und danach wird jeder einzelne Kunde von Anfang an mit diesem Code abonniert . Toller Erfolg. Und wenn es passiert, kommen wir hier, unsere Kreditspalte, und wir sind Doppelpunkt hier, aber Service, um eine Spalte hinzuzufügen. Und dadurch wird im Wesentlichen ein Stream mit den Spalten aktualisiert. Und unsere Komponente wird für alle unsere Kunden aufgezogen. 35. Erstellen einer grundlegenden Aufgabe: Im vorherigen Video haben wir die Erstellung unserer Säulen erfolgreich abgeschlossen. In diesem Video fangen wir an, an Aufgaben zu arbeiten. Und tatsächlich müssen wir den Back-End-Teil der Erstellung der Aufgaben und des Abrufs einer Aufgabenliste für unser Board implementieren Erstellung der Aufgaben und . Und denken Sie tatsächlich, dass es eine gute Möglichkeit für Sie ist, es selbst umzusetzen. Denn eigentlich hast du in diesem Projekt schon kleine Risse gemacht. Und jetzt bist du bereit , etwas Größeres zu tun. Und tatsächlich eine Liste von Aufgaben zu erhalten und eine Aufgabe zu erstellen , ist unseren Spalten sehr ähnlich, was bedeutet, dass Sie die gesamte Logik von dort aus verwenden können. Was müssen Sie also tun, wenn Sie es selbst umsetzen möchten? Zuallererst sprechen wir hier über winkte. Wir müssen also eine neue Schnittstelle für unsere Aufgabe erstellen, dann die Model-Controller-Methode, um diese Aufgaben für die Jungs zu erhalten , und die Methode insert steuert sie, um eine Aufgabe zu erstellen. Die Frage ist, welche Bereiche brauchen wir in unserer Aufgabe? Und eigentlich möchte ich hier nur schreiben , welche Felder wir brauchen. Zunächst einmal ist es ein Titel unserer Aufgabenbeschreibung , der nicht verpflichtend ist. Sie kann leer sein. Verwenden Sie dann 3D, damit wir wissen, wer diese Aufgaben-Spalten-ID erstellt hat. Wir wissen also, in welcher Spalte unseres Vorstands wir diese Aufgabe und die zusätzlichen AT an Bord verfolgen müssen. In diesem Fall ist es für uns einfacher, alle unsere Aufgaben anhand einer bestimmten Board-ID zu erledigen . Im Backend benötigen Sie eine Schnittstelle und ein Modell und registrieren sich dann in Ihrer API, registrieren sich dann in Ihrer API um diese Aufgaben innerhalb des Boards zu übernehmen. Und die Methode, um diese Liste von Aufgaben nach gefallenem Board zu erhalten. Außerdem müssen Sie eine neue Erstellungsmethode auch in unserem Controller erstellen. Und es wird eine Methode mit Socket Yacht sein da wir alle unsere Benutzer , die dieses spezielle Board abonniert haben, über diese neue Aufgabe informieren möchten , die dieses spezielle Board abonniert haben . Und wenn du alleine weitermachen möchtest, kannst du das Video jetzt einfach pausieren und ausprobieren. Aber wenn du einfach mitmachen willst, lass es uns zusammen machen. Und das alles wird gesagt. Es wird unseren Kolumnen sehr ähnlich sein. Deshalb werde ich viel kopieren und einfügen. Zuallererst möchte ich hier in unsere Serverquelltypen springen . Und hier haben wir unseren Spaltenschnittstellentest. Und tatsächlich können wir es vollständig kopieren, einfügen und einfach unsere Task-Interface-Ts erstellen. Hier in der Muskulatur ist es genau wie der Plan. Zunächst haben wir unseren Titel erstellt, um ihn zu aktualisieren. Wir haben immer, hier ist unsere Benutzer-ID und Board AT das ist völlig in Ordnung. Aber wir müssen auch hier eine Kolumne Dame erstellen. In diesem Fall, wenn nein, wo immer die spezifische Aufgabe beherrscht wird. Und wir brauchen auch hier eine Beschreibung, aber nicht verpflichtend ist. Deshalb habe ich hier ein Fragezeichen gesetzt. Unsere Oberfläche sieht also gut aus. Lassen Sie uns nun das Dokument ändern, das wir hier erstellen müssen aufgabendokument, das das Dokument und unsere Aufgabe, die wir erstellt haben, erweitert. Und wie Sie hier sehen können, habe ich vergessen, unsere Spalte in die Aufgabe umzubenennen. Lassen Sie uns jetzt springen und unser Modell erstellen. Hier waren Innenmodelle bereits Säule. Ich werde auch alles kopieren, einfügen und es einfach in unsere neue Datei legen, die task dot ds ist. Hier müssen wir alles ändern. Festival Hier haben wir ein anderes Spaltenschema, aber ein Aufgabenschema. Und hier kein Spaltendokument, sondern unser Aufgabendokument, das wir gerade hier oben erstellt haben, kann ich das Spaltendokument sicher entfernen. Hier haben wir unseren Titel. Sie ist erforderlich. Das ist völlig in Ordnung. Danach füge ich den Titel erneut ein und benenne ihn in description um, aber es ist optional. Hier wird required through hier nicht benötigt. Wir haben hier auch unsere Benutzer-ID, Board-ID, und hier möchte ich eine neue Spalten-ID eingeben. Und es ist sicher auch erforderlich. Und type ist die Objekt-ID. Es sieht total in Ordnung aus. Nun unten müssen wir hier unser Aufgabendokument zur Verfügung stellen. Und hier ist es eine Aufgabe, bei der es sich um ein Aufgabenschema handelt. Unser Modell ist komplett fertig. Jetzt müssen wir eine neue API in unserem Server erstellen. Das ist y. Lassen Sie uns zurück in die Stufen der Dienstquellserver springen. Hier haben wir unsere API-Aufrufe. Und tatsächlich wird unser neuer API-Aufruf diesem Code sehr ähnlich sein. Hier erhalten wir Spalten nach einer bestimmten Board-ID. Eigentlich wollen wir alle unsere Aufgaben für einen bestimmten Port erledigen. Deshalb werde ich diese Zeile kopieren, einfügen, hier einfügen und einfach umbenennen. Es werden Slushy Pie Slash Boards sein. Board ist ein dynamischer Parameter, und hier haben wir unsere Aufgaben und hier brauchen wir auch unsere Middleware. Und hier brauchen wir einen neuen Controller , der Tasks Controller sein wird, denn im Inneren wollen wir unsere Aufgaben verwalten. Und hier erhält die Methode Aufgaben, und diese Methode muss alle Aufgaben für dieses spezielle Board zurückgeben . Jetzt ist es an der Zeit, einen Controller zu erstellen. Deshalb werde ich springen und Controller sagen. Und ich möchte die gesamten Dateispalten kopieren und einfügen nur weil es einfacher zu ändern ist und es sehr ähnlich ist. Also füge ich es hier ein und benenne zwei Aufgaben um, dot ds. Hier im Inneren haben wir zwei Methoden, create column und get column. Und eigentlich können wir hier einfach get columns umbenennen , um Aufgaben zu bekommen. Und hier lassen wir alles so wie es ist, bitten um Antwort. Als nächstes ist das völlig in Ordnung. Hühnchen für den Benutzer ist hier in Ordnung. Terminieren Sie neu, alles ist großartig. Hier müssen wir kein Spaltenmodell verwenden, sondern stattdessen das Aufgabenmodell hier verwenden. Hier oben werde ich das Aufgabenmodell eingeben. Aus der Modell-Aufgabe. Jetzt können wir hier unser Spaltenmodell in ein Aufgabenmodell ändern. Hier finden wir nach Rand verschiedene Anforderungsparameter, Board-Id, und genau das brauchen wir und deshalb haben wir Körper in unserem Schema. In diesem Fall mit nur einem Arbeitsgang, der alle unsere Aufgaben für dieses spezielle Board findet. Also hier zurück bekommen wir unsere Aufgabenliste, und hier können wir sie einfach zurück an unsere API senden. Und damit ist unsere Aktion, die Liste der Aufgaben zu erhalten , vollständig vorbereitet. Jetzt ändern wir die direkt diese Create-Spalte. Und wie Sie hier sehen können, sprechen wir über Socket IO, und es wird auch super ähnlich sein. Zuallererst haben wir hier eine Methode zum Erstellen einer Aufgabe, bei der Sie Ihren Socket und Ihre Daten erhalten. Was brauchen wir also, um Insiderdaten zu bekommen? Zuallererst langweilen wir uns oder ED, weil wir alle Benutzer in diesem speziellen Board benachrichtigen müssen . Das ist völlig in Ordnung. Jetzt haben wir hier die Titelzeichenfolge, und die letzte hier ist die Spalten-ID. Und die Spalten-ID ist auch eine Zeichenfolge und Pflichten obligatorisch. Und Sie können hier sagen, dass wir darin keine Beschreibung enthalten. Ihre Gesamtsumme stimmt mit Erstellen, Nachzählen, Ändern der Beschreibung, die wir nur innerhalb von Update bereitstellen können. Deshalb ist das völlig in Ordnung. Was wir also hier drinnen machen, wollen wir zunächst einmal einen Misserfolg für unsere Aufgaben schaffen. Dafür müssen wir jedoch zuerst unsere Socket-Events aktualisieren. Deshalb werde ich in solche Quelltypen springen. Und hier haben wir unsere Socket-Events, und hier haben wir bereits Columns Grade und sie wollen alle drei Aktionen kopieren und einfügen. Hier können wir es von Spalten in tasks create umbenennen, und hier ist es tasks create, dann Tasks, großer Erfolg und Tasks create, falls unsere Socket-Events nicht fertig sind. Wir können zurück in unsere Aufgaben springen und hier Socket-Ereignisse in ihnen in Punkt-Aufgaben ändern , die blasser erstellen und sie werden hier nicht direkt unseren Catch ändern, und hier können wir nur dot tasks create Misserfolg. Jetzt aktualisieren wir hier einen inneren Teil , wir haben kein Spaltenmodell, sondern ein Aufgabenmodell, wir sind bereits eingegeben. Hier werden wir anhand der Daten betitelt. Das ist in Ordnung. Board-ID. Und hier ist der Benutzer vom Socket bereit. Das ist alles völlig in Ordnung, aber wir müssen hier auch die Alkalität aus der Datenpunktspalte angeben . Und danach speichern wir hier keine neue Spalte, sondern eine neue Aufgabe. Hier. Benennen wir es in neue Aufgabe um. Und hier können wir einfach new task dot save aufrufen und wir bekommen die gespeicherte Aufgabe zurück. Mit dieser Zeile möchten wir jetzt alle unsere Benutzer darüber informieren , dass wir eine neue Aufgabe erstellt haben. Auf diese Weise veranstalten wir dieses Ereignis und diese Aufgaben schaffen Erfolg. Und hier wollen wir die Speicheraufgabe zurückgeben. Und hier können wir dieses Konsolenprotokoll entfernen. Wir brauchen es nicht mehr und wir haben unsere Create Task-Methode vollständig erstellt. Und das Letzte , was wir tun müssen, müssen wir abonnieren, um mit der Erstellung der Aufgabe vom Kunden zu beginnen. Deshalb müssen wir wieder in unsere Schwesternschaft S springen und hier unten haben wir die Steckdose an. Eigentlich können wir Einfügen von Spalten erstellen und es einfach in unseren Socket ändern, sogar CNN-Punkt-Aufgaben erstellen. Und hier bekommen wir unsere Daten und müssen einfach unsere Spalte zum Erstellen des Aufgabencontrollers aufrufen. Und hier werden Sie keine Spalte erstellt, sondern eine Aufgabe erstellen. Und wie Sie hier sehen können, hat unser Aufgabencontrolling nicht importiert. diesem Grund möchte ich den Controller zum Einfügen von Spalten kopieren und in unsere neue Datei umbenennen, die Task-Controller ist. Von Controller-Aufgaben aus sieht es so aus, als hätten wir alles implementiert. Jetzt springen wir in die Konsole. Wie Sie sehen können, haben wir keine Fehler bei Verbindung mit MongoDB. Api hört zu. Deshalb möchte ich eigentlich nur das Board kopieren, einfügen Ich öffne Postman hier und versuche , unsere Aufgabenliste zu bekommen. Es ist also Slash-Sport als ein Einfügen dieser ID-Slash-Aufgaben und sie hier versteckt senden. Und wie Sie zurück sehen können, erhalte ich ein leeres Array, was völlig in Ordnung ist, da wir noch keine Aufgaben erstellt haben, was bedeutet, dass unser Backend vollständig vorbereitet ist. Und jetzt können wir mit der Implementierung der Kundenseite beginnen. 36. Aufgaben erledigen: Im vorherigen Video haben wir die Vorbereitung unserer Aufgabenmodelle und das Abrufen von Aufgaben im Backend erfolgreich abgeschlossen . In diesem Video müssen wir genau das Gleiche für den Kunden tun. Und ich empfehle Ihnen dringend, dies auch alleine zu tun , da Sie bereits so viel Wissen haben. Was musst du tun, wenn du es alleine machen willst? Zuallererst müssen Sie springen und die Quelle der Kunden, App geteilt. Und hier haben wir unsere Typen, wir haben hier Boyd und Column, und jetzt müssen wir eine neue Schnittstelle für unsere Aufgabe erstellen. Danach müssen wir einen neuen Dienst erstellen, um mit Aufgaben zu arbeiten, unabhängig davon, ob sie Boards oder Spalten haben. Jetzt brauchen wir einen neuen Server , der als Task-Service bezeichnet wird. Hier bekommt Boop die Aufgaben auf genau die gleiche Weise, wie wir hier Spalten für unser Board bekommen, aber es ist noch nicht alles. Sie müssen auch das Insider-Board-Molekül in solchen Diensten, Board-Service-Tests Denn hier sprechen wir über Stream für Board und Stream für Kolumnen. Und wir müssen hier zusätzlich einen Stream für unsere Aufgaben erstellen und zusätzlich eine Funktion , die den Stream aktualisiert. Und danach müssen Sie einfach Daten hier in dieser kombinierten neuesten Version abrufen . Und das ist es. Wenn du diesen Spot selbst umsetzt , bist du großartig. Aber wenn du es gemeinsam umsetzen willst, lass uns das jetzt machen. Zuallererst werde ich in solche Client-Quelle, App, geteilte Typen springen . Und hier möchte ich einen neuen Typ für unsere Task-Interface-Ts erstellen . Und wir müssen genau die gleichen Eigenschaften haben wie in unserem Backend. diesem Grund können wir hier unsere neue Oberfläche exportieren und es ist die Task-Schnittstelle, die Innenseite. Zuallererst haben wir unsere ID, die eine Zeichenfolge ist. Danach haben wir unseren Titel, der eine Zeichenfolge ist. Wir werden auch hier eine Beschreibung haben, jedoch nicht verpflichtend ist. Deshalb ist hier ein Fragezeichen. Es ist auch eine Zeichenfolge. Wir brauchen hier auch unsere Spalte sie D, die die Referenz für die spezifische Spalte ist , unsere übergeordnete. Und wir brauchen hier unsere Board-ID, und sie ist auch eine Zeichenfolge. Und eigentlich bekommen wir hier Wucher t , der auch eine Schnur ist. Unsere Task-Oberfläche ist also komplett fertig. Jetzt können wir wieder in Shared Services einsteigen und hier in Ihrem Service erstellen. Und was ich eigentlich tun möchte, möchte ich den Dienst zum Einfügen von Spalten kopieren nur weil es super ähnlich sein wird. Lassen Sie uns den Spaltendienst in Tasks, Service Ts umbenennen , und wie Sie hier sehen können , ist der MenuService-Aufgabendienst. Was wir hier machen wollen, wir wollen den Namen ändern. Also hier haben wir Aufgaben, Service wo lebenden Konstruktor wie es ist, wir müssen hier http und latest verwenden. Also guter Service. Und hier ist eine Methode, die keine Spalten abruft, sondern Aufgaben abruft. Und hier wollen wir unsere Aufgaben nach Board AT bekommen, weil wir nur einmal alle unsere Aufgaben für ein bestimmtes Board abrufen . Und hier bekommen wir Becker beobachtbar vom Task-Interface-Array. Und hier ist unsere URL. Es ist ein Schrägstrich-Board-ID-Slash-Aufgaben. Hier ist das HTTP GET nicht die Spaltenschnittstelle Operation sondern das Task-Interface-Array. Im Moment möchte ich die Kreditspalte vollständig entfernen , da wir in diesem Video keine Erstellungsaufgabe implementieren. Deshalb kann ich diese drei Eingänge oben entfernen. Wir brauchen sie vorerst nicht. Jetzt ist es an der Zeit, unseren Boardservice zu aktualisieren. diesem Grund füge ich Board Services, Board Service hinzu. Und hier müssen wir eine neue Zeichenfolge erstellen. Ich kopiere den Spaltenstream zum Einfügen hier und ändere ihn in Task Stream. Und das ist ein Verhalten, das Gegenstand des Task-Interface-Arrays ist. Und standardmäßig haben wir hier ein leeres Array, was schnell völlig in Ordnung ist. Jetzt haben wir hier eine Methode, Boards an Spalten zu senden. Wir müssen eine neue Methode erstellen , die als set tasks bezeichnet wird. Und hier ist ein Argument. Wir bekommen unsere Aufgaben und es ist ein Array, also ist es ein Task-Interface-Array. Und jetzt, hier in unserem Stream, Aufgaben mit Dollar, wollen wir unsere neuen Aufgaben so stellen, dass wir fast fertig sind. Jetzt springt Biomasse in unsere Komponente, Platine, Leiterplattenkomponente. Und hier ist unser kombiniertes neuestes. Und nur um Sie daran zu erinnern, hier in sagen wir Daten, kombinieren wir alle unsere Streams , um Daten für das Board abzurufen. Das müssen wir hier tun. Jetzt müssen wir hier diesen Board-Service hinzufügen, und hier werden Stream-Tasks verwendet. Und jetzt müssen wir innerhalb von map als drittes Argument versuchen, Aufgaben auszuführen, und wir wollen sie hier zurückgeben. In diesem Fall haben wir in unserem Datendollar nicht nur Board und Spalten, sondern auch Aufgaben. Und wenn du hier alles alleine gemacht hast, bist du wirklich großartig und du machst gute Fortschritte. Und jetzt ist das einzige, was wir hier tun müssen, wir müssen sie im HTML rendern. Öffnen wir also das HTML unserer Board-Komponenten. Und was wir hier haben, ist unsere Spalte für Schleife. Und drinnen haben wir einen Titel und sonst nichts. Und nach diesem Titel wollen wir noch einen tiefer rendern. Und hier brauchen wir. Und, und G for -Schleife für unsere Aufgaben in der Spalte. Und eigentlich können wir das nicht tun, weil wir nur diesen Stream für unsere Aufgaben innerhalb von Daten haben , aber wir haben keine Aufgaben für diese spezifische Spalte und wir müssen diese Daten irgendwie filtern. Deshalb möchte ich hier in G4 schreiben und es wird die Aufgabe sein, und hier möchte ich eine neue Funktion erstellen. Sie beispielsweise Aufgaben nach Spalte ab. Und dann müssen wir zuerst die Spalten-ID angeben und zweitens, alle unsere Aufgaben, es sind Datenpunktaufgaben. Und nur um Sie hier im Datenstrom daran zu erinnern, wo wir in unseren Board-Spalten und Aufgaben stehen. Das ist so, dass wir hier in dieser Funktion als Argument einfach Datenpunktaufgaben werfen können, oft G4, wir müssen auch hier eine Klasse, es wird Aufgabe sein. Und hier drinnen wollen wir den Aufgabentitel rendern. Und jetzt müssen wir diese Kinderaufgaben nur noch nach Spaltenfunktion erstellen . Das ist hier in der OTS-Datei. Ich werde diese Funktion hier erstellen. Zuallererst bekomme ich die Spalten-ID, die unsere Zeichenfolge ist. Und zweitens, tasks, und es ist ein Task-Interface-Array. Und hier zurück bekommen wir unser Task-Interface-Array. Warum ist das so? Denn im Wesentlichen wollen wir einfach unser Array mit allen Aufgaben erhalten und nach dieser spezifischen Spalte filtern. Das ist so, das Task-Interface-Array ist völlig in Ordnung. Und was wir drinnen tun wollen, wir wollen unsere Aufgaben filtern, die Gott waren diesem Grund erhält der Aufgabenfilter Zugriff auf jede einzelne Aufgabe. Und hier können wir überprüfen, ob der Punkt der Aufgabe Doppelpunkt unserem Spaltennamen entspricht, den wir als Argument angegeben haben, was tatsächlich bedeutet, dass wir für jede einzelne Spalte, die wir rendern, ein Colin sind, diese Funktion erhält Aufgaben nach Spalte und wir werden hier in energy for loop unsere Aufgaben rendern. Schauen wir uns den Sound an. Haben wir irgendwelche Fehler? Ja, wir haben Eigenschaftsaufgaben Spalten des Typboards nicht vorhanden sind, was im Wesentlichen bedeutet, dass wir unsere Dateneigenschaft nicht aktualisiert haben. Und wie Sie hier oben sehen können, definieren wir, dass wir in unserem Observable gerade und Columns gekauft haben. Aber hier haben wir auch unsere Aufgaben, bei denen es sich um ein Task-Interface-Array handelt. Jetzt haben wir hier keine Fehler in unserem Webserver und wir können zur Seite springen und wir sehen alle unsere Spalten, aber wir sehen keine Aufgaben darin, warum es passiert, weil wir unseren Fetch eigentlich nicht aufgerufen haben. Und tatsächlich müssen wir hier in unserem Konstruktor unseren Task-Service injizieren, den wir gerade erstellt haben. Und es ist unser Aufgabenservice, der geteilt wird. Und jetzt müssen wir in unsere Abrufdaten springen, genau wie wir es hier getan haben. Wir können unseren Columns-Dienst kopieren, einfügen und in unseren Aufgaben-Dienst umbenennen. Und hier werden keine Spalten abgerufen, sondern Aufgaben und das Innere, das es wert ist, unsere Board-ID zu werfen, die dieser Teil AD ist und zurück, wir bekommen keine Spalten, sondern Aufgaben. Und hier wollen wir diesen Board-Service nicht als gesetzte Spalten bezeichnen , sondern Aufgaben festlegen. Und drinnen werfen wir auf Aufgaben, die wir geholt haben. diesem Grund haben wir mit diesem Code unseren Stream aktualisiert und der Stream erhält neue Daten in unserem HTML. Schauen wir uns das an. Ich werde die Seite neu laden und es wird ein Fehler angezeigt. Wie Sie jetzt sehen können, sind wir auf Schrägbrettern. Und wenn ich zum ersten Teil übergehe, erhalten wir einen Fehler , den wir nicht für den Aufgabenservice bereitgestellt haben , denn eigentlich ja, wir müssen ihn in unser Board-Modul injizieren. Hier innerhalb von Anbietern müssen wir zusätzlich unseren Aufgaben-Service hinzufügen. Laden wir die Seite neu und wie Sie jetzt sehen können, haben wir keinen Fehler. Und hier im Netzwerk müssen wir eine Anfrage für unsere Aufgaben haben. Und hier ist eine Anfrage Slushy Pie Schrägstriche Slash-ID-Slash-Aufgaben. Und hier ist eine Vorschau ohne Aufgaben, was völlig in Ordnung ist. Wir haben sie noch nicht erstellt, aber natürlich möchten wir überprüfen , ob unser Code funktioniert. Deshalb möchte ich das in der Konsole machen. Ich möchte unseren Mongo öffnen, genau wie wir es zuvor getan haben. Jetzt muss ich unsere Datenbank auswählen, damit wir L-Trailer verwenden können. Und hier können wir überprüfen, was wir haben. Zum Beispiel können wir hier jetzt db dot boards schreiben , dot find. Und damit werden wir alle Boards sehen, die wir haben. Wir haben nur ein einziges Board. Und auf die gleiche Weise können wir db dot, columns, dot find und wo ich in unsere Spalten komme schreiben . Und was wir jetzt tun wollen, möchten wir in Ihre Aufgabe in eine dieser Spalten einfügen . Deshalb können wir hier db dot schreiben und wir haben Aufgaben dot, insert, und im Inneren werfen wir ein Objekt. Die erste Frage: Was brauchen wir, um Erkenntnisse zu liefern? Und dafür können wir unsere Task-Oberfläche überprüfen. Zuallererst wird die ID outer generiert, wir müssen einen Titel angeben. Also hier ist der Titel. Zum Beispiel liefert meine erste Aufgabe nach diesem Versprechen eine Beschreibung. Nehmen wir an, Beschreibung ist meine Beschreibung. Und danach müssen wir die Spalte bedürftig zur Verfügung stellen. Und eigentlich sehe ich hier oben schon Kolumnen. Hier kann ich einfach eine AD oder FirstColumn nehmen und sie werden sie hier werfen. Es wird also die Spalten-ID sein. Und hier ist diese AD. Und danach muss ich auch ein Board AD hier bereitstellen. Wir werden auch eine Board-Anzeige hier oben haben und wir können sie annehmen. Und zu guter Letzt ist es aber ein Benutzer AT und nutzt tatsächlich 3D. Ich sehe hier oben nicht, aber ich kann es aus dem Backend übernehmen. Und wie Sie hier in unserem Backend sehen können, haben wir immer noch ein Konsolenprotokoll mit E-Mail unserer Benutzer- und Objekt-ID. Deshalb werde ich einfach die Idee, wie ein Benutzer funktioniert, kopieren und hier schreiben. Also use re d ist gleich dieser Objekt-ID. Ich drücke die Eingabetaste und hier ist unser erster Rekord. Erstellen wir noch eine weitere, zum Beispiel meine zweite Aufgabe, und hier ist meine Beschreibung. Ich drücke die Eingabetaste und wir bekommen noch eine Aufgabe. Laden wir jetzt die Seite und den Browser neu. Wie Sie hier sehen können, voila, haben wir unsere beiden Aufgaben. Wie es hier funktioniert, ist unser Netzwerk und wir haben eine Anfrage mit PS-Aufgaben an unser Backend. Und hier werden alle Aufgaben nach dieser spezifischen Board-ID gefiltert. Und dann haben wir in unserem Code, in unserem Board, diesen Code, den wir geschrieben haben, um unsere Daten zu filtern. Also hier haben wir eine Funktion Aufgaben nach Spalte abrufen, in der wir alle unsere Aufgaben nach dieser spezifischen Spalte AD filtern . Hier rendern wir nur Aufgaben, die sich auf diese Spalte beziehen, was bedeutet, dass wir erfolgreich im Front-End implementiert haben, unsere Aufgaben erhalten und rendern sie in unserer Komponente. 37. Erstelle ein Aufgabenformular: In diesem Video können wir endlich Implementierer oder Inland-Formular eine neue Aufgabe erstellen. Und eigentlich haben wir schon alles vorbereitet , was wir im Backend brauchen. Wir müssen es nur auf dem Kunden implementieren. Fangen wir also mit unserem Forum an. Das ist das, was sie tun wollen. Ich möchte einsteigen, unsere Board-Komponente HTML setzen. Gibt es hier einen Unterschied, der bei der Aufgabe gerendert werden muss? Und danach wollen wir am Ende unser Inline-Formular rendern. Lassen Sie uns hier die Inline-Formularkomponente verfolgen. Und schließen wir es hier. Und jetzt innerhalb wann müssen einige Werte angegeben werden. Zuallererst ist Klasse. Dies ist unsere Musterklasse, die die gesamten Stile überschreibt und sie ist Create Task Form. Danach müssen wir auch Standardtext bereitstellen. Es wird eine Karte hinzufügen, aber auch eine Schaltfläche hier haben. Also hier muss der Button wahr sein und wir müssen einen Text bereitstellen. Hier wird der Schaltflächentext sein und es ist aktuell. Außerdem möchten wir hier unseren Eingabe-Platzhalter angeben und geben Sie einen Titel für diese aktuelle und nicht zuletzt unsere Handle-Submit-Methode ein, die wir erstellen müssen. Nennen wir es, erstellen Sie eine Aufgabe, genau wie wir es mit unserer Kolumne getan haben und die Erkenntnisse, die wir zunächst jedem Ereignis geben möchten. Dies wird der Titel der kreativen Aufgabe sein, aber wir brauchen hier auch unsere Kolumnierung, da unser Backend wissen muss, in welcher Spalte wir diese Aufgabe erstellen. Und wenn Sie fragen möchten, warum wir hier nur kolumniert sind und nicht Boyd AD. Wir haben ein 3D-Board in dieser inneren Komponente. Deshalb müssen wir das nicht tun. Lassen Sie uns nun diese Methode erstellen. Ich werde zu unserem Board springen und eigentlich müssen wir genau das Gleiche tun. Was wir gemacht haben, war Kolumne zu erstellen. Aber hier ist eine Frage. Wir haben hier eine Spalteneingabe-Schnittstelle. So sieht es aus und wir müssen jetzt unsere Task-Input-Schnittstelle erstellen. Also sind alle unsere Sachen auf die gleiche Weise geschrieben und es wird vermieden, dass wir sie senden müssen, um eine Aufgabe zu erstellen. Hier können wir es auch als Task-Input-Interface Ts bezeichnen und was wollen wir hineinschreiben? Dies ist unsere Schnittstelle, bei der es sich um eine Aufgabeneingabe-Schnittstelle handelt. Und das Innere, vor allem, muss der Boom einen Titel liefern. Es ist obligatorisch und es ist eine Zeichenfolge. zweiten Schleife geben wir hier unsere Spalten-ID an, die ebenfalls eine Zeichenfolge ist. Und zu guter Letzt ist unser gekochtes AD, und es ist auch eine Schnur. Und jetzt haben wir einen netten Input und können wieder in unser Board springen. Und jetzt möchte ich diese Erstellungsspalte kopieren und einfügen weil es genau dasselbe ist, aber für die Aufgabe. Also hier müssen wir es umbenennen, um eine Aufgabe zu erstellen. Hier erhalten wir nicht nur den Titel, sondern auch unsere Spalten-ID weil wir sie aus unserem HTML bereitgestellt haben. Und jetzt können wir hier den Namen von Spalteneingabe in Aufgabeneingabe ändern . Und unsere Schnittstelle hier wird die Task-Input-Schnittstelle sein , die wir gerade erstellt haben. Und wie Sie sehen können, wo ich hier vermisse, unsere Spalten-ID. Hier müssen wir es aus dem Argument hinzufügen. Und hier müssen wir keinen Kegelservice anrufen. Wir müssen unseren Aufgaben-Service zusammenhalten. Und nur um Sie daran zu erinnern, dass dies unser zustandsloser Dienst ist , bei dem wir unsere HTTP-Anfrage und unsere Socket-IO schreiben. Und diese Methode muss create task heißen, und wir werfen in unsere Aufgabeneingabe. Diese Methode gibt es jedoch noch nicht. Wir müssen es schaffen. diesem Grund gehen wir zurück und sagen, es handelt sich Quell-App-Shared Services, und hier ist unser Task-Service. Aber was sie tun wollen, ich möchte die Methode create column kopieren einfügen, weil das eigentlich genau dasselbe sein wird. Ich kopiere die eingefügte Erstellungsspalte und sie möchten sie hier in den Task-Service einfügen. Diese Methode wird jedoch create task genannt. Und wir bekommen als Argument unsere Aufgabeneingabe und wissen gut geschrieben, dass es sich bei diesem Typ Task-Input-Schnittstelle handelt. Hier wollen wir auch ein Socket IO aufrufen , weil es genauso funktioniert . Wir haben eine asynchrone Operation und wir haben Erfolg und Misserfolg begonnen. Also fangen wir an, eine Aufgabe zu erstellen, werden uns mit dem Treffen unseres Backends benachrichtigen. Dann erstellt Bacon eine Facettenaufgabe und benachrichtigt dann das Backend alle Personen, die unser Board abonniert haben, über neue Aufgaben. Hier müssen wir eigentlich unsere Socket-Ereignisse in ihnen aktualisieren. Ich möchte es hier auf der rechten Seite öffnen und zusätzlich das Enum innerhalb eines Servers öffnen, öffnen und zusätzlich das Enum innerhalb eines Servers öffnen da wir bereits in unseren Events geschrieben sind. Diese drei neuen Ereignisse, Aufgaben, führen zu Erfolg und Misserfolg. Und jetzt können wir sie hier einfügen, um sie auf dem Client zu verwenden. Danach können wir wieder in unseren Aufgaben-Service zurückkehren und den Namen hier ändern. Und es werden DOD-Aufgaben erstellt. Und hier gibt es einen Parameter. Wir erhalten eine Aufgabeneingabe, was bedeutet, dass wir nach dem Ausfüllen unseres Inlandformulars hier unseren Socket, Ihr Bild an unser Backend senden und unser Speck bereits bereit ist , unsere Aufgabe zu erstellen und der Fleischerfolg zurück an alle unsere Benutzer. Schauen wir uns das an. Ist es wirklich so, dass wir in unsere Server-Source-Controller springen können , und hier ist unser Task-Controller. Und wie Sie sehen können, haben wir hier die Methode create task, und hier erstellen wir eine neue Aufgabe und benachrichtigen dann mit dieser Zeile alle unsere Kunden, was eigentlich bedeutet, dass wir diese nur abonnieren müssen Veränderungen innerhalb unseres Kunden. Hier springe ich zurück in unsere Board-Komponente ts. Und nur um Sie daran zu erinnern, hier haben wir unsere initialisieren Listener und hier haben wir einen Listener für unsere Kolumne, der Erfolg schafft. Jetzt machen wir genau das Gleiche für unsere Aufgabe, ein großer Erfolg. Also hier haben wir unsere Task-Oberfläche, und hier ist der Typ DOD. Tasks schaffen Erfolg. Und was diese Task-Oberfläche auf diese Weise macht, bekommen wir zurück Task-Oberfläche, weil es generisch ist. Und jetzt haben wir angegeben oder k, Diese Lektion gibt uns unsere Task-Oberfläche zurück. Hier müssen wir eine neue Methode bei der Aufgabe innerhalb des Word-Service erstellen . Und wir stellen hier unsere Aufgabe bereit, die wir vom Backend bekommen haben. Und das Letzte , was wir tun möchten, ist diese Methode in unseren Service aufzunehmen. Öffnen wir unseren Boardservice. Und hier haben wir bei der Kolumne. Und da Sie alle den Stent gemacht haben, möchte ich ihn kopieren, einfügen und genau das Gleiche tun. Hier haben wir eine Aufgabenmethode und wir kommen hierher, wenn Sie eine Aufgabe erstellen, und es ist eine Task-Oberfläche. Hier müssen wir eine Reihe aktualisierter Aufgaben erstellen. Also hier bekommen wir diesen als keinen Stream von Spalten, sondern einen Stream von Aufgaben, dann bekommen wir Wert. Und hier am Ende wollen wir unsere neue Aufgabe schreiben. Und danach müssen wir unsere Sorte erneut aktualisieren. Hier ist der Aufgaben-Stream und hier sind aktualisierte Aufgaben. Und mit diesem Code werden wir unseren Stream erfolgreich aktualisieren und alle unsere Komponenten, die diesen Stream abonniert haben werden automatisch mit Buchstaben beendet. Prüfen wir, ob es funktioniert. Wir haben hier keine Fehler. Und jetzt möchte ich hier zwei Tabs öffnen. Und sie wollen mit beiden Kunden in dasselbe Board springen. Und wie Sie sehen können, ist hier unser Konsolenlog. Und sie wollen den Schnitt hier ausprobieren. Also hier ist unser Inline-Formular und nennen wir es, hat eine Aufgabenfunktion erstellt. Jetzt drücke ich die Eingabetaste, und wie Sie direkt hier auf dieser Registerkarte sehen können , erscheint dieses Element. Also, wie es funktioniert, eigentlich haben wir unsere Firma im Inland gefüllt. Wir schicken unser Bild an das Backend. Backend, habe es bekommen, eine neue Aufgabe erstellt und alle Leute, alle unsere Kunden, die dieses Board abonniert haben, über diese Änderung informiert alle unsere Kunden, die dieses Board abonniert haben . Und mit diesem Hören haben wir aktualisiert, dass wir unser Aufgabenspektrum abgelehnt haben und diese Komponente wurde nachgeholt. Der interessanteste Teil ist hier ein weiterer Tab und ein anderer Benutzer, dies ist ein weiterer Client mit einem anderen Socket AD. Und wie Sie hier sehen können, haben wir auch unsere Funktion „Aufgabe erstellen“, da jetzt alle unsere Kunden synchron sind. Und du könntest sagen, okay, aber dein Ziel, du brauchst nur einen einzigen Browser. Es ist nicht wirklich wichtig. Es ist nur eine andere Socket-Verbindung zu Ihrem Server. Wenn Sie nur zwei Computer haben und Ihr Projekt für die Produktion bereitgestellt wird, funktioniert es genauso. Zum Beispiel kann ich hier einfach eine neue Aufgabe erstellen. Zum Beispiel, foo, ich schlage hier auf Karte und bekomme dann genau die gleichen Informationen ohne Pedro Lot in einem anderen Tab, was eigentlich bedeutet, dass unsere Funktion Aufgaben erstellt hat komplett fertig. 38. Aktualisieren Sie den board: In diesem Video werden wir eine weitere fehlende Funktion implementieren und es ist ein Aktualisierungsformular unseres Boardnamens. Und wie Sie hier sehen können, haben wir ein Platzhalter-Inline-Formularbrett, und hier müssen wir unser Inland-Formular verwenden. Und tatsächlich ist dies unser erstes Video in dem wir gemeinsam das gesamte Feature-Backend und den Client in nur einem einzigen Video implementieren werden das gesamte Feature-Backend und . Und tatsächlich wird die gesamte Logik genau die gleiche sein , wie wir es bereits zuvor getan haben, denn wir haben eine schöne Architektur gebaut und können jetzt ganz einfach neue Funktionen erstellen. Also worum es bei diesem Feature geht, werden wir hier und dann meine Firma haben und wir bekommen daraus einen Titel. Am wichtigsten ist, dass wir zunächst unseren Titel des Boards in dieses Formular für unseren Erfolg des Updates unterschreiben müssen , aber wir möchten das GTP hier nicht verwenden. Whoop, möchte Socket IO dadurch verwenden, weil alle unsere Kunden benachrichtigt werden müssen, wenn die ER, an dieser Stelle, wir den Board-Namen geändert haben. Hier ist wie immer Socket oder dein Fleisch. Und dann müssen wir in unserem Backend dieses Ereignis verfolgen und unseren Namen aktualisieren. Und tatsächlich können wir eine Methode erstellen , um das gesamte Board zu aktualisieren, aber wir werden vorerst den Ebenentitel aktualisieren. Versuchen wir das jetzt zu tun. Dafür möchte ich in unseren Code springen und loslegen. Zuallererst war unser Server. Und für dieses Boom-Massenregister und verwenden Sie Socket-Ereignis hier in unserem Sokrative und Xenon. Und wir haben hier schon Boards, Leaf- und Port-Chain und tatsächlich wollen wir genau das gleiche wie mit Säulen. Und hier haben wir zum Beispiel Spalten erstellt, und sie wollen alle drei kopieren und einfügen. Denn eigentlich wollen wir hier zum Beispiel, nachdem Boards live sind, Boards schreiben und hier wird es Update geben. Hier können wir es direkt ändern, um Board-Updates erfolgreich zu aktualisieren und Board-Updates fehlgeschlagen. Und jetzt hier auf der rechten Seite müssen wir genau das Gleiche tun. Hier werden Boards und Updates sein. Nach dem erfolgreichen Update dieses Boards und dem Fehler beim Update der Boards. Unser Socket-Ereignis wurde also erfolgreich erstellt und jetzt müssen wir es in unserer Socket-IO registrieren. Das ist, indem wir zurück in einen Dienst springen, ja. Und hier unten haben wir unsere Steckdose an. Hier müssen wir uns registrieren und Socket Ton verwenden. Dazu können wir zum Beispiel einfach kopieren, einfügen, hier eine Aufgabe erstellen und schreiben, nicht erstellen, sondern auf Punktbretten-Updates reagieren , die wir gerade erstellt haben. Wir warten also Update der Event-Boards von unserem Kunden. Und hier wollen wir keinen Aufgaben-Controller verwenden, sondern den Controller des Boards hier keine Aufgabe erstellen, sondern das Board aktualisieren. Und tatsächlich übergeben wir drinnen oder Ihre Socket-Daten, genau wie wir es zuvor getan haben. Lassen Sie uns nun diese Update-Board-Methode für diese Zahlungen erstellen . Jump in unseren Controller-Boards. Und hier haben wir bereits diese Methode create board, aber das ist nicht das, was wir wollen, weil diese Methode mit einem Schuh-TP ist. Deshalb wollen wir eigentlich zum Beispiel so etwas wie Live-Board. diesem Grund werde ich diese Methode kopieren und einfügen , da alle Optionen ähnlich sind und wir dieses Methodenupdate Board benennen können. Und wir wissen, dass wir hier unsere IR-Steckdose und dann unsere Daten bekommen . Und die Frage ist, welche Daten wir benötigen, um ein Board zu aktualisieren sicher müssen wir beim Titel des Boards wissen , das wir bereitstellen wollten. Und zweitens die Idee des Boards, die wir aktualisieren wollen. Hier ist unser Körper völlig in Ordnung. Und eigentlich möchte ich hier keinen Titel schreiben, ich möchte Felder schreiben. Und hier werden wir die Titelzeichenfolge übergeben. Warum haben wir eine solche Notation? In diesem Fall können wir hier ganz einfach ein neues Feld hinzufügen , das wir in unserem Board aktualisieren möchten. Wenn wir zum Beispiel später eine Beschreibung haben, können wir sie einfach hierher werfen, aber im Moment haben wir nur einen Titel. Jetzt können wir hier dieses Konsolenprotokoll entfernen, wir brauchen es nicht und auch Socket Leaf. Die Frage ist also, was wir hier überhaupt schreiben werden? Zunächst müssen wir hier try-catch schreiben, nur weil wir einen Fehler bekommen können. Das ist so hier, Lass uns kreieren, versuchen und fangen. Und hier kommen wir rein, fangen einen Fehler auf. Und wenn wir einen Fehler haben, wollen wir nur Socket und Fleisch schreiben. Und hier sind unsere Socket-Events in einem Punkt. Und wir haben bereits einen Fehler beim Update unserer Boards erstellt. Und was wir Einblicke geben möchten ist unsere Fehlermeldung erhalten. Und nur um Sie daran zu erinnern, dies unser Helfer ist, der einen Pfeil verwandelt. Das ist mein Inneres. Wir können einfach unseren unbekannten Fehler angeben. Erstellen wir jetzt unseren Trie. Also Festival hier wollen wir überprüfen ob ein gültiger Benutzer, das ist y. Lassen Sie uns überprüfen, ob wir keinen Socket-Punkt-Benutzer haben, dann gehen wir weiter, um genau den gleichen Fehler auszugeben. Also hier versuchen wir Socket, die Socket-Ereignisse, ENM-Board-Aktualisierungsfehler. Und hier, anstatt eine Fehlermeldung zu erhalten, können wir einfach schreiben, dass der Benutzer nicht autorisiert ist. Außerdem sollten wir hier nicht vergessen, eine Rücksendung zu schreiben. In diesem Fall werden wir einfach aufhören, irgendetwas zu tun. Denn danach, wenn wir unsere Logik schreiben wollen, ist dies eine Aktualisierung des Boards. Und eigentlich ist es extrem einfach, aber wir müssen diese Methode synchron machen , weil wir sie in Kuwait intern verwenden wollen . Jetzt hier in dem, was ich tun möchte, möchte ich unser aktualisiertes Board zurückbekommen. Und um ein Board zu aktualisieren, müssen wir hier ein Gewicht verwenden und wir haben hier auf unser Arbeitsmodell zugegriffen . Und wir können „ Nach ID suchen“ und „Update“ verwenden. Und tatsächlich ist das eine erstaunliche Methode von Mongoose. In diesem Fall stellen wir hier nur NAT zur Verfügung und in unserem Fall ist es die Datenpunktboard-ID. Und hier ist unser Update. Und tatsächlich ist Update genau das, was wir in unserer Entität aktualisieren möchten. Hier können wir einfach die Board-Punktfelder ausprobieren und das ist ein Objekt. Und die letzte sind Optionen. Hier möchte ich Ihnen eine Option anbieten. Diese Option ist wirklich wichtig, da wir in diesem Fall unser aktualisiertes Board zurückerhalten. Wie Sie hier sehen können, habe ich auch einen Fehler gemacht. Es ist kein Board-Punktfeld, es sind Datenpunktfelder. Jetzt haben wir keine Fehler und können mit diesem Port reagieren. Und dafür können wir einfach Socket benutzen und uns treffen. Hier hat unsere Steckdose sie sogar gesehen. Und wir haben hier Erfolg. Boards aktualisieren also erfolgreich. Wir möchten als zweite Parameter ein aktualisiertes Board bereitstellen . In diesem Fall werden alle unsere Kunden nach diesem Gutschein über dieses Ereignis informiert , um alle unsere Kunden, die dieses Board abonniert haben, über unsere Änderung zu informieren. Hier können wir ir dot t2 schreiben, und hier möchten wir alle Kunden in unserem Raum benachrichtigen. Hier werden wir Daten haben, dot board Id dot und treffen uns, wie wir es zuvor geschrieben haben. Und hier drinnen können wir unsere Socket-Ereignisse in m Punkt verwenden. Und hier haben wir ein erfolgreiches Board-Update. Und es gibt einen zweiten Parameter, den wir hier schreiben wollen , den aktualisierten Port. In diesem Fall werden Oliver-Benutzer darüber informiert, dass das TO-Board aktualisiert wurde, und sie wissen, welche Felder sie ändern müssen. Unser Backend-Teil ist komplett fertig. Jetzt müssen wir einen Kundenteil implementieren. An dieser Stelle springen wir zurück in unsere Client-Quell-App. Und hier möchte ich zunächst in Shared Services, Board Service, gehen . Warum ist das so? Denn eigentlich werfen wir hier unsere Events für das Backend. Und eigentlich bevor wir hier geschrieben haben, genauso wie GTP-Katze und die wählerischen vorgeschlagen haben. Aber in unserem Fall müssen wir jetzt ein Socket-Ereignis ausgeben. diesem Grund möchten wir hier das Methodenaktualisierungsboard erstellen . Wir wollen hier für Sie sorgen. Erstens unser Board AD, dies ist eine Zeichenfolge und zweitens Felder, die wir aktualisieren möchten. Wie Sie sehen können, haben wir Parameter genau wie im Backend. Hier haben Felder den Titel, was eine Zeichenfolge ist, und zurück mit brauchen nichts zu bekommen , weil wir hier einfach Socket IO verwenden, aber um es hier zu verwenden, müssen aber in den Konstruktor injiziert werden. Hier bekommen wir unseren Socket-Service , der unser Socket-Service ist. Jetzt können wir in unserem Update-Board diesen Dot-Socket-Service, Punkt und Fleisch, nutzen. Und hier müssen wir unser Socket-Event bereitstellen. Aber hier ist das Problem. Wir haben es noch nicht bei unserem Kunden registriert. Hier haben wir keine solchen Schnüre. Hier unten möchte ich unsere Server-Socket-Ereignisse darin öffnen. Und hier möchte ich diese Poren kopieren, Erfolg und Misserfolg aktualisieren. Und jetzt wollen wir sie nur noch hier in unseren Kunden einfügen . Jetzt haben wir unserem Kunden die Saiten nicht gesagt und können sie ausgeben. Deshalb können wir hier einfach Socket-Ereignisse in m Punkt schreiben und hier haben wir ein Board-Update. Dies ist der Beginn unseres Updates aus Protest. Und geht der zweite Parameter hier weiter, um unser Board-ID-Komma, unsere Felder, bereitzustellen . Wir haben also genau den gleichen Data Lake wir in unserem Backend vorbereitet haben. Und jetzt können wir von jedem Teil unserer Anwendung aus diesen Shared Board-Service nutzen. Verwenden Sie diese Update-Board-Methode, um ein Treffen zu versenden. Jetzt ist es an der Zeit, unser Formular hinzuzufügen, das wir noch nicht erstellt haben. Deshalb springen wir zurück in unsere App. Board-Komponenten, Board, Board-Komponenten HTML. Und wie Sie hier auf der oberen Innenseite des Board-Header-Containers sehen können , haben wir dieses Platzhalter-Inline-Formularboard. Und genau hier wollen wir ein Inline-Formular schreiben, um unseren Boardtitel zu aktualisieren. Das ist so, schreiben wir unser Inline-Dash-Formular, das wir verwenden möchten, und schließen wir es hier. Zuallererst muss inside womb die Klasse bereitstellen, um ein korrektes Styling zu erhalten. Und in diesem Fall wird es hier hinzugefügt Board-Forum. Danach möchten wir auch unseren Standardtext angeben. Und hier haben wir unser Data Dot Board, Punkt Titel. Warum ist das so? Denn eigentlich, nur um Sie hier oben daran zu erinnern, haben wir unsere Daten, lokale Eigenschaftsdaten, und darin haben wir alle unsere Spalten, alle unsere Aufgaben und ein Board. diesem Grund haben wir hier direkten Zugriff auf den Datenboardtitel und möchten ihn als Standardtext rendern. Danach möchten wir auch einen Titel angeben, und das ist der Wert für unser Unternehmen. Hier werden wir auch den Data Board-Titel schreiben und guter Letzt wird das Einreichen behandelt. Dies ist unser Ereignis und wir möchten eine neue Methode erstellen, zum Beispiel Namen des Boards aktualisieren und inside dollar event ist eine Zeichenfolge zum Aktualisieren eines Boards. Erstellen wir nun diese Methode. Ich werde in die RTS-Datei springen und irgendwo unten können wir den Namen des Update-Boards hinzufügen. Und wir wissen, dass wir hier unseren Board-Namen bekommen , der eine Zeichenfolge ist. Und zurück wollen wir eine Lücke bekommen, weil wir hier einfach unseren Service nutzen wollen. Und tatsächlich haben wir hier bereits Zugriff auf unseren thes dot boards Service. Und das ist wichtig, nicht gelangweilt, sondern Boards Punkt. Und hier haben wir unser Update Board hier drinnen. Zuallererst müssen wir unsere Board-ID angeben, und das ist dieses dot board AT. Und zweitens unsere Bereiche. In unserem Fall haben wir hier nur einen Titel, das ist unser Board-Name, den wir von unserer Inland-Form erhalten haben. Also haben wir erfolgreich einen einzigen Flow erstellt. Also haben wir unser Inland von hier aus erstellt , unseren Board-Namen aktualisiert und ein Ereignis für unser Backend ausgegeben. Prüfen wir, ob dieser Teil funktioniert. Ich habe keine Fehler im Client oder im Backend. Und jetzt öffnen wir einen Browser. Wie Sie hier sehen können, haben wir jetzt ersten Teil und ich kann hier klicken, um ein Formular zu öffnen. Und hier sehen wir unser erstes Board. Sie können hier etwas schreiben und die Eingabetaste drücken. Und wie Sie sehen können, wurde es nicht aktualisiert da wir nicht auf unsere Änderungen im Backend reagiert haben. Und tatsächlich, wie Sie hier im Inneren sehen können, haben wir keine Fehler und wahrscheinlich wurde unser Titel bereits aktualisiert, aber wir haben unseren Kunden nicht benachrichtigt. Und eigentlich können wir es leicht überprüfen. Wir können die Seite einfach neu laden. Und wie Sie jetzt sehen können, erhalten wir unseren aktualisierten Titel, was bedeutet, dass die gesamte Logik bereits funktioniert und unser Backend unser Board erfolgreich aktualisiert hat. Das Hauptproblem ist jedoch, dass wir nicht alle unsere Kunden über Änderungen informiert haben. Eigentlich ja, wir haben es im Backend gemacht, aber wir haben kein Abonnement für diese Veranstaltung auf dem Client erstellt . Das ist y. Lass es uns jetzt machen. Zuallererst müssen wir also wieder in unsere Board-Komponente springen . Und nur um Sie hier oben daran zu erinnern, dass wir Abonnements für verschiedene Veranstaltungen haben. Deshalb möchte ich hier ein Abonnement kopieren , einfügen und ändern. Hier haben wir unseren Socket-Service und wir hören auf das Ereignis der Aktualisierung unseres Boards, was tatsächlich bedeutet, dass wir zurück ein neues Board bekommen. Hier haben wir eine Board-Schnittstelle und hier haben eine Board-Schnittstelle und wir das Socket-Ereignis C num dot. Und hier hören wir auf den Erfolg. Hier haben wir Boards, Updates, Erfolge. Und in unserem Jetzt abonnieren bekommen wir unser aktualisiertes Board. Was wollen wir also damit machen? Eigentlich möchte ich nur eine Methode innerhalb unseres Board-Service aufrufen und sie wird unseren Datenstrom aktualisieren. diesem Grund können wir hier Board Service, Dot Update Board und Worth Row verwenden . Und in unserem aktualisierten Board ist super erfolgreich für unsere Veranstaltung abonniert. Und wir müssen nur diese Update-Board-Funktion in unserem Board-Service erstellen . Also lasst uns in unseren Boardservice einsteigen. Und hier unten können wir es schaffen. Also hier ist der Aktualisierungspunkt, und wir wissen, dass wir hier ein aktualisiertes Board bekommen, das eigentlich eine Vollplatinenschnittstelle ist. Und hier werden wir breit , weil wir einfach unseren Stream aktualisieren wollen. Aber hier haben wir ein Problem. Standardmäßig ist unser Board jetzt, das ist so hier. Typescript wird schreien , mit dem wir nicht arbeiten können. Nun, hier möchte ich überprüfen, ob wir jetzt Inside Board haben oder nicht. Also hier möchte ich ein Board bekommen, und das ist, sind diese Boards Stream, um Wert zu bekommen. Und danach möchte ich überprüfen , ob es jetzt ist. Wenn wir also unser Board nicht haben, möchte ich einen Fehler werfen. Also hier wirf einen neuen Fehler weil wir das Board eigentlich nicht aktualisieren können , wenn wir kein Board haben. Nehmen wir an, das Board wird danach nicht initialisiert wenn wir mit einem Teil arbeiten können und wir eigentlich nur unseren Stream aktualisieren wollen. Also dieses Board mit Dollar Punkt als nächstes, und hier möchte ich das gesamte Board, das wir haben, mit dem Titel zusammenführen , weil ich nur beim Titel aktualisieren möchte. Titel ist also unser aktualisierter Board-Punkt-Titel. Und du könntest sagen, okay, wir könnten einfach das ganze Objekt nehmen. Ja, wir sind gut, aber ich möchte auf der sicheren Seite bleiben und einfach eine Funktion implementieren , die wir lösen müssen. Dieser Code sollte den Stream erfolgreich aktualisieren und unsere Komponente, da sie den Stream abonniert hat, wird benachrichtigt und beendet. Prüfen wir, ob es funktioniert. Wir haben hier keine Fehler. Lass uns die Seite neu laden und hier haben wir das erste Board. Ändern wir einfach Ihren Titel und drücken die Eingabetaste. Und wie Sie sehen können, sind hier direkt meine Änderungen. Jetzt duplizieren wir diese Registerkarte und versuchen es erneut. Also hier auf der zweiten Registerkarte werde ich einfach versuchen zu tunen und die Eingabetaste zu drücken. Und wie Sie hier auf der ersten Registerkarte sehen können, wurde es auch aktualisiert, was bedeutet, dass wir eine Funktion zur Aktualisierung eines Boardtitels von Anfang bis Ende erfolgreich implementiert haben. 39. Löschen von Board: In diesem Video werden wir das Löschen des Punktes implementieren. Und tatsächlich wird diese Funktion unserer vorherigen Funktion sehr ähnlich sein , mit dem Update genug unser Board, das ist y. Lassen Sie uns es wirklich schnell wie immer implementieren. Legen Sie einen an, um mit unserem Server zu beginnen. Das ist y. Lass uns in die Serverquelle springen. Und hier interessieren uns unsere Socket-Events. Und genau wie bei diesem Update benötigen wir drei neue Ereignisse zum Löschen. Das ist hier, lass uns drei neue Events erstellen. Es ist Port Delete Boards zu seinem Erfolg und Misserfolg. Und lass uns auf der rechten Seite ändern, unsere String-2-Boards löschen. Dann löschen Boards Erfolg und Boards löschen Fehler. Abonnieren wir jetzt unser Event für diesen Bonussprung auf unserem Server. Und hier können wir unseren Board-Erfolg kopieren, einfügen und in unsere Boards ändern. Löschen. Hier wollen wir eine neue Methode verwenden, nicht Board aktualisieren, sondern Port löschen. Springen wir nun zu unserem Controller und erstellen diese Methode in der Steuerung unseres Boards. Und eigentlich möchte ich dafür unsere Update-Board-Methode vollständig kopieren und einfügen unsere Update-Board-Methode da eine Löschung super ähnlich ist. Lassen Sie uns zunächst den Namen ändern. Es ist delete board und es ist eine asynchrone Methode. In unseren Daten brauchen wir nur noch kein D unseres Boards. Hier habe ich das D gekauft, das reicht hier, aber ich muss nichts anderes angeben weil wir einfach unser Board von d löschen. Und für das Back-End sind es genug Informationen. Jetzt haben wir hier drinnen wie immer try-catch und wir suchen nach unserem Socket-Benutzer. Aber hier, im Fehlerfall, wollen wir einen weiteren Fehler auslösen und es wird ein Fehler beim Löschen der Boards sein. Hier. Lass uns auch unseren Käfig wechseln. Es wird auch ein Fehler beim Löschen von DOD-Boards sein. Und jetzt müssen wir unser logisches Flüstermodell ändern, denn hier haben wir ein Update gemacht. Jetzt haben wir Azure move und eigentlich wollen wir nichts zurückbekommen, aber wir wollen diese Bindung einfach durch d aufheben. Und dafür können wir verschiedene Methoden verwenden. Zum Beispiel können wir find one und delete verwenden. Das ist völlig in Ordnung. Das ist genau so, wie wir es innerhalb des Updates gemacht haben Aber eigentlich kann man auch direkt ohne Zucker verwenden , einen löschen. Und dies ist eine Methode, die Sie nur innerhalb von delete one kennen Wir müssen ein Objekt mit müssen. Wir müssen ein Objekt mit Feldern versehen, mit denen wir das sensible Objekt finden möchten. Und eigentlich können wir hier nur Unterstrich-ID equals und d bereitstellen . Nun, falls es sich um Data Dot Board AD handelt und es eigentlich egal ist, ob Sie delete one oder find by the end delete verwenden , funktioniert es genau das Gleiche. Also entfernt diese Linie erfolgreich für uns unser Board. Und danach wollen wir unseren Erfolg des Entfernens ausstrahlen. Hier wollen wir für alle unsere Benutzer innerhalb dieses Ports Boards ausgeben, Erfolg löschen. Und eigentlich müssen wir hier keine ID unseres Boards angeben , da sich all diese Benutzer in diesem speziellen Board befinden und wissen, welches Board entfernt wurde, und sie müssen die Startseite umgeleitet werden. weil sie nicht auf dem Board bleiben können, das einer der Kunden entfernt hat. Unsere Serverlogik ist also komplett bereit. Kehren wir nun zu unserem Kunden zurück und genau wie zuvor. Zunächst möchten wir mit Shared- und Socket-Events beginnen . Und ich werde Paste aus unseren Socket-Events, drei Ereignissen, Board-Delete-Erfolg und Misserfolg kopieren drei Ereignissen, Board-Delete-Erfolg und Misserfolg und hier unten einfügen. Jetzt müssen wir in unsere Dienste einsteigen, Board-Service, denn hier wollen wir eine neue Methode zum Entfernen eines Boards erstellen . Hier kopieren wir unser Update-Board und ändern es in Löschpunkt. Und das einzige, was wir brauchen, ist unser Board AT, wir brauchen hier keine Felder. Und hier wollen wir unser Board Delete Event ausgeben. Also lass es uns hier versuchen. Gekauft löschen und im Inneren werden wir ein Objekt mit nur einem Feld versehen. In der Tat ist unsere Board-ID. Jetzt in unserer Anwendung können wir dieses Löschboard nennen und es wird Einblicke in das korrigierende Socket Layer werfen. Jetzt aktualisieren wir unsere Komponente. Also möchte ich wieder in unser Board gehen. Komponenten kauften HTML. Hier haben wir unser Inline-Formular. Und nach diesem Inline-Formular müssen wir ein Symbol erstellen , das Board löscht. Hier sagen wir mal div class Delete Board. Und hier haben wir unser Klickereignis und klicken Sie auf Poupon , um unseren Punkt zu löschen. Und eigentlich müssen wir nichts im Inneren bereitstellen, da wir NAD unseres Boards in unserer Testdatei haben. Also hier möchte ich unser div schließen und es einfach innerhalb des Delete Board-Codes ausprobieren. Jetzt müssen wir in unsere ts-Datei springen und diese Methode hier unten erstellen. Und was wir in unserem Löschboard tun wollen, müssen wir einfach unseren Service anrufen. Nun, hier wissen wir, dass es eine Lücke ist und wir möchten einen Service anrufen. Aber eigentlich möchte ich hier zusätzlich eine Bestätigung schreiben, möchte ich hier zusätzlich eine Bestätigung schreiben weil wir sicher sein müssen, dass Benutzer ein Board wirklich entfernen wollen. Also lass es uns hier versuchen. Wenn Sie bestätigen und nicht wissen, was bestätigt wurde, ist dies ein Standard-Javascript-Popup im Browser, das Ihnen ein Ja oder Nein anzeigt. Also hier wollen wir etwas schreiben wie: Bist du sicher, dass du das Board löschen willst? Und wenn die Antwort ja ist, dann gehen wir in dieses Sieb und rufen diesen Boardservice an. Und hier haben wir einen Löschpunkt, an dem wir unser Board AD bereitstellen können. Und jetzt denkst du vielleicht, okay, wir müssen jetzt unseren Boardservice aktualisieren. Aber wir müssen das überhaupt nicht tun weil es tatsächlich viel einfacher ist. Was wir tun wollen Poupon hier zu unserem Socket Event zu abonnieren, das erfolgreich gelöscht wird. Lass uns das jetzt machen. Dafür wollen wir unseren Socket-Service kopieren, hören und hören, boop will void hören , weil Back Whoop kein Board bekommt. Wir wissen, dass dies nur ein Erfolg beim Löschen unseres Boards ist. Hier wird die Veranstaltung gekauft, Erfolg gelöscht und zurück, wenn Sie nichts bekommen. Und die Frage ist, was wir drinnen machen wollen und eigentlich wollen wir den Benutzer einfach auf unsere Homepage umleiten. Warum ist das so? Denn eigentlich haben wir hier oben in der Navigation Start einen Hörer , was eigentlich bedeutet, dass wir in dem Moment unser Benutzer auf eine andere Seite geht, zum Beispiel auf die Homepage, , in dem unser Benutzer auf eine andere Seite geht, zum Beispiel auf die Homepage, wird live über unseren Boardservice übertragen und wir werden alle Streams korrekt entfernen. diese Weise möchten wir hier in unserem Abonnement tun, Sie schreiben einfach diesen Router Punkt navigieren nach URL. Und hier haben wir zum Beispiel Schrägstriche, was eigentlich bedeutet, dass das Board nicht existiert. Wir müssen für jeden einzelnen Kunden eine Liste möglicher verfügbarer Boards anzeigen . Prüfen wir, ob dieser Code funktioniert. Wie Sie sehen können, haben wir keine Fehler beim Client. Wir haben keine Fehler im Backend. Öffnen wir es jetzt im Browser. Und wie Sie sehen können, funktioniert unsere Seite immer noch. Und jetzt haben wir dieses Löschboard. Aber eigentlich möchte ich diesen Teil nicht entfernen , da wir hier ziemlich viele Tests gebaut haben. Aber ich möchte es tun, ich möchte zurück in unsere Boards springen und ein neues Board erstellen, zum Beispiel zu entfernen. In diesem Fall können wir diese Funktionalität auf dieser neuen leeren Leiste testen . Aber wir wollen es jetzt tun, wir wollen diese Registerkarte duplizieren, nur um zu überprüfen, ob sie für den zweiten Benutzer funktioniert. Was ich jetzt tun möchte, ich möchte auf Punkt löschen klicken, und wie Sie sehen, sehe ich eine Bestätigung. Ich versichere dir, du willst ein Board löschen, wo es versteckt ist, okay? Und wo Regelmäßigkeit auf unsere Vorstände reagiert wird. Und wie Sie hier sehen können, haben wir unser Board nicht , weil es erfolgreich war oder entfernt wurde. Und wie Sie auf der zweiten Registerkarte sehen können, wo alle Ziffern auf unseren Schrägstrich gerichtet sind weil alle unsere Kunden in diesem Raum über das erfolgreiche Entfernen der Platine informiert wurden in diesem Raum über das erfolgreiche Entfernen der Platine informiert und sie müssen auf unsere Board-Seite zurückgewiesen werden. Und wie Sie sehen können, ist unsere Architektur so beeindruckend, dass wir in wenigen Minuten neue Funktionen erstellen können. 40. Spalte löschen: In diesem Video müssen wir das Löschen unserer Spalte implementieren. Und tatsächlich haben wir hier eine Spalte in unserem Board und die Masse in der Nähe des Titels zeigt das Symbol zum Löschen einer Spalte. Und wieder muss es mit dem Socket IO implementiert werden. Daher werden wir einen anderen Benutzer über unsere Löschung informieren. Und ich denke, dass es eine wirklich nette Funktion ist , die Sie selbst implementieren können, da sie dem Löschen in einem Vogel sehr ähnlich ist. Und hier ist Hilfe von meiner Seite. Zuallererst müssen wir wie immer im Backend neue Ereignisse implementieren und das Socket-Ereignis verwenden. Danach müssen wir eine neue Controller-Aktion erstellen , die aus Spalten besteht. Löschen Sie beispielsweise eine Spalte. Wir müssen auch nur für den Kunden Sinn machen. Zuallererst, Registrierung und neue Veranstaltung. Dann haben wir eine neue Methode innerhalb des Spaltendienstes erstellt, die gemeinsam genutzt werden kann, um eine Spalte zu entfernen. Danach müssen wir unsere Komponente aktualisieren, um eine Schaltfläche hinzuzufügen , auf der wir diese spezifische Spalte ab diesem Punkt entfernen . Und eigentlich ist dies nur ein Treffen der Veranstaltung für das Backend. Und wir müssen auch den Erfolg abonnieren, um diese Spalte bei allen unseren Kunden zu entfernen. Und hier ist das Markup des Buttons. Sie wissen also, was Sie implementieren müssen. Wie Sie hier sehen können, befinde ich mich im HTML der Board-Komponente. Hier haben wir unsere Spaltentitel und direkt nach dem Titel wollen wir hier ein Bild mit Quelle schreiben. Und hier haben wir Schrägstrich-Assets, Slash schließen Unterstrich, Icon Dot SVG. Und hier können wir unser Bild schließen, aber wir müssen hier auch eine Klasse bereitstellen , die das Symbol zum Löschen der Spalte sein wird. Schauen wir uns das an. Ich lade die Seite neu und jetzt haben wir ein schönes Kreuz. Und genau hier binden Sie das Ereignis von click. Aber wenn du einfach mitmachen willst, lass uns das gemeinsam umsetzen. Und wie gesagt, es wird dem Löschen des Boards sehr ähnlich sein. Das ist y. Lass es uns schnell und wütend machen. Zunächst möchte ich mit unserem Backend beginnen und Biomasse springt hier in unsere Serverquelltypen. Und hier haben wir unsere Socket-Events. Und wieder haben wir hier Boards löschen, ich kann es kopieren einfügen und es einfach in Spalten löschen ändern. Dies ist y hier auf der linken Seite werden wir Spalten löschen lassen und auf der rechten Seite statt Boards werden überall Spalten schreiben. Und wir müssen es auch in Erfolg und Misserfolg ändern. Unsere Veranstaltungen sind also da. Jetzt müssen wir in unsere Server-Tiers springen und hier Socket verwenden, anstatt Boards löschen, ich möchte Spalten löschen, die wir gerade erstellt haben. Hier. Anstelle des Board-Controllers müssen wir unseren Columns-Controller verwenden. Hier löschen wir kein Board, aber wir werden unsere Spalte löschen. Und jetzt sind wir die Methode zum Löschen von Spalten in unserem Spalten-Controller . Aber ich möchte nichts erneut eingeben, da der Code genau das gleiche Bein ist, das das Board löscht. Hier können wir dieses Löschboard kopieren, vollständig einfügen und in unseren Spalten-Controller einfügen, da es zu 99% gleich sein wird. Zuallererst ist die Frage, was wir hier als Parameter bekommen müssen? Hier sind wir schon, ich komme in Board AD und sie wollen auch hier Spalte D bekommen, weil wir wissen müssen, was wir löschen. Und du könntest hier sagen, okay, aber warum brauchen wir die arme Frau? Wir brauchen nur eine Kolumne und eigentlich nicht, weil wir alle benachrichtigen müssen , die diese spezielle Board-Anzeige abonniert haben. Deshalb müssen wir hier beide Werte angeben. Danach suchen wir hier nach unserem Benutzer und hier müssen wir ein Fehlerereignis treffen. In unserem Fall wird es ein Fehler beim Löschen von Spalten sein. Hier ist dieser Benutzer nicht autorisiert, und hier haben wir unseren Catch und wir können hier die gleichen Spalten delete failure mit unserer get error message verwenden die gleichen Spalten delete failure . Hier. Anstelle des Board-Modells verwenden wir unser Säulenmodell. Hier löschen wir einen Datensatz nach Datenpunkt, und hier ist die Spalten-ID, da wir unsere Spalte nicht geboren löschen müssen unsere Spalte nicht geboren und auf diese Weise unseren Erfolg erreichen müssen. Aber hier werden wir versuchen, für unsere Kolumne erfolgreich zu sein, und hier wird Erfolg haben. Und eigentlich sind wir schon bereit mit unserem Backend. Was ich jetzt tun möchte, ist diese Socket-Ereignisse zu kopieren und einzufügen, da wir sie auf dem Client verwenden werden. Auf diese Weise kopiere ich Einfügen von Spalten, lösche Erfolg und Misserfolg und dass der deaktivierte Champion die Quell-App des Clients festlegt. Und hier haben wir gemeinsame Typen und hier sind unsere Socket-Events, in denen wir Spalten einfügen und löschen können. Als nächstes werden die Spalten „Tub Data, Service, Insight Shared Services“ sein. Weil wir delete column genau hier implementieren wollen. Wir können eine neue Methode delete column schreiben, und wir wissen, dass wir hier unsere Board-ID, die eine Zeichenfolge ist, und auch unsere Spalten-ID, die ebenfalls eine Zeichenfolge ist, erhalten die eine Zeichenfolge ist, und auch unsere Spalten-ID, . Und wir bekommen eine große Lücke, weil wir nur unser Socket-Ereignis ausgeben wollen. Deshalb können wir hier diesen Socket-Service schreiben und uns treffen, und wir verwenden hier unsere Socket-Ereignisse in m Punktspalten delete. Und wir müssen als zweiten Parameter und ein Objekt mit unserem Board AD und auch der Spalten-ID bereitstellen , die wir von den Parametern erhalten. Danach müssen wir unseren Boardservice aktualisieren. Und nur um Sie daran zu erinnern, langweilen Sie Dienste genau dort, wo wir unseren Kolumnenstrom speichern. Was hier eigentlich bedeutet, dass wir das Löschen der Spalte implementieren müssen . Also hier unten kann ich die Methode zum Löschen von Spalten erstellen. Und hier brauchen wir nur unsere Kolumnen. Wir brauchen hier überhaupt keine Board-Idee, da wir diese Methode nur von der Komponente aus aufrufen , um unseren Stream zu aktualisieren. Hier wissen wir also die Spalten-ID, die wir löschen möchten , und zurück werden wir ungültig, und jetzt möchten wir die Liste unserer Spalten aktualisieren. Das ist so hier. Wir können eine Eigenschaft mit aktualisierten Spalten erstellen. Und hier können wir mit diesem Columns-Stream auf unseren Stream zugreifen . Hier bekommen wir unseren Wert. Und danach wollen wir unser Array filtern. Und tatsächlich bekommen wir hier Zugriff auf jede einzelne Spalte und wir wollen diese spezifische Spalten-ID ablehnen. Deshalb können wir hier überprüfen, ob die Spalten-ID nicht mit unseren Spaltennamen übereinstimmt die als Parameter übergeben wurden. In diesem Fall erhalten wir hier genau die gleiche Liste unserer Spalten, aber ohne diese eine Spalte. Und danach müssen wir einfach unseren Stream aktualisieren. Dafür können wir diese Spalten als nächstes schreiben und wir werfen in unsere aktualisierten Spalten. Diese Methode aktualisiert also tatsächlich unseren Stream und entfernt eine Spalte aus dem Stream. Der nächste Schritt besteht darin, unsere Komponente zu aktualisieren. Und eigentlich haben wir unser HTML bereits geändert. Hier haben wir jetzt ein Bild, aber wir müssen anhängen, ein Klickereignis hören. Und was ich tun möchte, ich möchte eine Spalte löschen. diese Weise können wir hier eine Methodenlöschspalte bereitstellen, und wir müssen innerhalb der COM-Punkt-ID übergeben. Und hier oben, wie Sie sehen können, haben wir Zugriff auf unsere Spalte. Jetzt können wir in unsere Komponente springen und diese Methode erstellen. Dalit-Spalte erhält also nur ein einziges Argument, nämlich unsere Spalten-ID, die wir entfernen und wo sie ungültig wird. Und jetzt wollen wir drinnen einfach unseren Shared Service anrufen. Hier wird also diese Kolumnendienstwelt oder der Herodes sein. Jetzt haben wir hier eine Methode delete column inside. Wir müssen ein Board-AD bereitstellen, und tatsächlich sind es diese Board-AD und dann die Spalten-ID. Diese Codezeile sendet also ein Ereignis an unser Backend, um diese Spalte zu entfernen und alle unsere Kunden zu benachrichtigen. Und jetzt müssen wir nur noch unser Abonnement hier oben abonnieren , dass wir unsere Spaltenliste aktualisieren möchten. Hier können wir hier eigentlich etwas Ähnliches kopieren und verschweißt haben hier Säulen Erfolg. Ich kopiere es, füge es ein und füge es hier unten ein. Und hier haben wir delete und tatsächlich löschen mit hat es nicht richtig gemacht. Ich möchte zurück in unsere Controller-Säulen springen. Wie Sie hier sehen können, haben wir i2 data board sie emittieren, und hier habe ich nur den Namen geändert spalten löscherfolg, aber es ist nicht genug. Wir müssen hier einige Daten angeben, da eigentlich alle unsere Kunden wissen müssen, welche Spalte wir entfernen müssen. Hier möchte ich als zweiter Parameter die Datenpunktspalte tief bereitstellen. Und in diesem Fall erhalten wir allen unseren Kunden genügend Informationen bezüglich unserer Spaltenlöschung. Jetzt können wir wieder in die Board-Komponente springen und hier ist unser Hören. Und eigentlich hören wir uns hier unsere Kolumnen an , Erfolg löschen. Und hier erhalten wir keine Spalte, sondern nur die Zeichenfolge, die wir entfernen möchten. diesem Grund können wir hier schreiben , dass dies die Spalten-ID ist und dies tatsächlich genug Information ist damit der Client eine Spalte entfernen kann. Deshalb können wir hier jetzt Board Service Dot anrufen. Und hier haben wir unsere Löschspalte. Und im Inneren stellen wir, wie Sie sehen können , Spalte D zur Verfügung, und genau das haben wir hier von unserem Backend. Also haben wir eigentlich alles für unser Feature implementiert. Prüfen wir, ob es funktioniert. Lassen Sie uns zunächst das Backend überprüfen, das wir hier haben, ein Problem. Spalte löschen existiert nicht im Typ und hier sind Spalten. Schauen wir uns das an. Ich werde zurück in unsere Controller springen, und hier haben wir unser Löschboard. Das ist also das Problem. Ich kopiere die eingefügte Delete Board-Methode, aber sie haben sie nicht umbenannt. Es sollte Spalte löschen sein. Lass uns das nochmal überprüfen. Ich speichere es und springe in die Konsole. Und wie Sie jetzt sehen können, haben wir keine Fehler. Schauen wir uns jetzt unseren Kunden an. Alles sieht gut aus. Also lasst uns zu unserem Board springen. Wie Sie sehen können, funktionieren unsere Seiten. Und jetzt kann ich hier klicken, um zum Beispiel diese vollständige Spalte zu entfernen . Ich klicke darauf und wie du siehst, ist es komplett weg. Und was noch interessanter ist, wir können die Registerkarte duplizieren und versuchen, diese nächste Spalte zu entfernen , F, F, d, d usw. Ich treffe hier Kreuz und es wird nicht nur hier, sondern auch in dieser Registerkarte entfernt . Und alles wird automatisch aktualisiert, was bedeutet, dass wir die Entfernung der Spalten in unserer Anwendung erfolgreich implementiert haben. 41. Update: In diesem Video müssen wir eine der letzten Funktionen in Bezug auf unser Board implementieren , und dies ist die Aktualisierung der Kolumne. Und wie Sie bereits verstehen können, ist es sehr ähnlich, die Spalte zu löschen. Der einzige Unterschied ist, dass wir ein Inland von den aktualisierten haben werden, aber viele Dinge werden genau gleich bleiben. Wo ein Meeting, ich bin ein Socket-Ereignis, bei dem es ins Backend kommt , und wenn wir alle unsere Clients definieren, ist dies y. Lassen Sie es uns jetzt gemeinsam implementieren, zunächst möchte ich zurück in unseren Server springen Quelltypen. Und hier müssen wir Inside-Socket-Ereignisse in neuen Typen und Hairball in die Kopfsäulen-Note erstellen , ich kann es kopieren, einfügen und zwei Spalten umbenennen Update. Also hier haben wir die Spalten Update, Spalten Updates, Erfolg und Misserfolg. Hier rechts. Dann können wir es in Update ändern. Dann ein Erfolg beim Geburtsdatum und ein Aktualisierungsfehler, nachdem dieses Lithium wieder in unserer Schwesternschaft S und hier und Ihrem eigenen Event ist. Also hier kopiere ich das Löschen der eingefügten Spalte und ändere es unser Spaltenupdate , das wir gerade erstellt haben. Und hier verwenden wir unseren Columns Controller, aber hier bekommen wir nicht delete column sondern update column. Jetzt müssen wir diese Aktion erstellen, aber tatsächlich können wir sie von unseren Boards kopieren und einfügen , da wir hier bereits ein Update Board implementiert und es wird super ähnlich sein. diesem Grund möchte ich das Einfügen vollständig kopieren und unten in unseren Spalten-Controller einfügen. Hier muss zunächst die Benennung geändert werden. Also hier haben wir unsere Update-Kolumne und eigentlich möchte ich es mit der armen Dame und den Feldern genau so belassen . Wir haben also genau die gleiche Struktur. Hier brauchen wir nur die Spalten-ID, die eine Zeichenfolge ist. Und das einzige Feld, das wir hier aktualisieren, ist unser Titel. Jetzt ändern wir unseren Inhalt. Hier werden wir Socket-Ereignisse in m haben und hier wurde ein Spaltenaktualisierungsfehler erstellt. Und lassen Sie uns auch unseren Fang ändern, hier wird auch ein Fehler beim Aktualisieren der Spalte sein. Jetzt müssen wir unsere Logik ändern. Anstelle von Bohrs Modell werden wir hier ein Säulenmodell haben und wir werden bis zum Ende-Update eine Geldstrafe verhängen. Das ist völlig in Ordnung. Aber hier wollen wir kein Board bekommen, sondern spaltenweise ID. Und hier haben wir Datenfelder. Dies ist völlig normal und wird rückwärts aktualisiert und nicht aktualisiert. Jetzt möchten wir hier allen unseren Kunden unsere Veranstaltung vorstellen, die ein Erfolg der Kolumnenaktualisierung sein wird. Und hier müssen wir unsere aktualisierte Spalte bereitstellen , damit sie auf dem Client geändert werden kann. Unser Backend ist erfolgreich, es hat sich geändert. Jetzt müssen wir unseren Kunden auf den neuesten Stand bringen. Und zuerst möchte ich diese drei neuen Ereignisse kopieren, nämlich die Spalten Update, Erfolg und Misserfolg. Lassen Sie uns nun zurück in die Quell-App unserer Kunden springen. Und hier haben wir nicht gesagt, dass unsere Typen Socket-Ereignisse vergossen werden. Und hier unten werde ich Spalten hinzufügen Update Erfolg und Misserfolg. Jetzt wollen wir unseren Shirts-Service ändern , der dafür verantwortlich ist, Anfragen an unsere API zu stellen. Hier sind die Services-Spalten und hier haben wir bereits eine Delete-Spalte implementiert, aber wir müssen jetzt unsere neue Methodenaktualisierungsspalte tun. Hier wissen wir schon , was wir bekommen. Wir bekommen hier unsere Board-ID, die eine Zeichenfolge ist. Danach erhalten wir unsere Spalten-ID, die auch eine Zeichenfolge ist. Und zu guter Letzt sind unsere Felder, bei denen es sich um ein Objekt mit einem Titel handelt, bei dem es sich um eine Zeichenfolge handelt. Und zurück werden wir nichtig, weil wir hier einfach ein Ereignis ausstrahlen. Hier trifft sich der Hörsteckdosen-Service Datta und wir wollen hier die Steckdose verwenden, um sie sogar zu sehen. Und hier haben wir unsere Spaltenaktualisierungsaktion als zweiten Parameter. Wir müssen für alles sorgen. Zuallererst Board AT zweitens Spalte bedürftig. Und zuletzt sind Filme. Und damit ist unser Service komplett fertig. Jetzt müssen wir unseren Boardservice aktualisieren , damit wir unsere Komponente ändern können. diesem Grund werde ich in unsere App springen, Board Services, Board Service. Und hier haben wir bereits ein Methodenaktualisierungsboard erstellt. Hier erstellen wir unsere Update-Spaltenmethode. Und wir wissen, dass diese Gruppe einen einzelnen Datensatz innerhalb unseres Arrays aktualisieren möchte . Und hier wollen wir nur eine etwas veraltete Spalte bekommen. Das haben wir von unserem Backend bekommen. Hier. Wir bekommen die gesamte Spaltenschnittstelle und zurück wollen wir void werden. Nun, hier ist unsere Idee. Wir müssen jede einzelne Spalte durchgehen und diese Spalte für Tag aktualisieren. diese Weise können wir hier unsere aktualisierten Kolumnen zurückerhalten. Und hier wollen wir zunächst den Wert unseres Streams erhalten . Hier erhalten unsere Spalten einen Wert und wir mappen durch dieses Array. Also hier ist map und wir bekommen Zugriff auf jede einzelne Spalte hier drin, in der wir unsere Logik schreiben müssen. Wenn also unsere Spalten-ID , die wir durchlaufen , unserer aktualisierten Spaltenpunkt-ID entspricht, müssen wir unsere Magie entfalten. Und wenn nicht, dann wollen wir unsere Kolumne einfach ohne Update zurückgeben. Was wollen wir nun innerhalb der ersten Schleife tun , um diese spezifische Spalte zu aktualisieren. Deshalb möchte ich unsere Kolumne mit dem Titel zusammenführen. Und hier stellen wir einen aktualisierten Spaltenpunkttitel zur Verfügung. In diesem Fall aktualisieren wir hier nur eine einzige Jacke , wenn sie passt. In anderen Fällen, wo einfach unsere Kolumne zurückgegeben wird. Danach müssen wir nur noch unseren Stream mit diesen Spalten aktualisieren . Wir werden in unseren aktualisierten Spalten bereitgestellt, sodass unsere Methode vollständig bereit ist. Jetzt müssen wir nur noch unsere Komponente aktualisieren. Lassen Sie uns also zurück in unsere Board-Komponente springen, und hier haben wir unseren Spaltentitel, aber statt nur eines Titels müssen wir uns hier im Trend befinden Inline-Form, das ist y hier. Lassen Sie uns das Inline-Formular ausprobieren und schließen wir es hier direkt. Nun müssen wir hier zunächst unsere Klasse festlegen , die hinzugefügt wird Spaltenform. Danach müssen wir Standardtext bereitstellen. Und hier wollen wir den Namen unserer Spalte schreiben, die Spalte sein wird, den Titel, aber auch hier einen Wert angeben müssen. Das ist y, hier ist der Titel , der unser Spaltentitel ist. Und der letzte ist unser Callback , der mit submit behandelt wird. Und tatsächlich können wir diese Methode benennen, aktualisieren, Spaltennamen, und darin bekommen wir Festival, unser Event, das eigentlich unser Spaltenname ist. Und hier müssen wir zusätzlich die Spalten-ID angeben, da Groupon nicht weiß, für welche Spalte wir diesen speziellen Bildschirm aktualisieren möchten. Lassen Sie uns nun diese Methode in unserer Komponente erstellen. Also hier unten möchte ich den Namen der Aktualisierungsspalte hinzufügen. Und hier bekommen wir zuallererst unseren Spaltennamen, der die Zeichenfolge aus unserem Inlandspaß ist. Und zweitens bekommen wir hier unsere Spalten-ID. In diesem Fall wissen wir, was wir aktualisieren müssen und was wir hier tun wollen. Wir wollen unsere Methode nur aus Shred-Spalten aufrufen. Das ist y, hier, dieser Spaltendienst, und hier ist unsere Methodenaktualisierungsspalte , die wir gerade erstellt haben. Zunächst müssen wir hier unsere Board-ID, Spalten-ID und auch unsere Felder angeben . In unserem Fall haben wir hier nur ein einzelnes Feld, das unser Titel sein wird, nämlich unser Spaltenname. Auf Kundenseite ist alles bereit, aber wir müssen den Erfolg eines Geburtsdatums in der Spalte abonnieren . Deshalb müssen wir hier ganz oben gehen, auf jetzt einen Socket-Service. Und eigentlich haben wir hier schon unser Update des Boards, was eigentlich bedeutet, dass ich diese Zeilen kopieren, einfügen und einfach ändern möchte . Denn hier zurück erhalten wir unsere Spaltenschnittstelle, nachdem wir unsere Kolumne aktualisiert haben. Und eigentlich wollen wir hier abonnieren, um sie als Update-Erfolg zu bezeichnen. Und hier bekommen wir kein aktualisiertes Board, aber wir bekommen eine aktualisierte Spaltennummer eine andere Methode von unserem Board-Service aufrufen muss. Und diese Methode wird Update-Spalte sein. Und im Inneren stellen wir unsere aktualisierte Spalte zur Verfügung, was bedeutet, dass mit diesem Code alle unsere Kunden benachrichtigt werden und wir diese spezielle Spalte aktualisieren werden. Schauen wir mal, ob es hier im Backend funktioniert, alles sieht gut aus. Hier auf dem Client haben wir keine Fehler. Lass uns zum Browser springen. Und wie Sie hier sehen können, habe ich diesen schönen Namen und jetzt kann ich darauf klicken , weil dies unsere Inlandsfirma ist und nicht nur der Titel. Jetzt versuchen wir es hier, aktualisiert und ich drücke die Eingabetaste. Und wie Sie sehen können, wurde es aktualisiert und das Laden der Seite verschoben, dann ist dieser Code auch Fleck, was bedeutet, dass wir diese Änderung erfolgreich im Backend vorgenommen haben und sie haben alle unsere Kunden. Und hier, wenn ich zur zweiten Registerkarte springe, sieht es genauso aus, da es auch über Socket IO aktualisiert und benachrichtigt wurde . Vor diesem Hintergrund haben wir unsere Update-Funktion in der Spalte erfolgreich implementiert . 42. Abmelden: In diesem Video möchte ich über das Abbestellen sprechen , da wir tatsächlich ein Problem haben. Schauen wir uns unseren Board-Komponententest an. Hier haben wir unsere initialisierenden Listener und wir verwenden dot subscribe ziemlich oft. Und tatsächlich müssen Sie wissen, dass Sie in Angular jedes Mal, wenn Sie das Wort Abonnieren schreiben, in Gefahr sind, weil Sie dort ein Abonnement erstellen. Und dieses Abonnement wird dort bis zum Ende der Welt hängen. Was zum Beispiel bedeutet, dass wir unser Board verlassen und zu einem anderen Board springen. Und all diese Abonnements sind bereits da und werden niemals zerstört werden , da alle Abonnements nichts mit unserer Komponente zu tun haben und das Angular nicht. irgendwas über sie. Aber hier ist es wichtig zu erwähnen, wenn wir innerhalb von Angular über den HTTP-Client sprechen, dann dürfen wir uns nicht davon abmelden. Dies ist nicht zwingend erforderlich, da Angular automatisch abmeldet, was bedeutet, dass wir hier, wenn wir diesen Router Ereignisse abonnieren, das völlig in Ordnung ist. Hier können wir auch auf unsere Abrufdaten schauen und hier abonnieren wir auch unsere Langeweile. Und dafür müssen wir uns langweilen und überprüfen, was wir hier haben. Und tatsächlich ist das ein ziemlich großer Gad, ein HTTP-Client, was bedeutet, dass dieser Code völlig in Ordnung ist und wir uns nicht abmelden sollten. Aber eigentlich ziehe ich es vor, mich überall abzumelden, in jeder einzelnen Anwendung, in der ein C-Abonnement besteht, weil man nie weiß, was genau diese Get-Board-Methode ist? Ist es wirklich ein HTTP-Client oder ist es nur ein Wrapper? Und du musst dich wirklich abmelden. Und die Frage ist, wie Sie sich in Ihrer Bewerbung abmelden können , um es bequem zu machen. Und dafür gibt es viele Möglichkeiten. Und eigentlich wollen wir uns immer abmelden, wenn wir eine Komponente zerstören. Und in der Regel, wo diese Turner-Komponente, wenn wir uns umziehen, was eigentlich bedeutet, dass wir hier so etwas wie dieses Board-Abonnement schreiben können . Und hier erhalten wir das Ergebnis unseres Abonnements und das Ergebnis des Subscribe Easy-Abonnements, was tatsächlich bedeutet, dass pro Masse diese Eigenschaft erstellt wird und dann direkt in unserer Engine destroy Boards Abo dot abbestellen. Das ist absolut gültig, aber dann werden wir viele Immobilien schaffen und das ist nicht so komfortabel. diesem Grund gibt es bessere Möglichkeiten, dies zu tun. Ich wollte Ihnen einen einfachen Ansatz zeigen , den Sie verwenden können. Was ich in meiner Board-Komponente tun möchte, möchte ich eine weitere Eigenschaft erstellen und sie möchten diese Eigenschaft abbestellen. Und eigentlich möchte ich hier Dollar setzen , weil es ein Stream sein wird. Und hier möchte ich ein neues Fach und eigentlich auch das Jugendverhaltensfach innerhalb unseres Vorstands zuweisen eigentlich auch das Jugendverhaltensfach . Aber hier haben wir ein neues Thema mit Leere, und ich nenne es nur, der Hauptunterschied zwischen Subjekt und Verhaltenssubjekt ist das Verhaltenssubjekt immer einen Anfangswert hat und dann sag, Subjekt, wir haben keinen Anfangswert. Jetzt wollen wir hier Geräte auf Destroy hinzufügen, was eigentlich bedeutet, dass wir in G on destroy erstellen müssen. Und jetzt sprechen wir hier in Deutschland darüber. Und hier können wir im Juni destroy schreiben und was wir drinnen machen wollen, wir wollen diesen Abmeldepunkt als nächstes schreiben, also spalten wir den nächsten Wert. Und danach ist dieser Abmeldepunkt abgeschlossen, was bedeutet, dass wir, nachdem wir diese Komponente zerstört haben, keine neuen Werte innerhalb dieses Abmeldevorgangs erhalten möchten. Und jetzt können wir dieses Abbestellen überall verwenden , um Abonnements zu ignorieren. Wie sieht es aus? Eigentlich müssen wir es hier nicht verwenden, aber wir müssen es innerhalb des Socket-Service verwenden, da es sich um aber wir müssen es innerhalb des Socket-Service verwenden ein benutzerdefiniertes Abonnement handelt. Und um das zu tun, bevor wir es abonniert haben, können wir es einfach versuchen dot pipe und innen wollen wir die Methode take verwenden bis und innerhalb wollen sie dieses Abbestellen , das wir gerade erstellt haben, was eigentlich bedeutet, dass wir hier nehmen, okay, wir müssen neue Werte annehmen und dieses Abonnement haben , bis diese Abmeldung gültig ist. In dem Moment, in dem wir Colin komplett mit Bond sind, kommen Sie hier zu unserem Abonnement. Was eigentlich bedeutet, dass wir in jedem einzelnen Fall, wenn wir ein Abonnement haben, einfach vorher versuchen können, indem wir es bis zu diesem Abbestellen aufnehmen. Und wir können loslegen, nachdem unsere Komponenten zerstört werden. Hier werden wir vollständig und diese Logik wird niemals passieren. Dies ist wirklich eine komfortable und einfach zu implementierende Variante , abbestellen. diesem Grund möchte ich diesen Code kopieren, einfügen und in jede einzelne Lektion einfügen, die wir hier kurz vor dem Abonnieren schreiben. In diesem Fall ist es auf der sicheren Seite, und wir werden diesen Code nicht aufrufen, nachdem wir eine Komponente zerstört haben. Jetzt möchten Sie sicher wissen, ob es wirklich so funktioniert. Aus diesem Grund können wir, um es zu testen, einfach auskommentieren, bis zum Beispiel in Spalten, der Zugriff auf Updates erfolgt . Aber eigentlich wird es so nicht funktionieren denn als wir das Board verließen, sendet Bacon keine Ereignisse mehr, um zu fragen. Aus diesem Grund wird das, was wir nur zum Testen tun können , in den Controller-Spalten eingesetzt. Und hier ist unsere Methodenaktualisierungsspalte, und hier haben wir unsere Funktion sind Ihre beiden. Und hier müssen wir nur Kunden finden , bei denen sie sich in diesem speziellen Teil befinden. Nur zum Testen werde ich hier entfernen, um alle Kunden überhaupt zu benachrichtigen, weil sie Ihnen zeigen möchten, dass dieses Abonnement immer noch da ist, wenn wir das Board verlassen. Also jetzt hier möchte ich einfach versuchen, das Konsolenprotokoll zu erstellen. Spalte wurde aktualisiert. Hier ist unsere aktualisierte Kolumne. Schauen wir uns das an. Ich lade die Seite neu, springe zu diesem Punkt und versuche die Spalte zu aktualisieren. Wie Sie sehen können, ist dies unser Konsolenprotokoll, und hier haben wir auch das Konsolenprotokoll. Es ist völlig in Ordnung. Aber jetzt springen wir zurück zu unseren Boards und wir haben nichts und unsere Komponente wurde zerstört. Jetzt hier auf der zweiten Registerkarte werden wir diese Spalte aktualisieren. Und wie Sie hier sehen können, fügen Sie den ersten Schritt ein. Wir haben diese Spalte wurde aktualisiert und wir bekommen sie, weil dieses Abonnement immer noch hängt mit Wir haben uns nicht von unserem Code abgemeldet und dafür angegeben, wir können einfach die Kommentare entfernen bis , Lass es uns versuchen es Jetzt springen wir in unsere Anwendung. Wir bekommen eine aktualisierte Kolumne, in der der Champion zurück zu unseren Boards kommt. Und jetzt können wir hier versuchen, unsere Kolumne zu aktualisieren. Aber wie Sie jetzt im ersten Schritt sehen können, haben wir keine Nachricht erhalten, da hier diese Einstellung erst durchlaufen wurde. Aus diesem Grund ist es so wichtig, alle unsere Abonnements abzubestellen . Jetzt ändern wir diesen Code zurück. Zuallererst benötigen wir dieses Konsolenprotokoll nicht. Und zweitens werde ich in unsere Controller-Spalten springen und Code zurück in die i2-Datenbank-ID ändern. In der realen Anwendung empfehle ich Ihnen daher dringend, sich von all Ihren Abonnements abzumelden. 43. Aufgabenmodul und Basiskomponente: In diesem Video starten wir neue und interessante Funktion und sprechen dann hier über das Feature-Aufgabenmodell. Was bedeutet es? Eigentlich, wie Sie hier sehen können, wo innerhalb des Boards und wenn wir innerhalb dieses Punktes auf eine bestimmte Aufgabe klicken , müssen wir hier ein Modell öffnen, aber so einfach ist das nicht, denn was wir wollen zu tun, wir wollen unser Routing ändern. Jetzt haben wir also eine Schrägbrett-Slash-Board-ID. Und wenn wir eine Aufgabe nach dem Neuladen der Seite öffnen, möchten wir dieselbe Aufgabe sehen. Und der einfachste Weg, dies zu implementieren, ist offensichtlich das Routing. Also wollen wir in dem Moment, in dem wir eine Aufgaben-URL wie Slash Board Slash Board ID Slash-Aufgaben Slash-Aufgabe KD öffnen , was eigentlich bedeutet, dass wir eine verschachtelte Route innerhalb des Boards haben. Und tatsächlich erlaubt uns Angular wirklich einfach, die Dürren der Kinder zu bewältigen. Warum brauchen wir hier eine Kinderdürre? Da sie tatsächlich hier sind, wollen wir zunächst das gesamte Board rendern und zusätzlich dieses Modell rendern, was eigentlich bedeutet, dass unser Modell hier oben und unter unserem Modell sein wird, werden wir sehen das ganze Board. Und das ist extrem wichtig, denn tatsächlich werden wir, sogar innerhalb des Modells, das gesamte Board holen. Und tatsächlich wird diese gesamte Komponente gerendert, wie sie ist, ohne Änderungen. Und was auch in unserem Aufgabenmodell interessant ist, wir werden diese Informationen aus dem Board verwenden, und genau das haben wir hier implementiert. Hier in unserer Kundenquelle, App, Board Services, Bot Service haben wir drei Streams. Unsere Aufgabenspalte und, aber, und das ist erstaunlich, denn jetzt können wir in unserem Aufgabenmodell alle unsere Aufgaben lesen, benötigte Aufgabe anhand dieser ID innerhalb der URL finden , die wir in einer Sekunde implementieren werden und dann rendern Sie einfach diese Informationen der Aufgabe ohne zusätzliche Anfragen. Und in diesem Video möchte ich mit den Grundlagen dieses Aufgabenmodells beginnen . Hier wollen wir eine Basiskomponente erstellen und unsere Route korrekt binden. Und dafür möchte ich zurück in unser Board-Modul springen . Und hier haben wir unsere Route mit Schrägbrettern, Schrägbrett-ID. Und hier wollen wir eine Kinderdürre haben. Hier können wir Kinder schreiben und das ist ein Array. Hier haben wir auch ein Objekt mit Pfad, das Tasks Slash sein wird. Und hier ist die Aufgaben-ID, was eigentlich bedeutet, dass wir hier den übergeordneten Pfad und unseren untergeordneten Pfad nehmen . Und zusammen haben wir hier unseren Aufgaben-ID-Pfad, müssen aber auch eine Komponente bereitstellen , die wir in einer Sekunde erstellen werden. Und es ist unsere Aufgabenmodellkomponente. Aber wir haben auch keine Änderung unserer Route implementiert. Und dafür möchte ich in unser Komponentenboard springen. Und hier ist Komponenten-HTML gekauft. Und wie Sie hier sehen können, haben wir einen Link zu unserer Aufgabe. Dies ist diese Aufgabe der Div-Klasse, und hier ist Energie für die Schleife. Und eigentlich wollen wir hier ein Klickereignis schreiben. Und was wir tun wollen, wir wollen die Aufgabe öffnen. Und dafür brauchen wir nur unsere Aufgabenpunkt-ID. Und was wir innerhalb dieser Methode tun wollen , ist einfach eine Route zu ändern. Das ist so hier. Lassen Sie uns diese offene Aufgabe innerhalb der Board-Komponente erstellen. Und hier bekommen wir unsere Aufgaben-ID, die eine Zeichenfolge ist. Auf der Rückseite werden wir nichtig. Und jetzt können wir hier einfach unseren Router benutzen , um die Route zu ändern. Also hier können wir diesen Router dot navigate schreiben, und wir verwenden hier navigate und nicht nach URL navigieren , weil wir innerhalb eines Arrays übergeben wollen. Hier. Zuallererst haben wir Boards, dann verketten wir diese Zeichenfolge mit dieser Board-ID und dann mit einem Komma. Und wir haben hier unsere Aufgaben, und hier haben wir unsere Aufgaben-ID. Wie Sie sehen können, ist es viel einfacher, navigate mit array zu schreiben und dann nach URL zu navigieren, wo wir diese Zeichenfolge selbst verketten müssen. Unser Klickereignis ist also komplett fertig, und jetzt müssen wir nur noch diese neue Komponente erstellen. diesem Grund sprechen wir in unserer Platine immer noch über Komponenten für Platinenmoduleinsätze. Wir wollen unsere neue Komponente erstellen und sie wird unser Aufgabenmodell sein. Jetzt innen mit zuallererst, müssen eine Aufgabe Modell Ts und auch Aufgabenmodell Punktkomponente Punkt HTML erstellen . Und jetzt hier im HTML möchte ich das gesamte Markup unseres Modells ohne Logik direkt verknüpfen. In diesem Fall können wir direkt sehen, dass der Begriff Modell funktioniert und der Router auch funktioniert. Hier schreiben wir den gesamten Markt. Hier haben wir zunächst unseren Klassenaufgabenmodell-Container, und hier binden wir noch keine Daten. Jetzt in diesem Div müssen wir es noch einmal tiefer ausprobieren, und es wird unser modaler Task-Header sein. Schließen wir dieses Div und darin werden wir später unseren Aufgabentitel in Zeilenform rendern . Und nach unserer Inlandform müssen wir hier ein Bild rendern. Und tatsächlich wird hier Source Slash Assets Slash Schließen Symbol Punkt SVG sein. Und hier müssen wir auch eine Klasse bereitstellen , die eine Aufgabe sein wird. Model nah und eigentlich habe ich es nicht richtig geschrieben. Dieses Bild muss nach unserem Aufgabentitel Inline-Firma stehen. Wir sprechen hier also über den modalen Header für Aufgaben. Und nach dem modalen Header der Dämmerung wollen wir das nächste Div erstellen, das der modale Task Body sein wird. Schließen wir hier unser div und innen wollen wir ein Motiv erstellen, weil wir unsere Elemente gruppieren müssen. In diesem Div möchten wir unser Formular später erstellen. Sie fragen sich vielleicht, okay, aber warum verwenden wir hier Justin Lin Firma und hier wollen wir eine echte Firma gründen, denn tatsächlich brauchen wir hier später auch eine Auswahl, um unsere Spalte zu ändern. diesem Grund ist es für dieses Forum viel einfacher zu verwenden. Das ist mein hier. Lassen Sie uns vorerst ein Formular ohne feste Gruppe erstellen , einfach Glas verquirlen. Und hier haben wir unseren Spaltenauswahlcontainer. Schließen wir dieses Formular. Und in unserem Formular werden wir später eine Auswahl rendern, aber im Moment haben wir sie nicht. Hier wählen Sie einfach die Spalte aus. Und danach wird die Firma ein Motiv erstellen wollen, in dem wir unsere Aufgabenmodellbeschreibung haben werden. Und hier haben wir unser div mit der Beschreibung des Klassenaufgabenmodells. Und dann schreiben wir einfach eine Wortbeschreibung. Nach diesem Div haben wir ein Inline-Formular für unsere Beschreibung. Hier ist eine Inline-Formularbeschreibung , die wir spät erstellen werden. Und jetzt, nach diesem Div, das wir erstellt haben , müsste ein Motiv erstellt werden. Und hier haben wir unsere Aufgabenmodellaktionen mit zuallererst, benötigen eine zusätzliche Klasse und es werden Aufgabenmodellaktionen sein , die beschriftet sind, und innerhalb dieses Divs werden wir einfach Aktionen schreiben. Und danach müssen wir noch ein Div erstellen. Und in diesem Div packen wir ein Motiv mit Klasse, Aufgabe, Modell, Aktionen, Aktion. Hier, schließen wir dieses div und dann können wir im Inneren ein Bild mit Quell-Slash-Acidslash-Trash-SVG rendern . Und hier ist unsere Klasse, die als Modellaktionssymbol beauftragt wird. Und nach dem zweiten werden wir einfach ein Wort löschen. Und nach dem gesamten Markup am Ende müssen wir einen Hintergrund rendern, damit unser gesamtes Board ein bisschen versteckt ist. Hier müssen wir div mit dem Hintergrund des Klassenaufgabenmodells erstellen Hintergrund des Klassenaufgabenmodells Schließen wir dieses div damit unser Markup vollständig fertig ist. Jetzt müssen wir nur noch diese Komponente erstellen. Lassen Sie uns hier zunächst eine Klasse erstellen und sie wird unsere modale Aufgabenkomponente sein. Oben wurden unsere Komponente gemeistert, und wir registrieren uns im Inneren. Zuallererst wird ein Selektor, es wird ein Aufgabenmodell sein. Und danach, eine Vorlagen-URL und geschweißt, desto schwerer ist es Aufgabe modale Komponente HTML, aber es ist nicht alles. Wir müssen eine weitere Klasse für den gesamten Wrapper dieser Komponente bereitstellen . Nur in diesem Fall wird unser Markt korrekt sein. Und hier müssen wir gerade Host-Bindung. Und hier biete ich Einblickskurse an. Hier können wir Klassen gleich Aufgabenmodell schreiben. Und wenn Sie so etwas nie geschrieben haben, verwenden wir eine solche Notation, wenn wir diese Klasse nicht auf einige tief in dieser Komponente anwenden müssen , aber wir möchten, dass genau eine Klasse auf unsere Komponenten-Element. Also haben wir einige grundlegende Komponenten erstellt. Prüfen wir jetzt, ob es überhaupt funktioniert. Also Festival hier haben wir eine Menge Fehler. Zum Beispiel kann hier im Board-Modul keine modale Komponente der Aufgabe finden. Zuallererst müssen wir hier in unser Board-Modul springen. Und hier müssen wir unsere Aufgabenmodellkomponente eingeben. Und wir müssen es auch hier innerhalb der Deklaration bereitstellen, das ist eine Aufgabenmodellkomponente. Lassen Sie uns noch einmal nachschauen mit habe hier keine Fehler. Ich werde die Seite neu laden und sie sehen jetzt keine Fehler in der Konsole. Aber was wir jetzt tun müssen, wir müssen auf eine der Aufgaben klicken. Hier ist zum Beispiel meine erste Aufgabe und ich klicke nur. Und wie Sie sehen können, ist nichts passiert. Aber in der Dürre können wir jetzt Bretter zerschneiden, unsere Board-ID zerschneiden, Aufgaben zerschneiden und das d unserer Aufgabe, die wir gerade geöffnet haben, zerschneiden . Und jetzt fragen Sie sich vielleicht, okay, aber warum wir unsere Komponente nicht sehen und eigentlich nicht den Outlet für unsere Kinder im Trend haben , was eigentlich bedeutet, dass innerhalb unseres Boards, innerhalb des Board-Komponenten-HTML, Irgendwo in unserem Markup, zum Beispiel unten, müssen wir Zhao Outlet genauso rendern , wie wir es in unserer App-Komponente getan haben. Also hier schließen wir einfach den Router Outlet und jetzt muss es funktionieren. Ich werde die Seite neu laden. Und wie Sie sehen können, sehen wir unser Modell daran, denn das ist eigentlich die Route. Und jetzt sehen wir jedes Mal, wenn ich die Seite neu lade, unsere Eltern im Hintergrund. Und hier sehen wir unser Modell und haben tatsächlich bereits einige grundlegende Markups für dieses Modell, was bedeutet, dass es voll funktionsfähig ist. Aber jetzt möchte ich eine große Fallgrube beheben , von der es sehr schwierig sein wird, das zu debuggen, wovon ich spreche. Wie Sie hier in unserer Board-Komponente sehen können, haben wir hier einen Routencheck und tatsächlich haben wir hier oben diese Event-Navigationssterne abonniert. Und hier lösen wir Live Born aus. Was macht Live-Board? Eigentlich treffen wir hier ein Socket-Ereignis für unser Back-End, was eigentlich bedeutet, dass wir uns in diesem aktuellen Socket abmelden Unser aktueller Benutzer von Ihnen ging auf diesen Punkt , der tatsächlich bedeutet, dass wir hier an diesem Punkt waren, Slash Board Slash AD. Und jetzt bekommen wir hier Events. Alles ist in Ordnung. Aber in dem Moment, in dem wir unser Modell öffnen , haben wir uns verändert. Und tatsächlich bedeutet es, dass wir hier in dieser IV sind und hier live sehen, was wir leicht überprüfen können. Zum Beispiel werde ich es hier einfach live ausprobieren, aber ich lade die Seite neu. Es sieht gut aus. Aber wenn ich zu unseren Boards springe und dann einfach auf meine erste Aufgabe klicke. Wie Sie hier sehen können, bekommen wir Leave Board. Dies wird komplett neu gezeichnet, da wir in diesem Fall keine Benachrichtigung in unserem Board erhalten, aber das Board bereits verlassen haben. Das ist Sean Verhalten weil wir kein Board leben wollen. Wenn wir das Modell nur öffnen, wollen wir immer noch auf dieser Seite sein, aber wir können tun, um es zu reparieren, wir müssen eigentlich nur nach unserer Slash Board-Route suchen. Denn wenn wir hier in der Dürre Schrägstriche haben, bedeutet das, dass wir immer noch auf dieser Seite bleiben. Denn wenn wir auf unsere Board-Seite zurückspringen, dann haben wir hier nur Schrägstriche und wir haben keinen Schrägstrich. Und dann kann ich hier end not event dot URL schreiben . Und das ist die gesamte URL, zu der wir gehen, enthält, und wir überprüfen, ob dieser spezifische URL-Schrägstrich Boards Schrägstrich ist. Also werden wir hier tatsächlich unser Lives-Board auslösen , wenn unser Navigationsstart passiert ist. Und diese URL, die wir verwenden enthält keinen Slash-Port-Schrägstrich. Dieser Schrägbrett-Schrägstrich ist entweder unsere Einzelbindung oder unser Single-Board-Modell. Prüfen wir, ob es funktioniert. Ich klicke hier auf meine erste Aufgabe und jetzt werden wir nicht mehr links, was bedeutet, dass alles gut funktioniert. Und jetzt implementieren wir gemeinsam. Geh zum Board, denn das ist nur eine einzige Zeile, die ich machen möchte. Ich möchte in unser Aufgabenmodell einsteigen. Und hier oben haben wir dieses enge Bild. Und eigentlich können wir hier zusätzlich einfach ein Klickereignis erstellen und es nennen, an Board gehen. Jetzt können wir direkt in unser Aufgabenmodell springen und diese Methode erstellen, weiter zur Bindung. Und was müssen wir in dieser Komponente wissen , um in unser Board zu springen, müssen wir aus diesem Jahr lesen. Nun, zuallererst, unsere Aufgaben-ID, werden wir sie auf jeden Fall brauchen. Und hier am wichtigsten, Board AD, was tatsächlich bedeutet, dass wir den gleichen Code schreiben, wie wir es in unserem Konstruktor innerhalb des Boards getan haben. Also hier registrieren wir unseren Konstruktor. Und drinnen müssen wir zuallererst unseren Vorstand AT bekommen. Dafür müssen wir die Route verwenden, was eigentlich bedeutet, dass wir hier unsere Route injizieren müssen, die eine aktivierte Route ist. Und jetzt können wir hier diese Route dot snapshot, dot, params, map, dot, get schreiben . Und hier versuchen wir unsere Board-ID zu bekommen. Und wie Sie hier sehen können, werden wir jetzt belastet. diesem Grund ist es sehr sinnvoll zu überprüfen, ob wir unsere Board-ID wirklich haben. In diesem Fall können wir Board-ID und Aufgaben-AD direkt als Eigenschaft in unserer Komponente speichern . So möchte ich hier zunächst unser Board AD erstellen. Es ist eine Zeichenfolge. Und zweitens, Aufgabe Katie, es ist auch eine Zeichenfolge. Jetzt können wir hier überprüfen, okay, ein Board duplizieren. Wenn nicht, müssen wir einen Fehler auslösen. Dies ist, wo hören Sie den Fehler geworfen haben. Und hier können wir sagen, dass die Board-ID nicht von der URL abgerufen werden kann. Und jetzt müssen wir genau dasselbe für unsere Aufgaben-ID tun. Das ist so hier. Versuchen wir, AD zu beauftragen, und wir versuchen, die Aufgabe auf eine andere Route zu bringen. Und jetzt wollen wir hier noch eine Eve schreiben und hier nach Aufgabe AD suchen. Also hier können wir schreiben, können die Aufgaben-ID nicht von der URL abrufen. Aber eigentlich habe ich hier einen großen Fehler gemacht dass Sie sehen können, dass wir eine Board-ID und eine Aufgaben-ID haben, aber mit Taskade ist es völlig in Ordnung. Es ist diese Route Snapshot Params Map. Aber mit Boyd AD ist das nicht in Ordnung, da wir all diese Informationen von unseren Eltern lesen möchten . Deshalb müssen wir hier route dot parent ausprobieren, und hier müssen wir ein Fragezeichen setzen und dann Snapshot-Programme zuordnen. In diesem Fall lesen wir es direkt vom Elternteil. Und jetzt, nach diesen beiden Prüfungen, können wir einfach diese Aufgabe AD zuweisen, und das ist jetzt eine Zeichenfolge, und hier haben wir auch diese Board-ID und sie ist auch eine Zeichenfolge. Jetzt können wir hier die Go-to-Board-Methode implementieren, aber für diesen Mutterleib muss hier injiziert werden. Sie außerdem an, Ihre Route zu ändern. Also hier haben wir unseren Router. Und jetzt können wir innerhalb dieser Methode einfach diese Route schreiben und wie zuvor navigieren. Und hier wollen wir an Bord gehen. Und als zweiter Parameter ist es dieses Board. In diesem Fall wird die URL hier Schrägstriche sein , Schrägstrich-Board-ID. Schauen wir uns das an. Ich lade die Seite hier neu. Ich bin in der Aufgabe und hier klicke ich auf Cross. Und nachdem sie geklickt haben, wo sie direkt einen Einblick-Slash-Vorwärts-Slash-ID springen. Und vor allem hatten wir keine Seite neu geladen. Wir müssen für diesen Teil keine Daten abrufen , da die gesamten Daten vorhanden sind. Und jetzt können wir einfach die zweite Aufgabe öffnen, sie schließen, und sie ist wirklich reibungslos und schnell, da wir hier keine zusätzlichen Informationen abrufen müssen. 44. Erhalte Aufgaben und Spalten: In diesem Video-Coupon können Sie über Datenströme innerhalb unseres Aufgabenmodells sprechen . Hier wird es wirklich interessant sein. Warum ist das so? Da sie tatsächlich bereits die gesamten Daten für jedes einzelne Modell in unserem Board hatten , müssen wir nur diese Daten verwenden und sie innerhalb des Aufgabenmodells korrekt zuordnen. Hier ist das erste, was ich tun möchte , hier unseren Board-Service, den wir bereits haben , und nicht den Board-Service, um nicht mit dem Kuchen zu arbeiten, sondern unseren Board-Service mit dem Staat. Jetzt möchte ich zunächst die Aufgabe finden. Und tatsächlich können wir hier zum Beispiel nach dieser Board-ID im Konstruktor einfach schreiben, nach dieser Board-ID im Konstruktor einfach schreiben, dass diese Aufgabe größer war und es wird unser Stream der aktuellen Aufgabe sein, die wir geöffnet haben. Und hier können wir diesen Sportdienst eigentlich einfach ausprobieren. Und hier haben wir unseren Stream mit allen Aufgaben unseres Vorstands. Und wie Sie sehen, ist es bereits verfügbar, aber wir benötigen nicht die gesamte Palette unserer Aufgaben. Auf diese Weise möchte Boop map verwenden. Hier können wir per Map schreiben und dann angeben, wo wir Zugriff auf all unsere Aufgaben erhalten. Und jetzt müssen wir nur noch eine spezifische Aufgabe finden , die wir für dieses Aufgabenmodell benötigen. Also hier möchte ich einfach Aufgaben finden, und hier drinnen bekommen wir Zugriff auf jede einzelne Aufgabe. Und hier bekommen wir einfach diese Aufgabe von AD und wir vergleichen sie mit dieser Aufgabe AD , die hier oben im Konstruktor ist. Was das eigentlich macht, es verändert unsere Stream-Board-Serviceaufgaben. Und hier ordnen wir nur die einzelne Aufgabe zu und hier holen wir sie zurück. Aber es ist nicht alles nach Map. Ich möchte Filter schreiben und hier drinnen möchte ich einen booleschen Wert angeben. Warum machen wir das? Denn tatsächlich kann es vorkommen, dass am Anfang keine Aufgabe hat, weil wir hier nicht alle diese Aufgaben abgerufen haben , was eigentlich bedeutet, wo in den Konstruktor in unserem Model, das ist unser Stream. Tasks ist einfach ein leeres Array. Hier haben wir versucht, es zu finden und wir können es nicht und wir bekommen ein undefiniertes, aber undefiniert interessiert es nicht schnell. Hier habe ich Filter Boolean geschrieben und es wird einfach jedes undefinierte los. In diesem Fall wird dieser Stream erst erfüllt, wenn wir eine Aufgabe gefunden haben. Versuchen wir nun, dieses Trimm in unserem HTML zu verwenden. Hier oben müssen wir ein Inline-Formular erstellen, den aktualisierten Titel unserer Aufgabe. Und wir können hier einfach unser Inline-Formular schreiben , das bereits hunderte Male verwendet wurde. Und dann zuerst müssen wir eine Klasse festlegen, und hier haben wir das Aufgabenmodell hinzugefügt Titelforum. Danach möchten wir unseren Standardtext festlegen. Und eigentlich müssen wir hier den Titel der Aufgabe angeben. Aber auch hier möchte ich es noch besser schreiben. Wir könnten diesen Stream in unserem HTML verwenden. Aber wie ich bereits zuvor gesprochen habe, können wir verschiedene Datenströme innerhalb einer einzigen Eigenschaft kombinieren , und genau das können wir jetzt hier tun, wir können schreiben diese Daten größer waren und wir hier verwenden können kombinierte neueste, genau wie wir früher und tatsächlich später verwendet haben, werden wir hier nicht nur eine Aufgabe haben, zumindest müssen wir auch hier eine Liste unserer Spalten bekommen, weil wir tatsächlich eine Auswahl haben ändere die Spalte , in der sich diese Aufgabe befindet. Das ist so hier. Zunächst werden wir diese Aufgabe und später zusätzlich Schüler hier haben , Stream für die Kolumnen. Und hier müssen wir all diese Daten per Pipe Map zuordnen und wir wollen unser Array in das Objekt konvertieren. Hier. Zuallererst werden wir unsere Aufgabe bekommen. Hier. Wir müssen nur eine Aufgabe zurückgeben. Jetzt müssen wir diese Daten in dieser Komponente erstellen, auf diese Weise hier oben. Zuallererst müssen wir den Aufgabendollar in beobachtbar ändern. Und hier bekommen wir unsere Task-Oberfläche und jetzt nie, weil wir sie mit Filter überprüft haben. Und jetzt brauchen wir hier auch Daten, die wir gestohlen haben. Und hier werden wir auch ein Observable des Objekts haben. Und hier haben wir unsere Aufgabe, die eine Task-Oberfläche ist. Jetzt sind die Daten bereit, tatsächlich innerhalb des HTML, wir können diese Daten direkt verwenden. Hier in unserem Top-Div werde ich es einfach versuchen. Und G, hier haben wir unseren Stream mit Daten als, und hier bekommen wir Daten, was eigentlich bedeutet, dass wir jetzt in der gesamten Datei einfach Daten verwenden können. Dies ist hier innerhalb des Standardtextes, wir können Datenpunktaufgabe, Punkttitel bereitstellen. Und danach müssen wir einen Titel innerhalb des Formulars angeben, es wird auch der Punkttitel der Datenaufgabe sein. Und wie Sie sehen können, haben wir hier keine Streams, aber tatsächlich haben wir hier innerhalb von data einen Aufgaben-Stream erstellt, dem es sich um eine Zeichenfolge handelt, die auf unserem Stream basiert und in dem wir eine Reihe von Aufgaben haben. Und das Letzte ist eine Ausgabe hier und hier haben wir unser Handle submit, zum Beispiel den Namen der Aktualisierungsaufgabe. Und hier drinnen, wo man eine Veranstaltung bekommt. Und sie wollen nur diese Funktion in unserer Komponente erstellen . Ich werde hier nichts umsetzen. Also hier bekommen wir den Namen unserer Aufgabe. Welches ist ein String, zurück ist nichtig. Und jetzt möchte ich nur noch hier ein Konsolenprotokoll schreiben. Dies ist der Name der Aktualisierungsaufgabe, und hier erhalten wir unseren Aufgabennamen. Schauen wir mal, ob es überhaupt funktioniert. Wir haben hier keine Fehler und sie werden die Seite einfach neu laden. Und wie Sie direkt hier sehen können, bekommen wir meine erste Aufgabe. Wie funktioniert das? Hier erstellen wir unsere Stream-Aufgabe, die auf unseren Aufgaben basiert und tatsächlich viel nach Seiten sucht , wenn kein Fehler auftritt. Und wir könnten es möglicherweise bekommen. Eigentlich nicht, weil wir hier in GE mit Chegg haben, aber es ist immer schön Filter Boolean zu schreiben , nur um zu wissen, dass wir auf der sicheren Seite sind. Und hier bekommen wir unsere erste Aufgabe in diesem Datenstrom. Hier können wir das direkt ändern, meine erste Aufgabe und aktualisiert. Und wie Sie sehen können, ist dies unser Konsolenlog. Natürlich haben wir noch kein Update implementiert, aber wir sind auf dem richtigen Weg. Jetzt. Wir können genau den gleichen Code mit unserer Inline-Formularbeschreibung schreiben. Deshalb möchte ich zurück in unser HTML springen. Hier ist unser Inland aus der Beschreibung. Und eigentlich können wir es hier einfach in der Inline-Form ausprobieren , wie wir es für den Titel getan haben. Und hier haben wir bereits die Daten im Datenstrom. Das ist so hier. Zunächst unser Klassenaufgabenmodell , Bearbeiten, Beschreibung, Formular. Und danach haben wir zunächst Standardtext. Hier werden wir es mit der Beschreibung der Datenaufgabe versuchen. Und hier möchte ich schreiben, oder weil eigentlich eine Beschreibung innerhalb der Aufgabe nicht obligatorisch ist, was bedeutet, dass es irgendwann eine leere Zeichenfolge sein wird. So fügen Sie hier eine detailliertere Beschreibung hinzu. Danach wollen wir auch unseren Titel setzen. diesem Grund wird die Beschreibung der Datenpunktaufgabe. Wir wollen auch hier im Exterieur anbieten, und dies ist unsere erste Verwendung von Textarea. Das ist so hier. Eingabetyp ist Textbereich hat auch Button-Eigenschaft muss auf true gesetzt sein. Und nach dieser Schaltfläche kann der Text auf Speichern gesetzt werden. Und wir müssen hier auch angeben, dass ich mich um die Einreichung kümmere. Nennen wir es hier, aktualisieren Sie die Aufgabenbeschreibung. Hier bekommen wir eigentlich unsere Veranstaltung. Hier müssen wir die Funktion erstellen, aber sie wird genau dieselbe sein. diesem Grund kopiere ich Einfügen, aktualisiere den Aufgabennamen und ändere einfach den Namen und das Konsolenprotokoll. Aber offensichtlich ist es kein Aufgabenname, sondern eine Aufgabenbeschreibung. Ändern wir es und das Konsolenprotokoll und prüfen, ob es funktioniert. Wie Sie hier sehen können, erhalten wir einen undefinierten Fehlertyp. Sie ist nicht dem Typ string zuweisbar . Eigentlich ist es ein gültiger Punkt von TypeScript, weil unser Inland From hier nur eine Zeichenfolge und keine undefinierte Zeichenfolge erhalten möchte . Deshalb können wir es einfach versuchen oder eine leere Zeichenfolge. Das ist völlig in Ordnung. Wie Sie jetzt sehen können , liegt kein Fehler vor. Hier bekommen wir jetzt meine Beschreibung, die eine echte Beschreibung unserer Aufgabe ist. Wir können es ändern und die Eingabetaste drücken. Und eigentlich ist das hier ein Textarea, also hilft Endo nicht. Wir müssen auf die Schaltfläche Speichern klicken. Und hier bekommen wir ein Update der Inside Console, Aufgabenbeschreibung, meine Beschreibung, was tatsächlich bedeutet, dass unsere Firma im Inland arbeitet und unser Stream auch schnell Daten liefert. Und jetzt reden wir über Kolumnen. Eigentlich ist es noch einfacher. Wir müssen einfach einsteigen, sagen wir Aufgabenmodell. Und hier brauchen wir diesen Stream für die Kolumnen aus unserem Board. Und eigentlich müssen wir hier nicht einmal zusätzliche Immobilien innerhalb der neuesten Kombination erstellen , ich kann diesen Board Service Hund einfach schreiben. Und hier haben wir eine Stream-Spalte und wir können einfach Array von Spalten hier in diese Komponente packen, und wir sind startklar. Also hier bekommen wir unsere Aufgabe. Und zweitens wollen Spalten hier innerhalb des Objektboops dieses Array von Spalten zurückgeben. Und jetzt können wir hier diese Säulen verwenden, um eine Auswahl in unserem Markov zu erstellen. Also eigentlich haben wir hier ein Formular und darin wollen wir eine Auswahl schreiben. Lass uns das jetzt machen. Zuallererst wird hier S Select sein und wir wollen hier den Namen des Formularsteuerelements schreiben , weil wir es tatsächlich von Group einbinden müssen. Warum machen wir das? Denn eigentlich ist es viel einfacher, mit reaktiven Formularen zu arbeiten, wenn man zum Beispiel einen Select hat. Das ist so hier. Erstellen wir eine Formulargruppe. Und hier wollen wir zum Beispiel ein Spaltenformular erstellen . Und hier in select können wir einfach den Namen des Formularsteuerelements packen, und es wird unsere Spalten-ID sein. Und hier müssen wir auch die Klassenspalte auswählen. Jetzt wollen wir innerhalb von select alle unsere Optionen rendern und es wird unser Array von Spalten sein. Das ist so hier, Option innerhalb von G4, wir rendern es hier mit einer Schleife durch unsere Spalten, weil wir sie in Datenpunktspalten haben und wir uns hier nicht mit Streams beschäftigen müssen. Auch hier wollen wir den Wert in G verwenden und den Wert innerhalb der R-Option angeben. Dies wird Spalte Punkt AD weil wir sie durchlaufen. Schließen wir diese Option und führen einfach das Innere jeder einzelnen Option bei title aus. Also hier werden wir einfach den Spaltenpunkttitel ausführen. Prüfen wir, ob es funktioniert. Ich springe hier und wir bekommen einen Fehler und der G-Wert ist unbekannt. Und zuallererst müssen wir unser Formular erstellen. Deshalb springen wir zurück und setzen unsere Komponente. Und hier oben müssen wir ein Formular für nur eine einzelne Eigenschaft erstellen. Also hier werde ich versuchen, dass wir unser Spaltenformular haben. Und es ist dieser FB. Und eigentlich haben wir hier nicht gespritzt, wenn p. Also lass uns das jetzt machen. Wenn B wie immer ist, nur Form Builder, und hier schreiben wir diese F B-Gruppe und innerhalb werden wir unsere Steuerelemente übergeben. Und hier haben wir nur eine Spalten-ID, brauchen aber nichts anderes. Und standardmäßig wird es so sein. Jetzt kriegen wir immer noch diese Sarah. Und tatsächlich, weil wir keine reaktiven Formen in unser Board-Modul injiziert haben. Also müssen wir zurückspringen und unser Board-Modul einstellen. Und genau hier im Modul für reaktive Eingabeformulare, wie Sie jetzt sehen können, erhalten wir einen weiteren Fehler in unserem HTML. Und hier bekommen wir Spalten, die auf dem Typ Task-Schnittstelle nicht existieren , weil wir unsere Schnittstelle nicht erweitert haben. Hier oben haben wir einen Datenstrom und hier sagen wir, dass wir nur eine Aufgabe haben und das stimmt nicht. Wir haben hier Spalten, und dies ist nur ein Array unserer Spaltenschnittstelle, wie Sie jetzt in unserer Konsole sehen können , ohne dass ein Fehler vorliegt. Also lass uns das überprüfen. Jetzt lade ich den Patienten hier neu, wir haben jetzt unsere tolle Auswahl und wir sehen keinen Wert, weil wir keinen Standardwert angegeben haben. Jetzt können wir hier diese Auswahl öffnen und zwischen verschiedenen Spalten wählen. Und wie Sie sehen können, haben wir direkt unsere Spalten, die wir im Board haben. Jetzt ist das einzige letzte, was ich implementieren möchte, Standardwert innerhalb der Auswahl festlegt, weil wir standardmäßig eine Spalte haben und diese Aufgabe in einer Spalte liegt. Und das können wir leicht machen , weil wir Streams haben. Also hier können wir einfach diese Aufgabe benutzen wurde gestohlen weil wir den Stream haben. Und hier wissen wir, dass wir unsere Aufgabe bekommen und wir können hier einfach Abonnieren schreiben und wir bekommen Zugriff auf unsere Aufgabe. Und jetzt müssen wir unser Formular aktualisieren. Hier haben wir also Zugriff auf dieses Spaltenformular, welchen Wert, und wenn Sie nicht wissen, was der Tonhöhenwert tut, Eigenschaften innerhalb des Formulars aktualisiert. Also müssen wir hier ein Objekt mit Feldern versehen. Und in unserem Fall ist das nur eine einzelne Feldspalten-ID. Im Inneren möchten wir ein Ideal für die Säule von dieser Aufgabe bieten . Es ist die Aufgaben-Punkt-Spalten-ID, was eigentlich innerhalb des Konstruktors bei der Initialisierung bedeutet , wo der Task-Stream abonniert wird. Und wenn wir unsere Aufgabe hier haben, patchen wir den Wert. Wie Sie jetzt sehen können, stattdessen Browser, wir bekommen unsere erste Spalte. Aber was mir hier nicht gefällt, wir verwenden wieder abonnieren, ohne uns abzumelden. Deshalb möchte ich genau das Gleiche tun , was wir in unserem Board getan haben. Zunächst müssen wir hier unsere Abmeldung erstellen. Und das ist ein verwendetes Thema , in dem wir im Inneren für Leere sorgen. Und jetzt wollen wir hier in G über das Zerstören erstellen. Das ist so hier, implementiert auf diesem Troja. Und irgendwo nach dem Konstruktor, den wir im Juni erstellen können, wollen die Strike und Insight zunächst diese Abmeldung als nächstes aufrufen und dann abschließen. Diese Abmeldung ist also abgeschlossen. Und danach sollten wir nicht vergessen bevor wir Write-Pipe abonnieren. Und hier dauert es, bis wir ihnen diese Abmeldungen zur Verfügung stellen, die wir gerade erstellt haben. In diesem Fall sind wir auf der sicheren Seite onDestroy dieser Komponente. Unser Abonnement wird ebenfalls zerstört. 45. Aktualisierungsaufgabe: In diesem Video müssen wir die Aktualisierung unserer Aufgabe von Anfang bis Ende implementieren . Und tatsächlich haben wir innerhalb einer Aufgabe drei verschiedene Dinge. Zunächst einmal haben wir hier ein Inline-Formular für unseren Titel, für alle implementierten. Und wir bekommen hier das Konsolenprotokoll. Eigentlich ist dies ein teilweises Update unserer Aufgabe. Wir haben genau die gleiche Logik mit Beschreibung. Hier können wir es einfach ändern und auf Speichern klicken. Aber auch hier haben wir eine Änderung unserer Kolumne und eigentlich haben wir uns überhaupt nicht darum gekümmert und wir müssen es tun. Und dies ist auch eine Aktualisierung der Aufgabe. Am wichtigsten ist, dass dies alles teilweise Updates sind , die wir für unser Back-End einhalten müssen , da wir alle unsere Kunden über diese Änderung innerhalb der Aufgabe informieren möchten , was tatsächlich bedeutet, dass unsere Logik genau das gleiche wie zuvor innerhalb eines Teils, wir emittieren etwas auf dem Client, im Backend tun wir etwas mit unserer Datenbank, zum Beispiel Webdaten-Aufgabe. Danach benachrichtigen wir alle unsere Kunden, die dieses spezielle Board abonniert haben. Und das erste , was wir tun müssen, ist ein neues Socket-Ereignis zu erstellen. Fangen wir dieses Mal mit dem Client an. Und innerhalb unserer Quell-App-Shred-Typen haben wir Socket-Events. Und eigentlich sehe ich hier Aufgaben erstellen, und jetzt brauchen wir genau das gleiche mit PS Tasks Update. Und hier haben wir wie immer Erfolg und Misserfolg. Und hier können wir den Namen in Aufgaben ändern, aktualisieren, dann Update-Erfolg und Aktualisierungsfehler. Damit unsere Veranstaltung fertig ist, muss Nobu eine neue Methode in unseren Shirts-Serviceaufgaben implementieren , da wir wie zuvor unseren Socket innerhalb dieser Methode in Share-Aufgaben verstecken wollen . Das ist so hier. Lassen Sie uns unsere Methode erstellen , die die Aufgabe aktualisiert. Hier. Zunächst erhalten wir unsere Board-ID, weil wir wissen müssen, welche Benutzer wir benachrichtigen müssen. Hier hören wir Geburtstag, diese Zeichenfolge benötigt auch eine Aufgaben-ID da wir wissen müssen, welche Aufgabe wir aktualisieren müssen. Und zu guter Letzt finden Sie hier eine Liste von Feldern. Und hier haben wir ein Objekt, bei dem alle unsere Felder nicht obligatorisch sind. Deshalb schreibe ich sie mit einem Fragezeichen, damit wir unseren Titel aktualisieren können. Es ist eine Zeichenfolge. Wir können auch unsere Beschreibung aktualisieren. Es ist auch optional und string. Und hier haben wir auch unsere Kolumne und unsere Kolumne Lady ist der Ort, an dem sich unsere Aufgabe befindet. Und hier zurück werden wir nichtig. Das einzige, was wir hier tun müssen, ist Socket Meet. diesem Grund Socket Service Summit. Und hier wollen wir unsere neue Methode verwenden, Socket-Ereignisse in m Punkt. Und wir haben hier unsere Aufgaben-Updates beginnen hier als zweiten Parameter, wir müssen ein Objekt mit all diesen Feldern bereitstellen. Zuallererst ist es ein Grenzradius, dann eine Spalten-ID und dann unser Objekt mit Feldern. Und wie Sie hier sehen können, habe ich einen Tippfehler gemacht. Es ist keine Kontinuität, sondern eine Aufgaben-ID und aufgrund von TypeScript wird direkt ein Fehler angezeigt. Jetzt können wir also zurückspringen und unsere Komponente setzen und die notwendigen Änderungen vornehmen. Und hier haben wir den Namen unserer Aktualisierungsaufgabe und die Datumsbeschreibung. In beiden Fällen möchten wir diese Update-Task-Methode aufrufen. Das ist so hier oben mit zuallererst, muss diese Tasks Service, die gerade aktualisiert wurden, injizieren. Und es ist ein Aufgabenservice. Danach können wir einfach hier diesen Task-Service schreiben, und hier ist unsere neue Methodenaktualisierungsaufgabe, und dann sagen Sie es. Zuallererst müssen wir ein Board auswählen. Bei dieser Board-ID handelt es sich hier eine Aufgabe oder haben wir hier eine Aufgaben-ID? Ja, das haben wir, wir haben es hier im Konstruktor festgelegt. Also hier können wir auch diesen Punkt schreiben macht KD, und hier haben wir unsere Felder. In diesem Fall müssen wir nur den Titel aktualisieren. diese Weise können wir hier Titel, Aufgabe, Name sagen , und wie Sie hier sehen können, eine seltsame Eigenschaftsspalten-ID fehlt eine seltsame Eigenschaftsspalten-ID im Typ, was tatsächlich bedeutet, dass ich etwas falsch gemacht habe. Und sie können das Problem bereits hier erkennen. Column Lady ist ebenfalls optional. Es darf nicht immer da sein. Hier ist hier. Sie können jetzt sehen, dass wir keinen Fehler erhalten , da alle unsere Felder undefiniert sein können. Und hier müssen wir nur einen Titel angeben. Also haben wir hier unseren Aufgabennamen aktualisiert. Jetzt kann ich diesen Code kopieren, einfügen und hier unsere Beschreibung aktualisieren. Hier werde ich nur eine Beschreibung geben, und dies ist unsere Aufgabenbeschreibung aus dem Parameter und jetzt ist der interessanteste Teil. Wir müssen mit dieser Änderung dieser Single Select umgehen. Und tatsächlich ist das eine reaktive Form, was eigentlich gut ist, weil wir auf die Veränderungen vollständig reagiert reagieren können . Was ich hier schreiben möchte, ist diese Punktsäule von Gad. Und hier können wir unsere Spalten-ID bekommen, aber eigentlich wollen wir hier auf Wertänderungen reagieren und die tatsächlichen Wertänderungen geben uns zurück und sind beobachtbar, was tatsächlich bedeutet, dass wir hier schreiben können abonnieren. Aber wie Sie hier sehen können, erhalten wir eine Warnung von TypeScript, dass dieses Feld möglicherweise jetzt sein kann, aber nicht in unserem Fall, denn in unserem Fall wird immer gesagt, dass wir hier tatsächlich sind kann diese Warnung einfach unterdrücken, indem Sie hier die Bank verwenden. In diesem Fall sagen wir TypeScript, kümmern Sie sich nicht um die Überprüfung , ob diese Eigenschaft vorhanden ist. Und wie Sie jetzt hier sehen können, sind Wertänderungen beobachtbar. Hier kann ich es jetzt einfach ausprobieren abonnieren und dann hierher kommen, was nach der Änderung in dieser Kolumne ist , was eigentlich bedeutet, iss diese Kolumne Dame, als es war aktualisiert. Und jetzt muss ich nur noch Insert Console Log schreiben. Geänderte Spalten-ID. Und hier können wir überprüfen, ob es wirklich funktioniert. Laden wir die Seite neu. Wie Sie hier in der Konsole sehen können, werde ich die Spalte D geändert, und hier ist unsere Spalten-ID. Und tatsächlich ist das ein Problem, denn was wir jetzt in diesem Abonnement tun wollen, wollen wir eine Änderung für das Backend auslösen, wie wir es hier mit der Aktualisierungsaufgabe getan haben. Aber es macht keinen Sinn, es am Anfang auszulösen , wenn wir dieselbe Spalten-ID haben, wir wollen wirklich einfach zu knifflig, wenn wir es ändern. Deshalb können wir das hier schreiben. Wir können überprüfen, ob die Spalte bedürftig ist, was geändert wurde, ist nicht dasselbe wie eine gültige Hälfte. Aber auch hier, das Problem, wir haben diese Informationen nur in unserem Aufgaben-Stream, was eigentlich bedeutet, dass wir diese beiden Streams miteinander kombinieren müssen . Deshalb können wir hier wie zuvor kombinierte Laser verwenden . Und hier können wir zunächst bereitstellen, dass diese Aufgabe größer war. Und danach, diesen Stream, den wir hier unten geschrieben haben, werde ich ihn einfach als zweiten Parameter einfügen. Und diese kombinierte neueste Version gibt uns ein Array zurück, was bedeutet, dass wir hier Zugriff auf unsere Aufgabe und danach auf unsere Spalten-ID aus dem Formular haben . Und hier kann ich jetzt beide in der Konsole protokollieren. Hier möchte ich erstens sehen, veränderte Kolumne Dame und zweitens, was wir Insider-Aufgabe haben. Und eigentlich wollen wir hier die ID der Aufgabenlosspalte überprüfen. Schauen wir uns das an. Ich lade die Seite neu und wir bekommen beide Achtziger. Und wie Sie sehen können, sind sie ähnlich, was bedeutet, dass dies genau dann der Fall ist , wenn wir nichts tun müssen. Also was wir hier schreiben wollen, wenn unsere Aufgabenspalte D nicht mit unserer Spalten-ID übereinstimmt, dann müssen wir ein Update durchführen. Hier können wir diesen Task-Service einfach schreiben genau wie wir es bei der unteren Aktualisierungsaufgabe getan haben. Und hier wurden drinnen gesorgt. Und zuerst diese Board-ID, dann Aufgabe, haben wir innerhalb der Aufgabe Punkt-ID, und hier sind unsere Felder. Innerhalb von Feldern haben wir nur unsere column-id-Eigenschaft. Wie Sie sehen können, hilft uns Erics JS wirklich dabei mit reaktiven Formularen, Streams, unseren eigenen Streams oder einem Pfad zusammenzuarbeiten , der äußerst effizient ist. Jetzt können wir diesen kommentierten Code entfernen. Wir brauchen es nicht mehr. Aber was sie hier machen wollen, möchte ich schreiben, um mich mit Abmeldungen zu befassen . In diesem Fall werden wir kein Kurzwaffenabonnement haben. Hier müssen wir gerade Rohre nehmen bis genau wie wir es hier schon getan haben. Und innerhalb dieser Abmeldungen und tatsächlich ist unser Frontend-Teil des Codes komplett fertig. Jetzt müssen wir das Standardmaterial im Backend ausprobieren, was eigentlich bedeutet, dass wir zuerst Paste-Events kopieren müssen. Dann müssen wir ein neues Abonnement für dieses Ereignis erstellen und dann eine neue Methode innerhalb des Controllers implementieren , um eine Aufgabe zu aktualisieren. Lass uns das jetzt machen. Zuallererst möchte ich in unsere Socket-Events springen und das Update von Paste-Tasks kopieren. Danach können wir innerhalb eines Serverquelltyps springen. Hier haben wir unsere Socket-Events und unten kann ich diese drei neuen Ereignisse einfügen. Jetzt können wir wieder hineinspringen oder Schwesternschaft S. Und hier unten können wir neue Socket Tonnen hinzufügen. Hier wollen wir uns unsere Socket-Events in m dot anhören. Und hier haben wir unsere Aufgaben hier aktualisiert, mit denen wir keinen Spaltencontroller aufrufen möchten, sondern einen Aufgaben-Controller. Und hier haben wir eine neue Funktion, Aktualisierungsaufgabe, und wir müssen Einblicke in Ihren Socket und Ihre Daten geben. Jetzt ist es an der Zeit, diese Aktualisierungsaufgabe zu erstellen. Und eigentlich muss ich Paste aus Spalten Update kopieren , weil es super ähnlich sein wird , wie Sie hier sehen können, haben wir Update-Spalte. Ich werde die gesamte Methode kopieren, einfügen und springen und Aufgaben sagen und sie hier unten einfügen. Jetzt ändern wir es hier. Wir haben zunächst unsere Aktualisierungsaufgabe und wir bekommen hier die Daten. Also was haben wir Insiderdaten bekommen? Es war eine Board-ID. Dann haben wir hier bei der Aufgaben-ID, und innerhalb unserer Felder haben wir drei Felder. Zuallererst ist title optional. Dann könnten wir hier eine Beschreibung bekommen. Es ist auch eine optionale Zeichenfolge. Und zuletzt ist unsere Spalte sie D, die ebenfalls optional ist. Jetzt aktualisieren wir unser Try and Catch Festival hier wir suchen nach Kolumnen Update dies ist gezeichnet, wir müssen es an unsere Aufgaben ändern. Fehler beim Update. Hier senden wir den Benutzer ist nicht autorisiert, wir müssen auch den Fehler innerhalb des Käfigs ändern. Also hier haben wir auch einen Fehler beim Aktualisieren von Aufgaben. Und jetzt müssen wir unser Modell ändern. Das Aufgabenmodell „Suche nach ID und Update“ ist völlig in Ordnung. Und hier haben wir unseren Datenpunkt und hier haben wir unsere Aufgaben-ID. Hier werfen wir einfach alle Datenfelder, die wir darin haben , und es wird nur mit dem aktualisiert, was wir bereitgestellt haben. Hier zurück erhalten wir eine aktualisierte Aufgabe und möchten diese aktualisierte Aufgabe an unseren Kunden senden. Und hier stellen wir die Datenboard-ID zur Verfügung. Das ist völlig in Ordnung und die Nachfrage hier ist der Erfolg der Aufgabenaktualisierung. Und hier drinnen stellen wir unsere aktualisierte Aufgabe zur Verfügung. Wir sind also mit unserem Back-End-Teil fertig, aber wir müssen auch auf den Kunden hören, um alle unsere Kunden über Änderungen zu informieren. Also müssen wir den Gipfel über den Kunden regeln. Und dafür muss man zurück in die Quell-App unserer Kunden gehen , Board Services, Board Service von hier, denn eigentlich müssen wir einfach eine Lektion in unsere Board-Komponenten schreiben mit don't müssen listen innerhalb des Board-Modells schreiben, weil das tatsächlich gekaufte Modell einfach unsere Streams von hier aus verwendet, was eigentlich bedeutet, dass Sie nur innerhalb unserer Board-Komponente abonnieren müssen. Hier rufen wir eine Methode auf, um eine Aufgabe in unserem Aufgaben-Stream zu aktualisieren. Deshalb möchte ich hier nur auf unsere Update-Spalte schauen , da sie unserer Update-Aufgabe sehr ähnlich sein wird . Und tatsächlich können wir es vollständig kopieren und einfügen. Also lass es uns jetzt ändern. Hier haben wir unsere Update-Aufgabe. Wir bekommen hier eine aktualisierte Aufgabe, die sich tatsächlich in der Abenddämmerung befindet. Hier müssen wir genau das Gleiche tun und nur eine einzelne Aufgabe innerhalb unseres Arrays aktualisieren. Hier bekommen wir also aktualisierte Aufgaben und hier verwenden wir unsere Stream-Aufgaben get value und wir erhalten Zugriff auf jede einzelne Aufgabe. Jetzt überprüfen wir, okay, unsere Aufgaben-ID sollte mit unserer aktualisierten Aufgaben-AD übereinstimmen. In diesem Fall müssen wir hier zurückkehren, werden diese Aufgabe verteilt und wir wollen hier nur einen Titel aktualisieren. Und eigentlich ist das nicht gültig, denn hier müssen wir hier mehr zurückgeben. Zunächst die aktualisierte Aufgabe, der Titel, aber wir müssen hier auch unsere Beschreibung aktualisieren , da es vorkommen kann, dass wir sie aktualisiert haben. Hier hören Sie die aktualisierte Aufgabenpunktbeschreibung und die letzte hier wird unsere Spalte bedürftig sein, und es ist auch eine aktualisierte Aufgabenpunktspalten-ID. Es sieht jetzt völlig in Ordnung aus. Und in anderen Fällen wir einfach unsere Aufgabe zurück. Und danach müssen wir unseren Aufgabenstream mit einigen aktualisierten Aufgaben aktualisieren, damit unsere Methode vollständig fertig ist. Jetzt müssen wir nur noch zurückgehen und unsere Komponenten Board, Board Component einstellen. Und hier müssen wir noch eine Lektion erstellen, die Vorlesung. Ich möchte hier unseren Cone Update Erfolg finden , weil es super ähnlich sein wird. Hier ist es. Ich kopiere es einfach und füge es ein. Und hier müssen wir es ändern. Zuallererst, zurück, wir bekommen unsere Task-Oberfläche und hier ist Erfolg der Aktualisierung von Socrative- und C-num-Punkt-Aufgaben. Jetzt haben wir unsere Abmeldung und zurück bekommen wir unsere aktualisierte Aufgabe. Und jetzt können wir hier einfach diese Methode, die wir gerade erstellt haben, diese Aktualisierungsaufgabe aufrufen . Und hier müssen wir unsere aktualisierte Aufgabe bereitstellen , die wir vom Backend erhalten. In diesem Fall aktualisieren wir hier mit diesem Code den Task Stream für jeden einzelnen Kunden, der unsere Seite abonniert hat. Lassen Sie uns jetzt überprüfen, ob Follow a Code hier funktioniert. Wir haben keine Fehler im Frontend, keine Fehler im Backend. Jetzt öffnen wir unsere Website und eigentlich möchte ich den Tab duplizieren, damit wir ihn mit einem anderen Kunden überprüfen können. Also hier haben wir meine erste Aufgabe geöffnet und sie wollen hier nur einen Titel aktualisieren. Schreiben wir einfach voll und drücken die Eingabetaste. Und wie Sie sehen können, wurde es direkt hier aktualisiert, hier im Board. Und auch im nächsten Schritt wurde es auch aktualisiert, was bedeutet, dass wir es erfolgreich im Backend aktualisiert haben. Wir werden die Anwaltskanzleien mit diesem Hörabonnement benachrichtigen, werden die Anwaltskanzleien mit diesem Hörabonnement benachrichtigen wo es aktualisiert wurde der Stream und jetzt alle Orte, die die Streams abonniert haben, dramatisch hinten. Das funktioniert super. Prüfen wir nun, ob wir eine Spalte ändern können. Also hier möchte ich die zweite Spalte auswählen, aktualisiert und eine Nummer. Und wie Sie direkt sehen können, ist diese Aufgabe von der ersten Spalte weg, und jetzt befindet sie sich hier in der zweiten Spalte. Es wurde in unserem Formular aktualisiert. Und hier zum nächsten Schritt Wir sehen meine erste Aufgabe, die auch in der nächsten Spalte aktualisiert wird. Was bedeutet, dass wir die Aktualisierung unserer Aufgabe erfolgreich implementiert und sie auch zwischen unseren Spalten verschoben haben. 46. Löschen von Aufgaben: In diesem Video werden wir die letzte Funktion in unserem Projekt implementieren , und dabei werden die Aufgaben gelöscht. Lass uns das jetzt machen. Zuallererst möchte ich von unserem Server hier aus starten, muss aber innerhalb unserer Quelltypen Socket-Ereignisse springen und drei neue Socket-Ereignisse erstellen. Denn eigentlich wollen wir alle anderen Kunden benachrichtigen , denen eine Aufgabe entfernt wurde. diesem Grund werden wir dies über Socket-Ereignisse tun. Hier werde ich kopieren, Aufgaben einfügen, aktualisieren, einfach in Aufgaben ändern, löschen. Und hier auf der rechten Seite können wir es in Aufgaben, Löschen, Aufgaben, Löschenerfolg und Aufgaben löschen Fehler ändern . Danach können wir in diese Prominenten und neue Socket Tonnen springen . Also hier müssen wir es Punkt nennen, und hier haben wir unsere Aufgaben löschen, was ein Standard ist. Und hier ist unser Aufgaben-Controller , in dem wir unsere Löschaufgabe aufrufen. Und jetzt möchte ich eigentlich unser Löschen der Spalte kopieren und einfügen. Es wird super ähnlich sein. Wie Sie hier oben sehen können, haben wir die Methode delete column und sie werden sie einfach kopieren und in unsere Aufgaben hier unten einfügen. Und jetzt ändern wir diese Methode. Löscht zunächst keine Spalte, sondern löscht die Aufgabe. Und was wir hier bekommen, wir langweilen uns wie immer, sie müssen alle unsere Kunden benachrichtigen. Und hier müssen wir genau die Aufgabe haben, Katie, zu wissen, was wir entfernen müssen. Und hier haben wir unseren Fehler und wir müssen hier nur Aufgaben delete failure aufrufen. Und hier in unserem Käfig können wir auch Aufgaben delete failure nennen. Jetzt können wir hier anstelle des Spaltenmodells einfach ein Aufgabenmodell verwenden dot delete one, und wir löschen einfach unsere Aufgabe nach der von uns angegebenen Aufgaben-ID . Und danach definieren wir nicht alle unsere Kunden mit diesen Socket-Aufgaben. Lösch erfolgreich hier Beckwith, muss nur einer Aufgabe ein D geben weil wir keine weiteren Informationen haben und diese Informationen ausreichen damit unser Kunde versteht, welche Aufgabe entfernt werden muss. Jetzt müssen wir mit dem Client-Pfad fortfahren und dafür müssen diese drei Socket-Ereignisse , die wir gerade erstellt haben, kopieren und einfügen . Ich werde zurück in die Quelle AB unserer Kunden gehen, gemeinsame Typen, Socket-Ereignisse. Und hier unten können wir sie hinzufügen. Und jetzt müssen wir aktualisieren oder warten, um mit Aufgaben zu arbeiten. Und was wir hier tun wollen, wir wollen eine neue Methode erstellen , die bei der Aufgabe entfernt wird. Das ist so hier. Erstellen wir eine Löschaufgabe. Und wir wissen, dass wir hier einfach eine Board-ID angeben, bei der es sich um eine Zeichenfolge handelt. Und wir brauchen hier auch unsere Aufgaben-ID, und sie ist auch eine Zeichenfolge. Und zurück kommen wir hier leer. Und jetzt können wir im Inneren einfach unsere Schaltungen Service Dot Image nennen. Hier zeigt Ihnen Event Socket Event Cinema Dot Tasks löschen Sie hier als zweiten Parameter. Wir stellen unsere Optionen zur Verfügung, die in erster Linie die AT des Vorstands und zweitens unsere Aufgaben-ID sind. Und damit ist unsere API-Methode vollständig bereit. Jetzt müssen wir in das Board-Modul und den Board-Service springen . Und eigentlich brauchen wir hier eine neue Methode, genau wie delete column, aber es wird gelöscht, und tatsächlich wird der Code super ähnlich sein weil wir hier nur eine bestimmte filtern wollen Aufgabe aus unserem Array. Hier ändern wir es, um die Aufgabe zu löschen, und hier ist ein Argument, dass wir unsere Aufgaben-AD erhalten. Hier wollen wir unseren Stream durchlaufen , der ist Task Stream get value hier wo ich Zugriff auf jede einzelne Aufgabe bekomme. Und wir vergleichen unsere Aufgabe k, d mit der Aufgaben-ID, die wir entfernen müssen. Und hier werden rückwärts aktualisierte Aufgaben. Und jetzt wollen wir hier unseren Stream aktualisieren , der unser Task Stream Reserve ist und Ihr aktualisiertes Aufgaben-Array. Deshalb haben wir erfolgreich unsere Löschaufgabe für den Board-Status erstellt . Und jetzt möchte ich diesen Kommentar auch hier entfernen. Wir brauchen es nicht mehr. Jetzt müssen wir etwas HTML erstellen, um unsere Aufgabe zu entfernen. Hier müssen wir zurückspringen und unser Komponentenaufgabenmodell sagen . Und hier am Ende unserer Aufgabenmodellkomponente HTML haben wir Aktionen, und hier haben wir ein Löschen mit einem Bild. Und tatsächlich können wir jetzt auf diesem Div einfach das Click-Ereignis hinzufügen und hier eine neue Methode aufrufen , die gelöscht wird. Erstellen wir nun diese Löschaufgabe in unserer Komponente. Hier brauchen wir nichts, wir brauchen nur diese Aufgaben-ID und diese Board-ID, und wir haben sie bereits. diesem Grund können wir hier einfach diesen Task-Service Dot Delete Task schreiben diesen Task-Service Dot Delete Task und wir stellen sie im Inneren zur Verfügung. Also hier dieser Punkt bei dieser Aufgabe KD, also haben unsere Kunden dieses Ereignis erfolgreich an das Backend ausgegeben. Backend hat unsere Aufgabe aktualisiert und alle unsere Kunden benachrichtigt. Aber eigentlich müssen wir uns mit dem Zuhören an verschiedenen Orten anmelden . Zuallererst wollen wir es hier in unserem Aufgabenmodell tun . Und zweitens müssen wir in unserem Board und tatsächlich innerhalb des Boards einfach diese Methode aufrufen, und tatsächlich innerhalb des Boards einfach diese Methode aufrufen, die wir erstellt haben Delete Task nur damit wir einen Stream aktualisiert haben. Aber was ich hier machen möchte, ich nicht, dass direkt innerhalb Löschaufgabe auf unsere Board-Seite geht. Eigentlich macht es Sinn, aber wir sind uns nicht sicher, ob wir erfolgreich bei der Aufgabe entfernt haben. Deshalb möchte ich hier keinen Code schreiben. Ich möchte zum Beispiel wirklich in unserem Konstruktor hören . Dafür müssen wir hier unseren Socket-Service injizieren. Hier hören wir den privaten Circuit-Service und wir bekommen hier unseren Socket-Service. Und jetzt können wir hier im South Constructor zum Beispiel unten zum Beispiel unten einfach diese Socket-Servicelektion schreiben. Hier, muss das bieten, indem man Rückenbelastung bekommt. Und das ist die Aufgabe , die wir entfernen. Jetzt können wir hier Socket-Ereignisse in m Punkt verwenden und wo das Abonnieren unserer Aufgaben erfolgreich gelöscht wird. Und hier möchte ich vorbeifahren, bis wir auf der sicheren Seite sind und dann Einblicke in diese Abmeldung geben. Und nach der Pipe können wir unser Abonnement nutzen und kümmern uns eigentlich überhaupt nicht um Tuskegee. Wir wollen einfach zu weit gehen und haben eine solche Methode bereits geschaffen. Das ist, wozu geht das? Wir haben diese Methode direkt hier in dieser Datei, was bedeutet, dass, wenn wir Erfolg haben und unser Modell geöffnet ist, dieser Code direkt zum Board zurückspringt , weil wir zeigen können diese gelöschte Aufgabe nicht mehr. Und jetzt möchte ich diesen Code vollständig kopieren und einfügen weil wir genau dasselbe in unser Board schreiben werden . Und wie Sie sich erinnern, schreiben wir all diese Anrufe an unseren Vorstandsservice. Hier ist es sehr sinnvoll, diesen Code hier abzuspielen. Und anstatt das an Bord zu gehen, probieren Sie es einfach hier aus, diesen Wortdienstpunkt. Und hier haben wir unsere Löschaufgabe bei der wir die Aufgaben-ID angeben. Und in diesem Fall brauchen wir hier diese Aufgabe AD, die wir vom Backend erhalten, und sie wurden tatsächlich vollständig mit dieser Funktion implementiert. Prüfen wir nun, ob es funktioniert, aber hier gibt es keine Fehler und keine Fehler im Backend. Jetzt springen wir zum Browser. Hier habe ich meine erste Aufgabe, also entfernen wir sie jetzt, wie Sie in den Aktionen sehen können, haben wir dieses Löschen und dann klicken Sie hier löschen und diese Aufgabe ist komplett weg mit sehe es nicht hier im Board, und wir sehen es nicht in der zweiten Tafel. Und tatsächlich bei Erfolg, wo erfolgreich auf Slash-Board-ID umgeleitet wurde, was bedeutet, dass wir diese Funktion, Fool Live, von Anfang bis Ende erfolgreich implementiert haben. 47. Bereitstellung: Wir haben unser Projekt erfolgreich mit der Erstellung von Trello-Klonen abgeschlossen , und jetzt müssen wir über die Bereitstellung sprechen. Und in der Regel ist die Bereitstellung keine leichte Aufgabe und viele Leute haben Fragen. Wie sollte der Spieler projizieren, wie werden wir es verwalten, welchen Service müssen wir dafür nutzen. Und das ist eigentlich ein Problem. Es gibt Hunderte verschiedener Unternehmen, bei denen Sie Geld bezahlen können und die für Ihr Projekt eingesetzt werden. Zunächst müssen Sie jedoch alle diese Unternehmen vergleichen, verstehen wie sie ihr Projekt bereitstellen, ihre Online-Tools erlernen und so weiter. Es ergibt nicht viel Sinn. Eigentlich tun all diese Tools genau das Gleiche. Sie richten Ihr Projekt auf einem echten Server in Produktion ein. Die beste Variante, um Produktion und Bereitstellung zu erlernen , besteht darin unser Projekt selbst auf unserem eigenen Server bereitzustellen. Dies ist der Kern des Einsatzes. Hier ist es sehr sinnvoll zu lernen, wie das geht. Außerdem wird es wahrscheinlich die günstigste Variante sein, wie Sie Ihr Projekt hosten können. Ja, es ist nicht kostenlos weil Sie für den Server bezahlen müssen, aber Sie bezahlen das Unternehmen nicht für die Verwaltung eines Servers und Sie zahlen nicht für einige grafische Tools die Ihnen Ihr Projekt applaudieren. Hier müssen wir in diesem Video gemeinsam einen Server mieten, ihn konfigurieren und dann unser Projekt bereitstellen. Und eigentlich, wenn Sie nicht für den Server bezahlen möchten, ist das völlig in Ordnung. Sie können Ihr Projekt einfach so lassen, wie es ist. Und überprüfen sagte das Video, wie ich es mache und eine Serverfirma, ich selbst benutze Hertz und das ist ziemlich billig und zuverlässig Server-Anbieter. Und tatsächlich können Sie jeden Anbieter wählen, den Sie mögen. Sie benötigen lediglich Zugriff auf den virtuellen privaten Server. Aber ich mag Hatsune, weil es zuverlässig und nicht so teuer ist. Wie Sie hier sehen können, können wir auf die Cloud klicken und die Preise hier unten überprüfen. Wie Sie sehen können, gibt es viele verschiedene Pakete und das Minimum ist hier für Jahre und 0,15$, was für den Monat mit 20 Terabyte, tragischen zwei Gigabyte RAM und CPU-Prozessor, ziemlich billig ist . Und tatsächlich verwende ich diesen kleinsten Server für zwei Projekte in der Produktion, aber es kommen ziemlich viele Leute. Und wenn Sie Ihren Projekt-Thriller optimieren, gut, dann sind Sie mit einem kleinen Sirup völlig in Ordnung. Deshalb werden wir in diesem Video genau den Sirup ausleihen. Jetzt besteht der erste Schritt darin, direkt in ihrem Sohn einen Kamm oder einen beliebigen Anbieter zu registrieren in ihrem Sohn einen Kamm oder einen , den Sie möchten. Ich habe hier bereits ein Konto und nach der Registrierung und Bestätigung Ihrer E-Mail werden Sie eine solche Seite sehen. Eigentlich ist dieser Dienst in Ihrem Profil leer, aber das ist mein eigener Webserver. Hier möchte ich auf Server klicken, weil sie nur für diesen Kurs einen neuen Server erstellen wollen . Also der erste hier ist der Standort, spielt keine Rolle. Wir können hier Helsinki wählen oder was auch immer Sie bevorzugen. Bildverletzung ist völlig in Ordnung. Wir müssen uns für nichts entscheiden. Hier ist Typstandard, völlig in Ordnung. Und hier, die kleinste Stufe, die für Sie ist, 0,15$. Wir müssen nichts ändern. Wir brauchen keine Volumes, Netzwerke, Firewalls, zusätzliche Funktionen, SSH-Schlüssel und hier nur einen Namen. Wir können es hier benennen, l Trailer, genau wie unser Projekt, damit wir wissen, wovon wir sprechen. Und wie Sie hier sehen können, haben Sie unseren SSH-Schlüssel nicht ausgewählt, was bedeutet, dass wir eine E-Mail mit Root-Benutzer und dem Passwort erhalten , was völlig in Ordnung ist. Ich drücke hier create und jetzt, und unser Server wird erstellt. Wie Sie sehen können, ist mein Server bereits grün und läuft. Und tatsächlich in der E-Mail habe ich meine Anmeldeinformationen erhalten, wo ich einen Root-Benutzer und das Passwort für unseren Server habe. Jetzt müssen wir in die Konsole springen und SSH schreiben. Und hier wird zunächst unser Root-Benutzer hinzufügen. Dann können wir die IP-Adresse, die wir hier haben , einfach darauf klicken und sie wird kopiert und sie müssen sie hier einfügen. Also haben wir hier SSH, root at und hier den AP-Künstler. Ich drücke die Eingabetaste und wir erhalten die Nachricht. Ich versichere Ihnen, dass Sie weitermachen möchten. Wo genau hier drin, ja. Und wenn Sie die Eingabetaste drücken, wie Sie hier sehen können , erhalten wir zunächst die Frage zu unserem Passwort. Also müssen wir ein Passwort aus der E-Mail nehmen und hier einfügen. Und danach erhalten wir viele Informationen über unseren Server. Und wir beginnen den Prozess der Änderung des Root-Passworts und tatsächlich, um das Passwort zu ändern, müssen zunächst ein aktuelles Passwort angeben. Deshalb füge ich es erneut ein und drücke die Eingabetaste. Und jetzt müssen wir ein neues Passwort für unseren Root-Benutzer angeben. Und wir tun es nur damit Kasner unser Passwort nicht kennt. Hier werde ich nur 123 zur Verfügung stellen. Und noch einmal 123. Und wie Sie sehen können, erhalten wir eine Nachricht. Sie müssen ein längeres Passwort wählen. Machen wir es 12345678. Und noch einmal, und eigentlich müssen Sie verstehen, dass Sie für das echte Produktionsprojekt ein sicheres Passwort erstellen sollten und nicht so, dies ist nur zum Testen gedacht. Wenn Sie also eine solche Ausgabe mit root bei L, Trello und Hash hier haben, bedeutet das, dass Sie erfolgreich waren, wir schauen in den Observer. Hier können wir etwas tun. An dieser Stelle möchte ich etwas Wichtiges erwähnen. Wir sprechen in diesem Kurs nicht darüber, wie man Server effizient und sicher verwaltet. Was eigentlich bedeutet, dass ich alles zeigen werde, die gesamte Bereitstellung mit unserem Root-Benutzer. Normalerweise möchten Sie in einem echten Produktionsprojekt nicht alles mit dem Root-Benutzer machen. Sie möchten einen weiteren Benutzer mit eingeschränkten Berechtigungen erstellen , der einfach ein Projekt bereitstellen kann. ist also wieder schlecht, Route in der Produktion zu verwenden, aber wenn Sie es als Ihr Lieblingsprojekt machen, ist das völlig in Ordnung. Unser nächster Schritt besteht darin, unser Projekt in den Sirup zu bringen . Und eigentlich gibt es dafür viele Möglichkeiten und ich möchte die einfachste hier nutzen. Was wir tun können, wir könnten unser Projekt einfach auf GitHub oder GitLab übertragen, was auch immer Sie bevorzugen, und dieses Projekt dann in unseren Sirup klonen. Dies ist sehr effizient, da Sie einige Änderungen an einem Projekt vornehmen können. Sie werden mit Sicherheit Ihr Projekt im Git-Repository speichern und aktualisieren , was bedeutet, dass Sie jedes Mal , wenn Sie Ihr Projekt aktualisieren möchten, einfach hier in Ihrem Konsole und sagte Sarah, du versuchst einfach, Pool zu bekommen, um dein Projekt zu poolen , und dann startest du es neu. Das ist es. Ich hoffe, du wusstest bereits nicht, wie dein Projekt einsetzen kannst , um Lab oder GitHub zu bekommen. Aber wenn Sie keine kurzen Schritte hören, verwende ich für meine eigenen Projekte lieber MATLAB, aber es ist nur meine persönliche Präferenz. Hier habe ich mich bereits in GitHub angemeldet und sie haben auf Neues Projekt erstellen geklickt. Jetzt muss ich nur noch auf Leeres Projekt erstellen klicken. Und hier können wir einen Namen schreiben. Zum Beispiel können wir unserem Projekt L-Trailer einen Namen geben, und wir müssen hier nichts ändern. Und tatsächlich werden wir in GitHub standardmäßig kostenlos privat, und das ist großartig für unsere Bedürfnisse. Jetzt müssen wir hier in unserer Projekt-URL unseren Namespace auswählen, und sie wählen den Namespace meines Benutzers aus. Jetzt klicke ich einfach hier auf Projekt erstellen und unser Projekt ist erstellt. Und hier bekommen wir einige Schritte, wie wir dieses Projekt ins Labor bringen müssen. Jetzt müssen wir in die Konsole unseres Projekts springen und gut in Not schreiben. Dies wird gut für unser Projekt initialisieren. Ich schlage hier und bekomme dann eine Nachricht , dass mein Ordner bereits ein Git-Repository ist , weil sie mein Projekt bereits in Ordnung haben, normalerweise bekommst du keine solche Nachricht, aber nur die Nachricht, dass wir erfolgreich initialisiert haben. Gut in diesem Repository Unser zweiter Schritt besteht darin, alle unsere Dateien in MATLAB bereitzustellen . Aber der wichtigste Punkt hier ist , dass wir hinzufügen müssen, um alle Knotenmodule innerhalb von Client-Knotenmodulen und Insights zu ignorieren alle Knotenmodule innerhalb von Client-Knotenmodulen Server Node-Module. Wir müssen nicht all diese Bibliotheken in das Git-Repository hochladen . diesem Grund müssen wir eine Punkt-Gitignore-Datei innerhalb des Servers erstellen . Sie haben hier Knotenmodule in diesem und auch innerhalb des Clients. Hier, wie Sie sehen können, habe ich auch Dot Gitignore, und hier haben wir viele Sachen. Es wurde automatisch von Angular erstellt , ohne dass hier etwas geändert werden muss. Hier signalisierten Knotenmodule und dies wird ignoriert, was bedeutet, dass wir eigentlich nur den Server wechseln müssen. Und hier werden wir ignoriert. Danach müssen wir hier in die Setkonsole springen, oder? Git add dot und es wird alle unsere Dateien zum Guten hinzufügen. Jetzt müssen wir unseren ersten Commit dafür erstellen, wir können versuchen, git commit am zu machen. Und hier, zum Beispiel, abgeschlossenes Projekt, wie Sie hier sehen können, bekomme ich eine Nachricht, nichts zu verpflichten, aber es sollte nicht Ihr Fall sein. In Ihrem Fall erhalten Sie hier Hunderte von Dateien, die bereits in diesem Projekt erstellt wurden. Unser letzter Schritt hier ist, dass Sie sehen können ist das Hinzufügen dieser Zeile, git remote, add origin HTTPS, und dann den vollständigen Pfad, ich werde ihn jetzt hier einfügen. Und damit haben wir get lip erfolgreich an dieses Projektarchiv gebunden. Und unser letzter Schritt hier wird dieser Git Push minus uf Origin Main sein. Und wie Sie hier sehen können, ist es in main geschrieben. Aber für mich habe ich standardmäßig einen Branch Master, was völlig in Ordnung ist. Deshalb möchte ich main in master umbenennen. Es ist gut. Drücken Sie minus uf origin, master sie hier versteckt, geben Sie ein, wie Sie hier sehen können, muss ich zunächst einen Benutzernamen meines GitHub-Benutzers angeben . Und zweitens ist das Passwort, Sie können hier sehen, dass ich eine Nachricht bekomme, dass der grundlegende Zugriff verweigert wird , was eigentlich bedeutet, dass es nicht passiert ist. Aber hier müssen wir ein persönliches Zugriffstoken mit neu hinterlegtem Repository in GitLab erstellen . Wenn du zum Beispiel GitHub verwendest, hat es vielleicht für dich funktioniert. Wenn nicht hier, können wir zu diesem Link springen Slash-Profil persönliche Zugriffstoken. Wie du siehst, habe ich es hier geöffnet und hier müssen wir nur ein Zugriffstoken erstellen, damit wir auf GitHub pushen können. Und hier kann es zum Beispiel einen sprechenden Trello-Namen erstellen. Und hier müssen wir Bereiche auswählen. Für uns. Wir müssen das richtige Repository erstellen und das Repository lesen. Das ist das Wichtigste. Ich schlage hier, erstelle Zugriffstoken, und hier kommen wir ganz oben auf unser neues Zugriffstoken. Und zum Glück müssen wir jetzt unsere Fernbedienung wegen dieses Zugriffstokens für diese Tabelle wieder ändern , oder? Guter abgelegener Ashram oder Region, die diesen Ursprung, den wir hier oben mit dieser Linie geschaffen haben, entfernen wird, und dieser wird entfernt. Jetzt möchte ich diese Zeile kopieren und so machen wir das mit dem Zugriffstoken in GitHub. Wie Sie hier sehen können, wenn Sie git remote schreiben , fügen Sie Origin HTTPS hinzu. Hier müssen wir zunächst den Namen des Zugriffstokens angeben. Deshalb haben wir hier l Trailer als unser Token erstellt. Ich werde das hier schreiben, ultra law, und jetzt haben wir hier Doppelpunkt und unser Zugriffstoken. Ich werde es auch von unserer Seite kopieren und einfügen , auf der wir es generiert haben. Und danach haben wir genau das gleiche, was wir hier oben haben. Für mich ist es https github com slash mein Spitzname slash L dot. Gut. Hier werde ich genau das Gleiche schreiben. Und dann schauen wir uns das in meinem Repository an, ich werde Trello. Wir versuchen erneut, mit git push origin master in unser Repository zu pushen, genau wie wir es zuvor getan haben. Wir schlagen hier zu. Und wie Sie sehen können, wenn Sie nicht nach unserem Benutzernamen und Passwort gefragt werden , drücken wir jetzt mit unserem Zugriffstoken. Und wie Sie sehen können, haben wir keinen Fehler. Hier. Wir bekommen, dass alles gelöst ist, und jetzt ist es uns gelungen, den Master-Branch innerhalb von Origin zu verbessern. Wie Sie jetzt hier in unserem Projekt sehen können , haben wir eine Hauptniederlassung, und hier sind alle unsere Änderungen. Wir haben hier zwei Ordner, Client und Server. Und hier drinnen können wir das gesamte Projekt sehen , das wir bauen. Und jetzt können wir unseren Code unserem Server applaudieren. Deshalb möchte ich hier wieder in unseren Server springen , den wir gerade erstellt haben. Und wie Sie sehen können, bin ich im Sirup. Also zuerst möchte ich hier ein neues Verzeichnis erstellen , das Projekte heißt. Jetzt möchte ich in dieses Verzeichnisprojekt springen und dieses Projekt hier klonen. Und tatsächlich können wir hier versuchen dasselbe Zugriffstoken zu verwenden, das wir gerade verwendet haben. Wir können einfach in die Konsole schreiben, chmod minus Version innerhalb der lokalen Konsole bekommen, nicht innerhalb des Servers. Und hier ist unsere Fernbedienung mit dieser Token-URL. Und eigentlich können wir einfach kopieren, diese URL einfügen und sie hier in Sirup verwenden . Ich möchte nur git clone schreiben und dann diese URL, die ich hier treffe. Und wie Sie sehen können, haben wir keine Berechtigungsprobleme. Und wir haben unser Projekt hier in Projekten erfolgreich geklont . Und jetzt kann ich Ls schreiben. Und wie Sie sehen können, haben wir den Folder L Trailer, was bedeutet, dass wir unser Projekt im Ausland erfolgreich auf unserem Server haben. Um fortzufahren, müssen wir nun alle Pakete auf unserem Server aktualisieren . Und dafür können wir einfach apt-get update schreiben und die Eingabetaste drücken. Wie Sie sehen können, wurden alle unsere Pakete aktualisiert und jetzt möchte ich sie installieren, zunächst in Jeans und zweitens in MongoDB. Was ist in Jinx? Dies ist unser zukünftiger Webserver , den wir für unser Projekt verwenden werden. Hier können wir EPT mit Stil und Jinx schreiben. Hier müssen wir ja drücken, um dieses Paket zu installieren. Wie Sie sehen können, wurde unser Paket erfolgreich installiert. Lassen Sie uns überprüfen, ob es hier funktioniert, wir können einfach den Service- und Jinx-Status schreiben. Und wie Sie sehen können, drücke ich die Eingabetaste und wir bekommen ziemlich viele Informationen. Zuallererst, was in Jinx und hier aktiv läuft, was eigentlich bedeutet, dass es erfolgreich installiert wurde und jetzt läuft, ist unser nächster Schritt die Installation unserer Datenbank, und es war MongoDB. Das ist so hier, apt installiere Mongo DB und wir müssen es mit ja bestätigen. Lassen Sie uns nun den Status unserer MongoDB für dieses Wochenende überprüfen , richtig, Service dann Mongo DB-Status. Und wie Sie sehen können, ist es auch aktiv und läuft, was bedeutet, dass alles in Ordnung ist. Das nächste Tool, das ich installieren möchte, heißt n. Und tatsächlich werden wir es verwenden um unsere Node-Version zu verwalten da es tatsächlich vorkommen kann, dass wir node aktualisieren wollen und es ist viel mit diesem Tool ist es einfacher, dies zu tun, insbesondere wenn Sie mehrere Projekte haben und zwischen verschiedenen Knotenversionen wechseln müssen. Hier werde ich diese Zeile in die Konsole einfügen. Es ist also curl minus l und diese URL ist Gita, dein Schrägstrich n in style bash. Ich drücke die Eingabetaste und wir erhalten eine Fehlermeldung. Deshalb müssen wir das tun. Wir müssen zuerst apt install ausführen. Und hier ist wesentlich gebaut. Ich drücke Enter und wir müssen es bestätigen. Wie Sie sehen können, ist es installiert, sodass wir versuchen können, es zu installieren. Und wieder drücke ich die Eingabetaste und setze. Habe keine Fehler. Hier. Wir können einfach ja schreiben und mit der Installation fortfahren. Wie Sie hier sehen können, ist n standardmäßig für mich installiert, wissen Sie, 16151. Und tatsächlich ist das genau derselbe Knoten , den sie lokal haben. Und sie empfehlen Ihnen immer dringend, dieselbe Node-Version auf Ihrem Produktionsserver und in der lokalen Umgebung zu verwenden. In diesem Fall vermeiden Sie Ärger und Magic Box. Und die letzten beiden, die wir installieren möchten, heißen PM2.5. Dies ist ein spezieller Manager, um unsere Knotenprozesse neu zu starten , und wir werden ihn verwenden, um unsere angekündigten zu starten. Hier können wir npm install minus g schreiben, was global VM2 bedeutet. Und wie Sie hier sehen können, erhalten wir einen Fehlerbefehl npm not found, und dasselbe gilt für command node not found. Wenn ich genau hier bin, Knoten minus Version. Und tatsächlich nach der Installation von n, sowohl im Inland als auch beim Erhalten von Node und NPM. Aber wir müssen unser Terminal neu starten. Wir müssen also die Verbindung zum Server trennen und erneut eine Verbindung herstellen , um bekannte Chancen in den Pfad zu bringen. Hier können wir einfach exit schreiben und dann wieder SSH-Root und unsere IP-Adresse verwenden. Keaton hier Geben Sie ein und wir müssen unser neues Passwort angeben. Und wie Sie hier sehen können, bin ich drin und jetzt kann ich Knoten minus Mode schreiben und dann die Version des Knotens bekommen und das gleiche mit NPM minus Version, was eigentlich bedeutet, dass wir jetzt TM2 installieren können wieder mit npm installiere global VM2. Jetzt haben wir keinen Fehler und unser PM two wird installiert. Jetzt müssen wir alle unsere Pakete für den Client und den Server installieren . Und dafür muss ich wieder in den Projekte-Ordner springen. Und wie Sie sehen können, habe ich unser Ultra-Lab-Projekt. Wie Sie hier sehen können, bin ich im Trailer und sie haben Client und Server. Zuallererst möchte ich springen und Server sagen. Und hier haben wir viele Dateien, so dass wir einfach schreiben und bezahlen können und es werden alle Abhängigkeiten für unseren Server installiert. Wie Sie sehen können, ist jetzt alles installiert wir müssen in unseren Client einsteigen. Also schreibe ich CD-Client und nach dieser npm-Installation wieder, und wir werden alle unsere Front-End-Pakete für Angular installieren . Also wurden alle unsere Pakete erfolgreich installiert und jetzt müssen wir eine Konfiguration für nginx für unser Projekt erstellen. Und dafür können wir cd slash UTC und jinx Cohens d. Und hier drinnen müssen wir eine neue Datei erstellen. Und dafür können wir Tij schreiben und dann L Trailer dot com.com. Und um die Datei zu öffnen und zu bearbeiten, müssen wir einen Editor von der Konsole verwenden. Und ich werde hier nano schreiben und dann den Namen unserer Datei, die der alte Trailer ist, ruhig, ruhig. Ich schlage hier zu und so sieht dieser Editor aus. Also hier können wir einfach etwas tippen und dann später sicher sein. Und eigentlich möchte ich hier schon den Konflikt einfügen , oft jinx den zuvor vorbereiteten Typ, und so sieht es aus. Also hier haben wir einen Server-Blog. Jetzt haben wir AT gehört, was ein Standard-AT-Teil ist. Und hier liegt unsere Wurzel des Frontends. Hier sind Schrägstrich-Projekte bei denen es bereits erstellt wurde. Hier ist der Ordner stark. Es ist eigentlich ein extrem niedriger Ordner, den wir gerade erstellt haben. Dann slash client slash und slash app. Und eigentlich müssen wir auch später unseren Client bauen , nachdem wir Pakete installiert haben. Also wird unser Typskript in JavaScript konvertiert und es befindet sich hier in diesem Ordner, in der Slash-App. Deshalb ist es jetzt völlig in Ordnung. Hier lösen wir unsere index.HTML auf und hier ist der Servername, der Nachname ist wirklich wichtig weil das eigentlich unsere Domain ist. Das sind L.com und www L Trello.com. Und eigentlich haben wir überhaupt keine Domain. Und das ist völlig in Ordnung, weil wir in unserer lokalen Maschine, in der Host-Datei, einfach eine APR-Adresse des Servers schreiben können in der Host-Datei, einfach . In diesem Fall müssen wir uns nicht mit der Strategie beschäftigen, sobald es sich um eine echte Domain handelt, und sie wird genau wie bei der Domain funktionieren. Danach haben wir einen Standort. Also versuchen wir immer unsere index.HTML zu laden. Und hier haben wir Location Slash API. Und eigentlich ist das wichtig, denn hier sagen wir: Okay, wenn wir Champion in L Trello.com Slash API sind, müssen wir unsere Anfrage an diesen Webserver und diesen Webserver wir verwenden werden, weiterleiten in unserem Backend. Dies ist ein lokaler Host für die 1001-Slash-API. Danach haben wir genau das Gleiche, aber für Socket-IO-Anfragen. Und hier haben wir http localhost 4.001, und hier haben wir einige Header. Und eigentlich ist das die ganze Konfiguration , die wir für In Jinx benötigen. Jetzt stellt sich die Frage, wie wir diese Datei speichern können? Und dafür wollen wir zunächst auf Control O klicken. Und hier unten sehen wir den Dateinamen, um ys l Trello com conf zu schreiben, wo einfach die Eingabetaste gedrückt wird. Und das ist völlig in Ordnung. Es wurde gerettet. Jetzt möchte ich hier auf Control X klicken, und jetzt sind wir draußen, wir sind wieder in unserer Konsole. Und jetzt, wenn du überprüfen musst , ob alles erfolgreich gespeichert wurde, kannst du cat schreiben und dann werde ich Trello, ich drücke Enter und wir bekommen in der Konsole diese nette Ausgabe mit dem Inhalt unserer Datei, aber es ist nicht alles, was auch einen Benutzer innerhalb der Gene-Konfiguration ändern muss . Das ist so hier. Ich möchte aus diesem Ordner hier raus ich möchte nochmal nano schreiben, aber in unserem Fall wird es jetzt in jinx.com sein. Und eigentlich ist das die Standardkonfiguration, oft Jinx. Und hier wollen wir nur eine einzige Zeile ändern. Hier oben haben wir Benutzerdaten und wir möchten sie in die Benutzerroute ändern , mit der wir hier eingesperrt sind, und wir müssen diese Datei erneut speichern. Also Control O Enter, dann Control X. Jetzt müssen wir In Jinx neu starten , um die Konfiguration anzuwenden , die wir gemacht haben. diesem Grund können wir Service schreiben und jinx neu starten. Ich drücke die Eingabetaste und wir haben keine Fehler. Und jetzt sollten wir nicht vergessen, unsere Front zu bauen. Und aus diesem Grund müssen wir wieder in Slash-Route-Slash-Projekte einsteigen . Und hier ist unser L-Trailer und Kunde. Und tatsächlich sind wir innerhalb des Kunden. Und um unser Angular-Projekt zu erstellen, können wir einfach npm, run build ausführen. Und wie Sie hier sehen können, rufen wir GI Bill auf, das der Befehl von Angular ist, und es wird für uns das gesamte Projekt in diesem Ordner erstellen , wie Sie hier sehen können, nach dem Bau Ich erhalte ziemlich viele Fehler in der Konsole. Und tatsächlich ist das Hauptproblem , dass es sich um einen Produktions-Build handelt und die Gehaltsabrechnung nicht auf dem Typ production Boolean existiert , was eigentlich bedeutet, dass wir unsere Umgebungen nicht aktualisiert haben, Config in unserem Projekt. Hier ist es echt und schön, dass wir jetzt gute Dinge haben, damit wir schnell Anpassungen vornehmen können. Hier möchte ich wieder in unser Projekt einsteigen und wir interessieren uns für unsere Kunden-Teilequellumgebungen. Hier haben wir zwei Akten. Umwelt, ja. Und auf der rechten Seite werde ich die Umweltproteste eröffnen. Hier. Wie Sie links sehen können, haben wir die API-URL und die Socket-URL bereitgestellt, aber wir haben sie nicht auf der rechten Seite bereitgestellt. Und eigentlich werde ich sie hier einfach von links nach rechts kopieren . Jetzt haben wir diese Eigenschaften in unserer Konfiguration. Nach dieser Wunde müssen diese Änderungen an den gut für Behinderten Sprung im lokalen Projekt eingesetzt werden, richtig? Git add dot, es werden nur alle Dateien lokal und nach diesem Commit hinzugefügt . Also git commit minus m und zum Beispiel aktualisierte Umgebung. Ich schlage hier ein, gib unsere pendelnden sie ein. Danach können wir einfach git push origin master schreiben und Enter drücken. Und unsere Änderungen sind bereits in GitHub oder GitLab enthalten. Danach können wir wieder in unseren Server springen , der eingegeben wurde. Und hier möchte ich den Kunden verlassen. Und hier bin ich in unserer kleinen Trailermappe. Jetzt habe ich gerade Git Pool ausprobiert und wir bringen unsere Änderungen mit, wie Sie hier sehen können, Umweltprotease in unserem Server. Und danach müssen wir erneut versuchen, build auszuführen, und es ist npm run build, aber wir sollten nicht vergessen, dass wir in den Client springen müssen, wie Sie sehen können, keine solche Datei oder ein solches Verzeichnispaket, Jason, weil ich nicht im Kunden bin. Also der Client und hier npm run build. Wie Sie sehen können, liegen keine Fehler vor und wir erhalten eine Meldung, dass alles abgeschlossen wurde. Und eigentlich müssen wir hier überprüfen was wir in unserem dist Ordner haben. Also ist es gesunken. Und wie Sie hier sehen können, haben wir alle Trailer und in Trello all diese Dateien. Zuallererst unsere index.HTML und dann unsere Assets, Manager und so weiter. Aber eigentlich bedeutet das, dass wir ein kleines Problem in unserer Konfiguration haben ein kleines Problem in unserer Konfiguration und jinx, weil unser Stammordner, diese Slash-App, gerollt wurde . Und in unserem Fall haben wir hier einen verringerten Schrägstrich, ich werde Trello, was eigentlich bedeutet, dass wir ihn jetzt aktualisieren müssen. Also müssen wir Nano Slash, ETC ausprobieren. Und jinx Cohens d. Und hier haben wir unsere L Trello Comic-Con. Ich drücke die Eingabetaste und öffnete erneut unsere Konfiguration. Und hier innerhalb der Route müssen wir diesen Schrägstrich l Trello versuchen. Jetzt drücke ich Control O, Enter Control Leaks und wir müssen neu starten und jinx, also starten Service und Jinx neu. Jetzt ist unser Frontend komplett fertig und wir müssen einfach unser Backend ausführen und wir müssen nicht irgendwie unser Fronted starten , weil in Jinx es schnell geht. Aber für den Anfang wird es nicht so sein, weil tatsächlich in unserem Frontend nur statische Dateien wie HTML, JavaScript und CSS vorhanden sind. Aber in unserem Backend haben wir unser Observable. Deshalb möchte ich in unser Backend springen. Also hier CD-Server, und hier müssen wir unseren Server mit PM2.5 starten. Aber eigentlich haben wir hier auch ein Problem in unserem Server. Wir haben TypeScript ohne JavaScript-Dateien und tatsächlich muss womb unser gesamtes TypeScript in JavaScript konvertieren , bevor wir es ohne PM2.5 ausführen können. Und eigentlich muss man dafür in deinem Befehl erstellen. diesem Grund müssen wir wieder in unser Projekt einsteigen und in das Serverpaket Jason gehen. Und hier haben wir ein Skript für Start, aber wir haben kein Skript für Build. Deshalb können wir hier einfach build schreiben und hier wird das Skript TAC sein. Was ist TAC? Eigentlich ist es ein TypeScript und es wird einfach den gesamten Code, den wir in diesem Projekt haben, mit dieser TS-Konfiguration übertragen den gesamten Code, den wir in diesem Projekt haben . Wie Sie hier sehen können, ist die Ausgabe, es ist dist-Ordner. Das ist schnell völlig in Ordnung. Aber nachdem wir das gemacht haben, ändert sich das. Wir müssen in die Set-Konsole springen und genau das Gleiche noch einmal machen, zuerst bekommen wir head, dann git commit und dann git push. Mit diesen Befehlen bringen wir unsere Änderungen in den Get Wrapper. Jetzt springen wir zurück statt einer Umfrage. Hier gehen wir aus und ich ziehe mein Projekt wieder durch. Also sind wir jetzt startklar, wir können zurückspringen und sagen, oh, Serverordner. Und hier können wir versuchen, unser Backend aufzubauen. Hier kann ich einfach npm run build schreiben, und es wird mein Typskript in mein JavaScript übertragen. Wie Sie hier sehen können, ist es geschafft. Jetzt können wir es einfach mit weniger Abstand versuchen und überprüfen, was wir haben. Und wie Sie hier sehen können, sehen wir alle unsere Dateien, die erstellt wurden, aber mit js Erweiterung, was eigentlich bedeutet, dass das völlig in Ordnung ist und wir müssen dist slash server.js starten und es wird starte unser Projekt. Wir wollen PM2.5 verwenden. Hier können wir einfach PM in den Weltraum laufen lassen , Start Space. Hier wird die Schrägstrichsuche verringert. Ja, ich drücke die Eingabetaste und wir bekommen eine Menge Output. Wie Sie hier sehen können, ist dies die gesamte Ausgabe von PM zwei. Es spielt keine Rolle, aber hier unten sehen wir, wie PM zum Dämon spawnen. Es wurde erfolgreich dämonisiert und wir beginnen mit diesen Überspannungen im 4K-Modus, und es ist fertig und hier ist unser Server. Und warum wir hier P M2 verwenden, nicht nur den Prozess notieren wir könnten hier Knoten schreiben und dann zum Beispiel den Surge, ja, das ist völlig in Ordnung. Aber pm tubule, zuallererst, Risiken beginnen für uns, diesen Webserver, wenn er aus irgendeinem Grund kaputt ist. Zweitens ist PM two besser für die Produktionsanwendungen geeignet. Was wir hier gemacht haben, haben wir erstens unseren Kunden erfolgreich aufgebaut und zweitens haben wir unser Backend gestartet. Und der letzte Schritt, den wir tun möchten, ist einen Browser zu öffnen. Aber wir können einfach einen Browser öffnen , weil wir auf unsere Domain L Trello.com verweisen müssen , die nicht existiert. Wir haben es nicht von unserem lokalen Computer auf unseren Server gekauft. Und eigentlich muss ich hier lokal in die Konsole springen. Und öffnen Sie die Host-Datei, zum Beispiel in Linux und MacOS, es ist Zeile in Schrägstrich, ETC Slash-Hosts. Also hier, wie es für mich aussieht, wenn du unter Windows bist, hier ist dein Pfad, es ist Disk C, Windows-System, also die beiden Treiber, ETC, Host und du öffnest diese Datei und das ist genau wie meine Akte hier. Und wie Sie hier sehen können, habe ich dieses Projekt bereits getestet. Deshalb habe ich diese Zeile. Also hier habe ich eine Domain, L Trello.com. Das ist es, was wir registriert haben, aber das ist die alte API-Adresse. Ich brauche es nicht. Ich muss zurück in meine Kopf-SNA springen und diese Domain kopieren und sie einfach hier einfügen, was eigentlich auf unserem lokalen Computer bedeutet , wenn wir in die extrem niedrige Dosis springen , wenn nicht in der DNS-Nachschlagetabelle suchen, zeigen wir nur auf unsere IP-Adresse des Servers. Jetzt der Moment der Wahrheit Öffnen wir unser Projekt. Ich schreibe im Browser L Trello.com. Und das, Sie können sehen, das ist unser Projekt. Es funktioniert. Und eigentlich möchte ich hier die Konsole öffnen , damit wir überprüfen können, ob wir einige Fehler haben. Und tatsächlich haben wir hier einen engen lokalen Host für 1001 Slushy Ice Lift-Benutzer vom Ursprung, ich werde Trello und tatsächlich, wie Sie sehen können, Netzwerk, das ist unsere Anfrage an API. Dies ist http localhost 4.001 slushy Paare plus Benutzer. Und das ist offensichtlich stark. Das müssen wir nicht nutzen. diesem Grund müssen wir wieder in unser Projekt einsteigen und lokal in den Kunden gehen und es ändern. Hier ist also der Protest unserer Kunden zu Quelle, Umwelt und Umwelt. Hier. Offensichtlich existiert dieser lokale Host nicht. Was wir jetzt hier haben, ist eine CTP L Trello.com Slash-API und dasselbe hier, http L Trello.com. Und dann müssen wir hier keinen Port bereitstellen. Und jetzt müssen wir diese Änderungen erneut begehen. Deshalb fügt git git commit hinzu und dann git push. Jetzt wollen wir zu unserem Server springen, rausgehen und Trello-Ordner sagen und richtig, holen Sie sich ***. Aber danach müssen wir unseren Kunden wieder aufbauen, weil wir unseren Kunden geändert haben. Und um das zu tun, können wir c, d client schreiben. Und jetzt wieder, npm run build und es werden einfach schnelle statische Dateien für das Frontend generiert, unser Projekt ist erfolgreich gebaut. Ich lade die Seite hier neu und wir haben keinen Fehler. Wir haben hier für 01, für HTTP L Trailer com Slash APIs Slash-Benutzer. Das ist völlig in Ordnung. Wir sind nicht eingesperrt. Versuchen wir nun, den Benutzer zu registrieren. Also hier schreibe ich f2 auf gmail.com. Hier ist unser Benutzername und Passwort 123 hier versteckt registrieren. Und tatsächlich hat es funktioniert. Und das ist wichtig zu überprüfen da es bedeutet, dass wir MongoDB hier erfolgreich konfiguriert haben, da diese Post-Anfrage in die API geht und dies unsere Antwort ist. Und hier bekommen wir das A d des gespeicherten Benutzers zurück und hier das Token. Unser Backend und DPI funktionieren also auch. Jetzt haben wir hier ein Board und hier erstelle ich mein erstes Board. Drücken wir die Eingabetaste und wir holen unser Board, wir können es öffnen. Und hier sind wir im Vorstand. Lassen Sie uns nun überprüfen, ob unser Socket IO dafür funktioniert. Ich möchte das hier duplizieren und versuchen, eine Liste zu erstellen. Also hier zum Beispiel die erste Liste, ich treffe zumindest hier, und wir bekommen die Liste. Und auch im nächsten Schritt erhalten wir genau die gleiche Liste. Jetzt können wir hier in der zweiten Amtszeit eine neue Karte erstellen. Zum Beispiel die erste Karte, ich schlage hier, füge hinzu und wir bekommen diese Karte auf beiden Seiten. Jetzt können wir hier unser Modell öffnen und es funktioniert wie beabsichtigt, was bedeutet, dass wir unser Projekt erfolgreich in der Produktion eingesetzt haben. Es war nicht einfach, aber das ist ein Muss für jedes Projekt, das Sie bereitstellen können. Es spielt keine Rolle, welche eckige Ansicht reagiert. Jeder Client, den Sie wollen, einfaches JavaScript oder irgendein Backend, es wird immer sehr ähnlich sein. 48. Hausaufgaben: Herzlichen Glückwunsch, du hast diesen Kurs erfolgreich abgeschlossen und ich finde dich wirklich großartig und du hast ziemlich viel gelernt. Jetzt haben Sie sicher gelernt , wie Sie Ihr Full-Stack-Projekt mit Node.JS im Backend erstellen und als Service ausdrücken. Außerdem können Sie Socket IO auf jeden Fall problemlos verwenden , da wir es auf dem Client ziemlich häufig verwendet haben. Du hast wieder viel Erfahrung in Bezug auf n cooleres TypeScript, tolle und Schnittstellen und das Erstellen eines guten reaktiven Zustands. Aber offensichtlich ist es nicht das Ende. Als guter Lehrer muss ich dir Hausaufgaben machen, denn wenn du deine Fähigkeiten als Entwickler verbessern willst , musst du lernen und deine eigenen Projekte erstellen. Und hier haben Sie zwei Möglichkeiten. Sie können Ihr eigenes Projekt von Grund auf neu erstellen. Das empfehle ich wirklich, oder Sie können Funktionen in diesem Projekt implementieren. Und tatsächlich haben beide Möglichkeiten Vorteile . Wenn Sie dieses Projekt weiter umsetzen, haben Sie bereits eine wirklich gute Architektur und es wird für Sie viel einfacher. Und tatsächlich ist die Menge an Funktionen, die Sie in diesem Projekt implementieren können , wirklich enorm. Zunächst können Sie hier verschiedene Rollen implementieren. Zum Beispiel Admin-Benutzer , die beispielsweise Teams erstellen können, was eigentlich bedeutet, dass Sie anfangen, Personen innerhalb von Teams zu organisieren, genau wie im echten Trello auch zum Beispiel auf der Frontend können Sie Drag & Drop für Aufgaben innerhalb des Boards implementieren . Die einfachste Variante für Sie wäre, die offizielle Trailer-Anwendung zu öffnen und sich nur die Funktionen anzusehen und einfach etwas zu implementieren , das für Sie interessant ist. Und das ist wirklich sehr wichtig und hängt mit Ihrem eigenen Projekt zusammen. Wenn Sie Ihr eigenes Projekt planen, empfehle ich Ihnen dringend, etwas umzusetzen, an dem Sie wirklich interessiert sind. Denn wenn Ihr Projekt für Sie nicht interessant ist, werden Sie es nicht lange tun. Und wenn Sie nach Ideen für Ihre eigenen Projekte suchen, stören Sie viele davon. Sie können beispielsweise einen E-Commerce-Schock oder vielleicht eine Buchhandlung, einen Netflix-Klon oder eine Finanzanwendung zur Verwaltung Ihrer Ausgaben implementieren oder vielleicht eine Buchhandlung, einen Netflix-Klon . Ich hoffe wirklich, dass dir dieser Kurs gefallen hat und du viel gelernt hast und wir sehen uns in meinem nächsten Kurs.