Construire un clone Trello Fullstack : WebSocket, Socket IO | Oleksandr Kocherhin | Skillshare

Vitesse de lecture


1.0x


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

Construire un clone Trello Fullstack : WebSocket, Socket IO

teacher avatar Oleksandr Kocherhin

Regardez ce cours et des milliers d'autres

Bénéficiez d'un accès illimité à tous les cours
Suivez des cours enseignés par des leaders de l'industrie et des professionnels
Explorez divers sujets comme l'illustration, le graphisme, la photographie et bien d'autres

Regardez ce cours et des milliers d'autres

Bénéficiez d'un accès illimité à tous les cours
Suivez des cours enseignés par des leaders de l'industrie et des professionnels
Explorez divers sujets comme l'illustration, le graphisme, la photographie et bien d'autres

Leçons de ce cours

    • 1.

      Introduction

      1:25

    • 2.

      Quelles technologies utilisons-nous ?

      3:33

    • 3.

      Ressources téléchargeables

      0:40

    • 4.

      Installation de nœuds et angulaires

      8:09

    • 5.

      Configuration du serveur

      5:05

    • 6.

      Installation de la base de données

      7:27

    • 7.

      Utilisez-vous un bon éditeur ?

      2:19

    • 8.

      Mise en place d'une prise avec Express

      11:53

    • 9.

      Créer un modèle d'utilisateur de Mongoose

      22:20

    • 10.

      Ajouter l'inscription

      20:10

    • 11.

      Implémentation de login

      11:03

    • 12.

      Créer des middleware auth

      15:40

    • 13.

      Créer un module d'auth

      18:59

    • 14.

      Page d'enregistrement - Markup + Form

      12:55

    • 15.

      Page d'enregistrement - service + validation

      11:06

    • 16.

      Page de connexion

      10:00

    • 17.

      Page d'accueil

      8:13

    • 18.

      Intercepteur d'Auth

      8:05

    • 19.

      Garde d'Auth

      13:52

    • 20.

      Planches de jeux

      14:15

    • 21.

      Frontend pour les planches de jeux

      10:00

    • 22.

      Formulaire en ligne

      15:27

    • 23.

      Implémentation de la création d'un tableau

      19:19

    • 24.

      Ajout de barre et de déconnexion

      7:38

    • 25.

      Créer un module de carte

      8:58

    • 26.

      Obtenir une seule carte

      2:46

    • 27.

      Ajout de flux de cartes

      6:26

    • 28.

      Créer un service de socket

      9:55

    • 29.

      Joindre et quitter le tableau

      17:19

    • 30.

      Authentification dans socket.io

      11:27

    • 31.

      Obtenir des colonnes

      9:14

    • 32.

      Créer une colonne avec des websockets

      12:14

    • 33.

      Obtenir des colonnes

      11:36

    • 34.

      Créer un formulaire de colonne

      15:57

    • 35.

      Créer une tâche de base

      9:35

    • 36.

      Obtenir des tâches

      11:42

    • 37.

      Créer un formulaire de tâche

      8:24

    • 38.

      Mettre à jour le nom du conseil

      15:27

    • 39.

      Supprimer le tableau

      8:18

    • 40.

      Supprimer la colonne

      10:09

    • 41.

      Colonne de mise à jour

      8:54

    • 42.

      Se désabonner

      6:54

    • 43.

      Module de tâche et composant de base

      15:54

    • 44.

      Obtenir des tâches et des colonnes

      13:57

    • 45.

      Tâche de mise à jour

      14:42

    • 46.

      Supprimer la tâche

      7:30

    • 47.

      Déploiement

      31:29

    • 48.

      Exercice

      2:02

  • --
  • Niveau débutant
  • Niveau intermédiaire
  • Niveau avancé
  • Tous niveaux

Généré par la communauté

Le niveau est déterminé par l'opinion majoritaire des apprenants qui ont évalué ce cours. La recommandation de l'enseignant est affichée jusqu'à ce qu'au moins 5 réponses d'apprenants soient collectées.

135

apprenants

--

projet

À propos de ce cours

Dans ce cours, nous allons construire une API clone Trello en utilisant Angular, Typescript, NodeJS, Express, MongoDB et Socket IO . Ce cours est entièrement centré sur la plongée rapide et profonde dans la création d'applications complètes avec ces outils. Nous commencerons à partir de zéro et étape par étape, vous vous rapprocherez de l'application réelle finie. Vous comprendrez en profondeur comment structurer votre application, construire des modules et des services réutilisables et compréhensibles et partagez le code en petits morceaux de code. Nous écrirons du code ensemble de manière efficace pour le rendre pur et éviter la complexité des données. Nous ferons la communication en temps réel en implémentant WebSocket avec Socket IO.

Notre code sera écrit avec Typescript sur le backend et sur le client.

Nous will notre application sur le serveur de production réel à la fin du cours.

Pour chaque leçon, vous obtiendrez le code source de la leçon, il est donc facile de voir les progrès et d'obtenir une application de travail sur toute leçon que vous voulez.

Ce que vous apprendrez dans ce cours :

  • Structure et configuration du projet

  • Écrivez un code de haute qualité avec Typescript sur un projet réel

  • Créer des modules, des contrôleurs et des services réutilisables

  • Implémentation d'une authentification en http et dans des websockets

  • Comprendre en profondeur les motifs de conception Angulaire et express

Aucune connaissance préalable sauf le Javascript n'est nécessaire (parce que je vous enseignerai tout de base) mais si vous avez de l'expérience avec tout cela (Angular/Express/Typescript/MongoDB/Socket io) il vous sera plus facile de suivre ce cours.

Si vous vous sentez comme vous avez appris le Web mais que vous manquez encore de connaissances sur la façon de construire votre propre application réelle, ce cours est ce dont vous avez besoin.

Rencontrez votre enseignant·e

Teacher Profile Image

Oleksandr Kocherhin

Enseignant·e

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.

Voir le profil complet

Level: All Levels

Notes attribuées au cours

Les attentes sont-elles satisfaites ?
    Dépassées !
  • 0%
  • Oui
  • 0%
  • En partie
  • 0%
  • Pas vraiment
  • 0%

Pourquoi s'inscrire à Skillshare ?

Suivez des cours Skillshare Original primés

Chaque cours comprend de courtes leçons et des travaux pratiques

Votre abonnement soutient les enseignants Skillshare

Apprenez, où que vous soyez

Suivez des cours où que vous soyez avec l'application Skillshare. Suivez-les en streaming ou téléchargez-les pour les regarder dans l'avion, dans le métro ou tout autre endroit où vous aimez apprendre.

Transcription

1. Introduction: Bienvenue dans mon cours complet où nous construisons un projet ferroviaire à partir de zéro. C'est génial de vous avoir parmi nous dans ce cours, nous allons implémenter un vrai projet partir du dossier vide jusqu'à l'application de production entièrement fonctionnelle qui sera déployée sur le rail nous allons implémenter une fonctionnalité dont un projet typique a besoin, comme par exemple, l'authentification, utilisation du Pi, la gestion et la création d'un état réactif, travail avec des formulaires et bien plus encore. Dans ce cours, nous utiliserons de nombreux outils différents sur notre client. Nous utiliserons Angular, qui est la meilleure solution pour les grandes applications de production évolutives. Sur le backend, nous allons utiliser now chess a été exprimé pour créer notre API afin de stocker nos données. Nous utiliserons MongoDB, qui est une solution très populaire pour stocker des données dans votre projet. Les utilisateurs utilisent également Socket Layer pour créer des mises à jour en temps réel dans notre application. Évidemment, nous allons écrire le meilleur code possible qui sera sec, évolutif et facile à comprendre. À la fin de ce cours, vous serez en mesure de créer vos propres projets, quelle que soit leur complexité, à l'aide de ces outils. Qui suis-je ? Je m'appelle Alexander cohesion et je suis un développeur Web avec plus de dix ans d'expérience, ainsi que l' instructeur professionnel avec divers cours sur les technologies Web. J'ai fait de mon mieux pour intégrer toutes mes connaissances ce cours et ils veulent vous le dire. Bienvenue à bord, et allons-y. 2. Quelles technologies utilisons-nous ?: Dans cette vidéo, j' aimerais parler des technologies que nous utiliserons dans le cadre de ce cours. Et dès le début, je veux définir des attentes réalistes. Nous allons utiliser un grand nombre de technologies ici. Il s'agira de Angular, Node.js Express, MongoDB, TypeScript et socket IO. Et c'est un tas de choses à apprendre. Et puis ce cours, je ne t'apprendrai pas tout du début à la fin. Ce n'est tout simplement pas possible. La quantité de connaissances dans chaque outil est énorme. C'est pourquoi ce cours est ciblé. Construire un projet réel du début à la fin. Oui, vous comprendrez et apprendrez toutes ces technologies à un certain niveau. Mais ici, dans certaines technologies, vous pouvez avoir besoin compréhension de base de ce dont nous parlons. Cela étant dit, passons à la liste. Et le premier de notre liste est Angular. Si vous ne le savez pas, Angular est l'un des trois frameworks frontaux les plus populaires, et nous l'utiliserons pour créer avant et le côté de notre application. Angular est un framework très strict qui convient aux grandes entreprises. Et nous avons ce TypeScript prêt à l'emploi, ce qui signifie qu'en utilisant Angular, nous pouvons créer de plus grandes applications, les rendre plus sûres grâce aux typages et les mettre à l'échelle si nécessaire. Si vous ne connaissez pas Angular tall, je vous recommande vivement de consulter la liste des bases d'Angular, fonctionnement des composants, de la création de modules, de l'ajout de routage, etc. Après avoir compris cela, il vous sera beaucoup plus facile de sauter dans le parcours. Le prochain dans la liste, nous avons connu échecs et en fait NodeJS que nous utiliserons sur le backend avec Framework qui s' appelle Express. Et s'il ne l'exprime pas, le framework le plus populaire pour Node.js, il est super petit, il n'est pas strict, il est vraiment flexible et nous l'utiliserons comme une solution très populaire pour construire back-end. Et dans ce projet, nous devons construire non seulement un mais aussi des connexions de socket gérées. Le back-end, c'est là exprime un vrai choix sympa ici, mais ce n'est pas tout à l'intérieur exprimé par défaut, nous avons JavaScript. Bien entendu, ce n'est pas la meilleure approche. Nous voulons vraiment utiliser TypeScript car nous utiliserons TypeScript sur le client avec angular. C'est alors que le back-end avec Express. Nous voulons également utiliser TypeScript. Pourquoi est-ce que c'est ? Parce qu' en fait, TypeScript apporte à JavaScript des resserrements statiques. Cela rend notre code beaucoup plus sûr et nous voyons tous nos problèmes, pas au moment de l'exécution, mais dans le transpiler et le temps. De toute évidence, pour un projet, nous devons stocker nos données quelque part, ce qui signifie que pour notre back-end, nous avons besoin d'une base de données. Et la solution la plus populaire ici est MongoDB. C'est vraiment la base de données la plus populaire au monde où nous pouvons stocker des données et elle s'intègre parfaitement dans notre stack avec Angular sur le client et NodeJS a été exprimé sur le backend. Et le dernier point mais non le moindre de la liste est Socket IO. Nous voulons dans notre application implémenter WebSockets pour avertir les autres utilisateurs lorsque nous créons une tâche ou colonne de crédit lorsque nous changeons de pièce, tous les utilisateurs de cette partie doivent être avertis. Et la solution la plus populaire pour les WebSockets à l'intérieur du mot connu est appelée socket IO. C'est la bibliothèque qui nous aide à gérer les WebSockets sur le backend et simultanément sur le client. C'est pourquoi c'est vraiment un bon choix. Encore une fois, si vous n'êtes pas familier avec certains outils ici, c'est tout à fait correct. Nous partirons de zéro, mais nous concentrerons l'apprentissage de tous ces outils uniquement sur les besoins quotidiens. Ce qui signifie en fait que nous allons apprendre des choses de base, des choses correctes et des choses nécessaires à la mise en œuvre de ce projet ferroviaire. 3. Ressources téléchargeables: Dans cette vidéo, je voudrais vous rappeler le code source, car dans ce cours, dans chaque cours où nous codons quelque chose, vous pouvez trouver le code joint de cette conférence spécifique, qui signifie que chaque cours contient un code source. Et si vous voulez simplement récupérer le code source de la conférence, vous pouvez certainement le faire. Il suffit de grandir sous la vidéo et vérifier l'archive jointe à la vidéo. Et aussi diversement que toujours, si vous avez des problèmes avec votre code, quelque chose ne se compile pas ou si vous avez juste une question concernant la vidéo ou le cours en général, vous pouvez simplement écrire vos commentaires sur cette vidéo, et je vais certainement y répondre. 4. Installation de nœud et angulaire: Dans cette vidéo, nous allons installer NodeJS Angular sur votre machine. Comme vous pouvez le voir ici, je suis sur le site officiel, Node js.org, où vous pouvez télécharger maintenant les échecs sur votre machine. S'il n'est pas installé, vous pouvez vérifier s'il est installé sur votre machine. Si vous écrivez simplement node moins version dans votre console, si vous obtenez la version 16, c'est très bien si vous avez quelque chose de plus ancien, je vous recommande vivement de mettre à jour votre version de Node. Mais le point important, c' est que vous pouvez voir que nous avons deux versions. Tout d'abord, 16 LTS et 17 actuels. Et vous pourriez penser, d'accord, je dois installer le courant. Et ils ne peuvent pas vous recommander d' installer la version actuelle, car version de support à long terme est généralement beaucoup plus stable. C'est pourquoi pour tous mes projets, en particulier s'ils sont livrés en production, j'utilise la version du nœud LTS, ce qui signifie que si vous accédez à ce site Web et que vous voyez comme la version LTS peut avoir 17 ou 18 ans. Je vous recommande toujours de télécharger Ts et non à jour et peu importe le système d'exploitation que vous utilisez. Non, ça marche partout. Vous le téléchargez simplement ici, vous l'installez sur votre machine, puis vous vérifiez dans la console avec la version node moins qui est correctement installée Node sur votre machine. Vous pouvez également taper ici et la version Pm moins pour vérifier que npm est également disponible pour vous. Notre prochaine étape consiste à installer angular et à travailler avec then globe, nous utilisons un outil appelé Angular CLI, ce qui signifie en fait que c'est l'outil qui nous aide tout d'abord à créer un Projet Angular, puis générez différents modules ou composants et faites beaucoup de choses avec Angular. Alors, comment pouvons-nous installer Angular CLI sur votre machine, comme vous pouvez le voir ici, je suis sur le site officiel, Angular slash CLI, et voici la première étape d'installation d'angular CLI. Et nous pouvons simplement copier cette commande qui installera globalement Angular CLI sur votre machine. Et comme vous pouvez le voir pour cela, nous utilisons npm, qui aura après l'installation de chaises connues. C'est là que je peux simplement lancer des paiements tau moins g Angular CLI. Et j'installe globalement Angular CLI sur ma machine. Nous devons maintenant vérifier si notre interface de ligne de commande Angular a été correctement installée. Nous pouvons simplement l' écrire en version G moins et voici quelques informations importantes. Tout d'abord, nous pouvons voir qu' Angular CLI est la version 13, ce qui signifie en fait que nous avons installé angular 13 ici sur notre machine. Deuxièmement, il s'agit de la version de notre nœud qui est activée sur votre machine. C'est npm et c' est un système opérationnel. Et quelques versions d' Angular que vous pouvez voir ici. Si vous voyez une telle sortie, cela signifie que vous avez correctement installé Angular CLI sur votre machine. L'étape suivante consiste à générer une partie et une partie de notre application. Comme vous pouvez le voir ici, je suis à l'intérieur de lui être plié. Et ils n'ont pas créé notre projet ici, ce qui signifie que nous créons rarement tout à partir de zéro. Donc ce que je veux faire ici, je peux simplement essayer MK deal et ensuite le nom de notre projet, L Trello. Et en fait, dans ce projet, nous implémentons le clone de trailer. C'est y. Voici juste un nom avec un joli préfixe et WSSE, vous pouvez créer un dossier non pas à partir de l'interface du terminal, juste dans votre gestionnaire de fichiers. Maintenant, je veux aller dans notre dossier Ultra Law. Et ici, nous devons créer deux dossiers différents parce que nous voulons séparer notre backend de notre front-end. Et vous vous demandez peut-être pourquoi ? Et en fait pour différentes raisons. Tout d'abord, il est plus facile de séparer votre front-end et votre back-end si vous souhaitez, pour certaines raisons, les placer plus tard dans différents référentiels ou peut-être même dans différentes équipes. Deuxièmement, si nous les séparons dans différents dossiers, alors ce n'est pas un monolithe, ce qui signifie en fait que nous n' injecterons certainement pas de choses du backend dans le dossier frontal, et vice versa. Ils sont vraiment isolés et séparés comme ils doivent l'être dans l'application réelle. C'est pourquoi je souhaite créer deux dossiers. Tout d'abord, il s'agira du client, et ensuite du serveur et du client Insight. Nous aurons notre application angulaire et ensuite dit serveur. Nous aurons notre gs connu avec Express, qui sera notre application back-end. Maintenant, nous pouvons générer notre application angulaire, comme vous pouvez le voir ici dans la documentation, nous exécutons simplement dans gene hue et le nom du dossier. Ensuite, nous sautons simplement le dossier et nous démarrons notre serveur. Mais ici, nous avons un problème car nous sommes directement créés notre dossier client et nous pouvons sauter maintenant insérer le dossier client, ce qui signifie en fait que nous ne pouvons pas créer notre application angulaire avec moteur car le dossier existe déjà. Pour cela, nous pouvons utiliser une commande vraiment sympa dans gene you. Et puis ici, nous devons fournir le répertoire du nom de l' application, et voici une barre oblique, qui signifie en fait que cette commande créera pour vous dans application d'angulaire dans votre répertoire existant. Comme vous pouvez le voir ici, je suis à l'intérieur du client où nous voulons exactement générer notre application angulaire. Et ils peuvent coller cette commande ici dans le nom de l'application gene Hue, barre oblique du répertoire. Et évidemment, nous ne voulons pas nommer le nom de notre application. C'est ici que nous pouvons fournir ELL Trello, tout comme nous avons nommé notre projet d'après la même entrée cachée. Et nous avons commencé notre processus de génération d' un nouveau projet Angular. Et voici quelques questions de la part d'Angular CLI. Avons-nous besoin d'un routage angulaire ? Bien sûr, oui, c'est pourquoi je clique sur oui, ici, quelle feuille de style nous devons utiliser. Et ici je vais choisir un CSS. Ensuite, notre projet sera généré. Comme vous pouvez le voir ici, tous les paquets ont été installés avec succès, mais par la suite, nous recevons un message qui peut vous embrouiller. Ici, nous recevons le message que le maître de la branche a été créé en tant que branche git par défaut. Et ils peuvent changer le nom en nom plus tard, mais il n'y est pas encore. Et peu importe quelle branche a été générée pour vous, master ou main, elle fonctionnera dans tous les cas. Vous pouvez donc ignorer cet avertissement. Et la dernière étape que nous devons faire est démarrer notre application client. Et comme vous pouvez le voir dans la documentation, c'est dans G serve. Donc, nous insérons simplement que le client doit l'essayer et simplement servir sans rien spécifier. Comme vous pouvez le voir ici, nous obtenons une production verte. Le message indiquant que le serveur de développement angulaire en direct écoute maintenant sur l'hôte local pendant 1200. Maintenant, nous pouvons simplement ouvrir localhost 4 200. Et ici nous voyons la page angulaire par défaut et maintenant insérer la console. Notre serveur Web doit fonctionner en permanence pendant que nous développons l'application. Voyons maintenant les fichiers qui ont été générés rapidement. Comme vous pouvez le voir ici, j'ai ouvert mon éditeur, je suis dans le dossier L Trello, et nous avons ici deux dossiers, server et client et insight client. Tous ces fichiers ont été générés avec Angular CLI. Et la partie la plus intéressante pour nous est ce dossier source. Et à l'intérieur de l'AB, nous avons notre composant d'application. C'est exactement ce que nous voyons sur l'écran. Il s'agit du composant par défaut d'angular. C'est là que tout d'abord, je veux supprimer le composant d'application, SCSS, les spécifications des composants de l'application. Nous n'avons ici que ces quatre dossiers. Maintenant, nous pouvons sauter dans le HTML du composant App, et nous voulons vraiment tout supprimer sauf cette dernière ligne, la prise du routeur. C'est extrêmement important rapidement. Je vais donc tout supprimer de ce fichier et vivre ici la sécheresse de la sortie. Et en haut, nous pouvons simplement l'essayer. Bonjour Trello. Nous savons donc que cela fonctionne. Après cela, nous devons sauter à l'intérieur notre composant d'application, le modifier. Parce qu'en fait, nous utilisons URL de style du fichier, ce qui modifiera les URL supprimées. C'est là que nous pouvons simplement supprimer cette ligne et utiliser ici un modèle. Et nous n'avons même pas besoin de ce trailer Title L parce que nous ne l'utilisons pas. Nous avons simplement notre composant d'application et c'est un composant vide. Maintenant, quand je vais aller à la page dans le navigateur, je peux voir que tout est supprimé. Notre page est complètement nettoyée et maintenant nous avons juste un petit message de bande-annonce, ce qui signifie en fait que nous préparons avec succès la partie client de notre application que goodwill implémentera plus tard. 5. Configurer le serveur: Dans cette vidéo, je souhaite préparer la partie back-end de notre projet pour démarrer la mise en œuvre. Comme vous pouvez le voir ici, il est complètement vide. Donc, ce que nous allons créer ici, ce que nous devons faire, nous devons initialiser le fichier JSON du package avec connu. Ici, nous pouvons écrire npm dans le besoin et cela créera pour nous un fichier JSON de package. Nous devons ici répondre à quelques questions. En général, j'appuie simplement sur Entrée sur chacun d'entre eux. Ce n'est pas important pour nous. Et à la fin, il suffit de cliquer sur Oui, et nous sommes prêts. Maintenant, nous pouvons sauter et dire éditeur et sortir de notre client vers notre serveur. Maintenant, nous avons juste un fichier simple, Beckett Jason avec le nom, la description de la version , le script principal, où nous n'avons rien dans l' auteur vide et la licence. Maintenant, nous devons installer deux packages qui nous aideront à créer notre projet back-end. Nous pouvons donc écrire ici le style des déficiences. Et après ce non démon moins D, qu'est-ce que ça veut dire ? Tout d'abord, qu'est-ce qu'un démon ? Qu'il s'agit d'un package spécial qui nous aidera à recharger chaque fois que nous modifierons un fichier, notre application back-end. Et c'est exactement ce que fait Angular rapidement chez le client. Mais à l'intérieur de notre projet back-end, nous n'avons pas de serveur Web qui fait aussi vite. C'est pourquoi quand Staline et un démon, comme vous pouvez le voir ici, j'ai utilisé l'option minus d, ce qui signifie en fait dans notre paquet Jason, aucun démon n'a été installé dans les dépendances de développement. Les dépendances de développement sont des dépendances que nous utilisons lorsque nous développons un projet. Nous n'avons pas besoin d'aucun démon pour la production. C'est juste pour le développement. Et notre prochain package s' appelle Ts node, et il est également uniquement destiné au développement. C'est ici que nous écrivons npm install Ts node minus t, qui signifie qu'il s'agit d'une dépendance de développement. Alors, que fait node ? s'agit simplement d'un processus qui transpose notre code TypeScript dans du code JavaScript à la volée, exécuté comme le code JavaScript normal à l'intérieur du nœud. C'est extrêmement efficace car nous voulons écrire du code TypeScript. C'est pourquoi nous devons d' abord le transformer de TypeScript en JavaScript. Et ce package permet de le faire d'une manière très simple. Maintenant sautons et disons Beckett json et vérifions ce que nous avons. Nous avons ici pour développer des dépendances. Et ici, je veux créer un nouveau script, mais je n'ai pas besoin du test de script. Nous voulons démarrer notre serveur Web. C'est y, voici un style de script, et ici nous pouvons appeler un démon le chemin d'accès à notre fichier. Et ici je veux écrire la barre oblique source server.js. Et comme vous pouvez le voir ici, nous avons le fichier server.js, que nous allons créer dans une seconde. C'est donc le fichier TypeScript et la partie la plus intéressante ici que nous n'avons pas précisé que nous utilisions ici nœud Ts dans aucun démon. Daemon le fait automatiquement dès la sortie de la boîte si nous avons installé le niveau snowed et spécifié ici non pas fichier JavaScript mais un fichier TypeScript. Et la dernière chose que nous devons faire est de créer le fichier de configuration ts, qui est un fichier de configuration pour TypeScript. C'est ici à l'intérieur d'un dossier de service. Je veux créer un nouveau fichier, ts config dot json. Ici, je vais coller un tel conflit et c'est conflit super typique pour l'application Node.js avec TypeScript. Nous allons donc définir les options du compilateur. C'est exactement ainsi que TypeScript transmettra notre code de TypeScript à JavaScript. Le module CommonJS signifie donc que nous écrivons notre TypeScript sur le backend à l'intérieur du coffre des noms. Et notre objectif est l'optique atmosphérique, car le nœud peut facilement lire mon code script six. Notre résolution de mode est donc nœud parce que nous écrivons dans des chaises nominales, déplaçons sur les cartes sources. C'est là que passe la carte source. Notre offre est l'annuaire. La sortie sera générée. Ici, nous avons un dossier dist, il sera créé automatiquement. Nous avons également ici le strict vrai module NDS inter pop, et nous avons besoin de cette option oui module inter Pope pour convertir correctement sont des entrées TypeScript à requérir à l'intérieur du jazz connu. Nous avons donc créé avec succès notre configuration TypeScript, et maintenant nous pouvons créer notre dossier source et dans ce fichier, car comme vous pouvez le voir ici, notre serveur vivra dans le serveur source Ts. Je saute donc dans une telle source et je crée un point de serveur de fichiers. Et n'oubliez pas Ts NodeJS. Maintenant, nous pouvons entrer et simplement écrire serveur de journaux de console juste pour tester s'il fonctionne. Maintenant, je vais sauter dans la console et ici dans le dossier du serveur, je peux écrire npm start, comme vous pouvez le voir ici, nous avons une sortie de no demon, ce qui est tout à fait correct. Il lave les fichiers TypeScript ici et ici. Aucun démon n'a commencé notre test de serveur source de nœud Ts, ce qui signifie qu'il utilise simplement le nœud Ts à l'intérieur, mais qu'il redémarre notre serveur. Et c'est le serveur de sortie que nous avons écrit dans ce fichier. Et maintenant Demon Bull redémarre notre serveur chaque fois que nous apportons des modifications. 6. Installation de la base de données: Dans cette vidéo, nous allons parler de la base de données de style sur votre machine. Et il y a une autre dimension dans laquelle nous allons utiliser MongoDB ici. Alors, quelle est l'idée ? Nous devons installer sur notre base de données de machine locale afin de pouvoir y enregistrer et lire certaines données que nous utiliserons dans notre application. Ces données seront disponibles pour nous en direct localement. Au moment où nous voulons déployer notre projet en production, nous devons configurer la base de données sur production et nous le ferons à la fin de ce cours. Maintenant, la question est de savoir comment installer MongoDB sur votre machine spécifique et comment vous pouvez travailler dans différents systèmes d' exploitation. Nous voulons donc quelque chose qui fonctionne partout sans tracas. En fait, l'installation de la base de données peut toujours poser quelques difficultés. Ici, comme vous pouvez le voir, j'ai déjà ouvert le site officiel de MongoDB avec la section install MongoDB. Il s'agit de l'URL afin que vous puissiez la vérifier si cela vous intéresse, et cela semble vraiment facile. Nous choisissons simplement ici un système opérationnel. Je clique donc sur le lien MongoDB Download Center. Et je suis maintenant sur cette page web. Et à ce stade, il n' est déjà pas vraiment clair ce que MongoDB nous devons installer. Il en existe différentes versions. Il existe des versions gratuites que nous voulons utiliser et des solutions payantes dont nous n'avons pas besoin. Et en fait ici, nous devons explorer un peu et voir ici le serveur communautaire MongoDB. En fait, cette communauté MongoDB est le nom de la version gratuite de MongoDB que nous voulons utiliser. Donc, ici à droite, nous pouvons choisir la version actuelle qui est totalement correcte. Voici maintenant votre plateforme, peut-être Windows, et maintenant il vous suffit de la télécharger et de l'installer. Il suffit donc de double-cliquer ici et de l'installer. Mais après cela, il y a quelques étapes supplémentaires. Nous devons configurer le répertoire de données. Voici que vous pouvez voir qu'ils le font dans la ligne de commande comme ceci. Et puis comme ça, c'est pourquoi vous pouvez installer MongoDB comme ça. C'est très bien. C'est la méthode officielle, mais en fait, mes étudiants ont eu beaucoup de problèmes lors de l'utilisation de bases de données avec une installation officielle. Pourquoi est-ce que c'est ? Parce qu'en fait, dans chaque système d'exploitation, vous pouvez avoir des problèmes. De plus, vous devez créer un dossier, puis spécifier le chemin d'accès, etc. C'est plus difficile. C'est pourquoi je vous recommande vivement de regarder la deuxième possibilité, comment installer une base de données sur votre machine. Et puis nous parlons ici de DACA et de Docker Desktop. Qu'est-ce que Docker ? Il s'agit d'un outil supplémentaire spécifique que vous ne devez pas apprendre, mais que vous pouvez simplement utiliser. L'idée principale est que Docker tout ce qui se trouve dans le conteneur. Il est complètement isolé et n'a rien à voir avec votre système d'exploitation. Docker fonctionne sur tous les systèmes d'exploitation et est gratuit, ce qui signifie en fait que nous installons Docker, d' abord sur votre machine. Et deuxièmement, nous utilisons l'image officielle de Mongo de Docker. Comme vous pouvez le voir ici, le lien pour Mongo, qui est supporté par MongoDB lui-même. Ce n'est donc pas un outil tiers. C'est super officiel et l'idée principale est que ce mongo est emballé dans un conteneur, donc il est complètement isolé sur votre machine et vous obtenez simplement du conteneur, le port où vous pouvez connecter et écrire des données dans ce conteneur. Et voici à quoi cela ressemblera lorsque vous commencerez dedans. Comme vous pouvez le voir sur la gauche, il doit être vert. Et à ce stade, vous savez, d'accord, mon Docker est en cours d'exécution et pour vous la liste sera probablement vide. C'est très bien. L'idée principale est que tout d'abord, vous lancez Docker sur votre machine. Après cela, nous allons simplement à la console et nous devons exécuter une commande comme vous pouvez le voir ici J'ai écrit docker run et après avoir installé Docker desktop sur votre machine, vous pouvez écrire Docker dans le console. C'est le nom connu, et ici nous écrivons docker run then minus d, qui signifie que ce doit être un processus détaché, qui signifie en fait que nous ne voulons pas exécuter ici dans ce terminal. Nous voulons simplement le détacher du terminal. Ici, nous spécifions les ports et ensuite nous spécifions le nom mongodb. Et ici, Mongo, ce nom, MongoDB est le nom du conteneur sur ma machine. Et voici ce que nous voulons télécharger, c'est exactement l' image que nous allons utiliser. Ici, nous utilisons Mongo 404. Vous pouvez également utiliser la version ultérieure ici, vous pouvez la consulter sur le site officiel du Mongo ou ici dans Docker. Comme vous pouvez le voir, vous pouvez cliquer ici sur balises, faire défiler un peu. Par exemple, vous pouvez utiliser dernière version ou simplement vérifier la version, comme vous pouvez le voir ici, la dernière version est 507. En ce moment, j'ai installé sur ma machine pour 0 pour, mais cela ne fait pas une énorme différence. Les choses que nous allons essayer dans MongoDB sont les mêmes sur toutes ces versions. Maintenant, je clique ici et Docker téléchargera cette image sur ma machine. Comme vous pouvez le voir, je n'ai obtenu aucune sortie à l'exception d'un hachage. Et c'est parce que MongoDB est déjà téléchargé par Docker sur ma machine. Ce n'est donc pas un problème, et cette ligne a simplement redémarré Mongo DB sur ma machine. Et en fait, si j'ouvre maintenant l'outil Docker, vous pouvez voir qu'il contient un MongoDB et qu'il est vert parce qu'il est en cours d'exécution ce moment et nous pouvons lui parler. C'est pourquoi, comme vous pouvez le constater, vous n'avez pas besoin de créer de fichiers supplémentaires. Vous n'avez pas à vous soucier de certaines autorisations ou de certains dossiers. Cela fonctionne tout simplement. Et il s'agit d'une ligne unique qui est utilisée pour de nombreux projets. Maintenant, la question est évidemment de savoir comment nous pouvons sauter dans la console de MongoDB quand elle est à l'intérieur du conteneur. Et pour cela, nous avons une commande spéciale, docker exec, qui signifie l'exécuter. Et voici le nom de notre conteneur. Dans notre cas, c'était MongoDB. Et après cela, nous écrivons notre commande et nous voulons venir et Mongo ici parce que c'est ce qui est installé à l'intérieur du conteneur. Le conteneur intérieur peut être installé n'importe quoi. Dans notre cas, cette image de Mongo contient simplement Mongo. C'est pourquoi nous appuyons sur Entrée. Nous recevons ici de nombreux messages de MongoDB. Et comme vous pouvez le voir après cela, je suis maintenant ici dans le terminal de Mongo à l'intérieur du conteneur, et ils peuvent écrire ici quelques commandes Mongo. Par exemple, afficher les bases de données, le point-virgule, j'appuie sur Entrée, et vous pouvez voir les bases de données que j' ai ici. Maintenant, vous pouvez dire, accord, mais je n'ai pas utilisé Docker, installé MongoDB juste de la manière officielle, que devraient-ils faire ? Et en fait, tu ne dois faire qu'une seule chose. Si vous l'avez installé de manière officielle, vous avez deux commandes différentes dans votre console. Tout d'abord, ce sera une commande de Dieu, et cela démarrera exactement de la même manière que nous l'avons fait avec processus docker run MongoDB sur votre machine, ce qui signifie en fait que la base de données sera en tant que processus en cours d'exécution sur votre machine. Et la deuxième commande que vous voulez utiliser est Mongo. Cette commande va directement insérer la console, comme nous l'avons fait avec torque. Ce sera exactement pareil. Le plus important dans ce cours est que votre base de données Mongo doit être exécutée directement sur votre machine pendant le développement du projet. Ce qui signifie en fait que vous avez trois choses. Tout d'abord, vous disposez d'une base de données standard. Deuxièmement, avez démarré le serveur Web pour le back-end. Et le dernier est le serveur web statique pour le frontend. 7. Utilisez-vous un bon éditeur ?: Nous avons presque fini de sous-typer tous nos outils. Et la dernière question que je voudrais vous poser, utilisez-vous vraiment le bon éditeur ? Parce qu'en fait, nous allons écrire beaucoup de TypeScript dans votre éditeur. Et l'éditeur ne supporte pas très bien TypeScript, alors vous pourriez envisager d' utiliser un autre éditeur. Comme vous pouvez le voir ici, je suis dans mon éditeur, c'est Vim, mais je ne vous le suggère pas. Je veux juste montrer de quoi je parle. Comme vous pouvez le voir ici où insérer un composant dans Angular et ici nous avons une entrée de notre composant. Généralement, lorsque nous écrivons le code avec, n'écrivez pas d' inverses en écrivant simplement quelque chose comme add component ou peut-être simplement add than comp. Ensuite, nous avons une auto-complétion. Et vous pouvez le voir ici, nous pouvons choisir beaucoup de choses. Nous voulons en fait entrer le composant depuis Angular. Il ne s'occupait pas seulement d'ici. Et tout d'abord, il a été auto-complété jusqu'à la fin. Et deuxièmement, j'ai obtenu ce composant d'entrée externe de Angular com. Et il est extrêmement important que votre éditeur puisse le faire. Vous avez vraiment besoin de la prise en charge de ces entrées externes lorsque vous écrivez du code. Parce que chaque fois que vous devez écrire une entrée, si vous voulez vraiment le faire à la main comme composant d'entrée, et que vous ne vous souvenez pas vraiment de quel package vous devez l'entrer. Ce n'est pas efficace. Vous passez simplement du temps à écrire du code sur des choses de Ron. Nous avons vraiment besoin de cette fonctionnalité d'entrée externe. Et la deuxième caractéristique est évidemment que vous voulez avoir un support de TypeScript dans votre éditeur, ce qui signifie que lorsque nous écrivons quelque chose de incorrect. Par exemple, ne sélectionnez pas ici, mais sélectionnez simplement où aller directement ici, un argument de message de type select n' existe pas sur le composant de type, ce qui signifie en fait, mais ne passez pas de temps Déboguer de la magie. Nous voyons simplement notre faute de frappe directement dans l'éditeur. Vous pouvez utiliser ici n'importe quel éditeur prenant en charge TypeScript. Mais si vous ne savez pas quel éditeur utiliser, je vous recommande vivement de consulter VS Code. Il s'agit d'un éditeur entièrement gratuit, qui fonctionne sur tous les systèmes d'exploitation. Il vous suffit de l'installer. Vous obtenez un tel éditeur avec prise en charge intégrée de TypeScript prêt à l'emploi, ce qui signifie que vous obtenez toutes ces fonctionnalités dans votre éditeur. Et dans ce cas, il est beaucoup plus facile pour vous d'écrire du code. 8. Configuration de la prise avec Express: Dans cette vidéo, nous commençons par développer notre projet. En fait, le but de cette vidéo est de configurer notre serveur back-end avec Express, MongoDB et socket IO. Commençons donc. Ici. Nous devons installer plusieurs nouveaux packages. Tout d'abord, nous voulons exprimer qu'il s'agit d'un cadre. C'est pourquoi je souhaite accéder à la console. Et comme vous pouvez le voir à l'intérieur du dossier racine, nous ne voulons pas installer ici packages car nous devons d'abord sauter dans notre dossier serveur ici boop voulez installer des packages. C'est là que je suis juste dans npm install express. Dans ce cas, nous installons ce framework en tant que dépendance. Ici, vous pouvez voir maintenant que nous avons une nouvelle dépendance, exprimée comme notre framework. La prochaine chose que nous voulons installer est Mongoose. Et si vous ne savez pas ce qu'est Mongoose, c'est le package le plus populaire pour travailler avec MongoDB dans des chaises connues. Pourquoi c'est le plus populaire, parce que vous pouvez simplement configurer votre connexion à MongoDB avec lui, vous pouvez créer vos modèles et travailler avec MongoDB de manière plus correcte en travaillant avec des modèles. Donc, vous avez généralement quelque chose comme une RAM et nous apprendrons Mongoose plus raide dans les prochaines conférences. Et la dernière chose que nous voulons installer ici est Socket IO. C'est pourquoi npm installe socket point ion. Et c'est exactement notre bibliothèque pour travailler avec des WebSockets à l'intérieur de chaises connues. Comme vous pouvez le voir, toutes nos dépendances sont installées et maintenant nous pouvons sauter dans set source, serveur Ts, et nous n' avons rien ici. Et nous pouvons commencer par configurer notre sirop. Mais en fait, voici la question. Il est très facile d'écrire votre code pour Stratton Express. Son entité est vraiment facile à créer un serveur Web pour Socket IO, mais en fait, il n'est pas si facile de configurer MongoDB Express et socket IO. Parce que ce que nous voulons de l'expression, nous voulons des rondes normales, tout comme dans une application normale, mais nous voulons également nous lier à son E/S de socket afin de pouvoir travailler avec WebSockets. Et en plus de tout cela, nous devons d'une manière ou d'une autre démarrer notre MongoDB. Comme je l'ai dit, ce n'est pas facile, mais il s'agit de la production parce que personne n'a besoin d'un seul package. Nous voulons vraiment une application prête pour la production. Donc, tout d'abord, je vais saisir notre Express. Express. Et en fait, en ce moment, vous pensez probablement, accord, à ce qu'il fait. Il a essayé d'inverser les chaises nominales à l'intérieur. Et en fait c'est très bien parce que nous ne sommes pas bien ici. Javascript, où juste ici, TypeScript. Et cela se passe avec notre config. Et juste pour vous rappeler que nous avons notre configuration ts. Cela est apparu à ECMO ScriptSIG, qui peut maintenant être lu par Jess. Mais plus important encore, CommonJS et node offrent plus de résolution. C'est là qu'il sera converti en besoin et il fonctionnera comme un charme dans le jazz maintenant. Mais pour nous, c'est extrêmement confortable car l'utilisation d'entrées est bien meilleure que ce que nécessite la main droite. Et voici un autre problème. Comme vous pouvez le voir ici, j'ai une erreur. Impossible de trouver le fichier de déclaration pour le module exprimé. Qu'est-ce que cela signifie ? Typescript essaie de nous aider avec l'inverse. Il ne peut pas le faire hors de la boîte parce que TypeScript ne connaît rien au package express. Et voici une solution que nous devons installer avec npm install save-dev, types express. Nous pouvons donc installer des typages supplémentaires pour package express, puis taper script peut nous aider petit. Et c'est exactement ce que nous voulons faire. Nous devons sauter et définir la console et la droite et les paiements tau. Et voici les types slash Express, et voici important moins l'option de l'installer simplement en tant que dépendance de développement. Nous n'avons pas besoin de cette bibliothèque pour la production. Et comme vous pouvez le voir après l'installation, cette erreur a disparu. Et maintenant, TypeScript peut nous aider avec Express. Nous avons donc importé avec succès notre colis express et nous pouvons maintenant créer notre application. Je peux donc simplement écrire ici const ab equals, et ici nous appelons Express. Et comme vous pouvez le voir maintenant, si je suis halite et express, vous pouvez voir tous les types d' expressions de ce package spécifique. Par exemple, nous pouvons lire ici qu'il crée une application express, ce qui est extrêmement utile à des fins de développement. La deuxième chose que nous voulons faire, nous devons créer un serveur HTTP et vous verrez pourquoi dans une seconde. Donc ici je veux déstructurer, créer un serveur à partir de, et voici http. Comme vous pouvez le voir, nous sortons ATP de la boîte et créons également un serveur car il s'agit du package de nœud par défaut. Mais il se peut que vous manquiez des dactylographies pour des chaises connues. C'est là que nous pouvons sauter directement dans la console et écrire npm install types node minus t. Et dans ce cas, nous installons à coup sûr toutes les saisies nécessaires pour les chaises nominales. Nous avons donc importé un serveur de création à partir de http. Nous devons maintenant l'utiliser. Après l'application, nous pouvons créer notre serveur HTTP. Et ici, nous voulons appeler notre serveur de création et fournir dans notre application. Et juste pour te rappeler, app, c'est une instance de notre Express. Il s'agit de notre serveur express. Nous créons ici un serveur HTTP. De plus, la prochaine chose que nous voulons entrer ici est socket. C'est ici, où un serveur important avec un grand S à partir du package d'E/S socket. Et maintenant, nous pouvons créer directement notre serveur de socket. Donc voici const ion, et ici nous appelons serveur. Et à l'intérieur, nous fournissons notre serveur HTTP. C'est exactement pourquoi nous avons créé ce serveur HTTP en premier et avant qu'il ne soit exprimé. Dans ce dossier, nous avons trois choses différentes. Tout d'abord, nous avons notre application, nous permet de travailler directement avec Express. Deuxièmement, nous avons notre serveur HTTP, que nous pouvons commencer par un certain port. Le troisième est notre IR, nous pouvons donc faire des requêtes WebSockets. Et juste pour vérifier que tout fonctionne, je veux utiliser ici notre application et essayer simplement apt-get slash. Nous voulons donc créer notre nouvelle route sur slash. Et ici, nous n'avons besoin de rien, mais je veux juste répondre avec une ficelle. C'est pourquoi nous pouvons écrire ici une demande et une réponse. Et ici, l'API d'envoi de points de repos est en place. Si vous n'êtes pas familier avec Express, c'est ainsi que nous créons des routes de lecture uniquement à l'intérieur de notre serveur principal. Nous disons donc, d'accord, nous créons maintenant obtenir la route pour la barre oblique, ce qui signifie pour la page d'accueil. Voici notre Kohlberg. À l'intérieur de notre Kohlberg, nous recevions des demandes et des réponses. Et ici, nous pouvons utiliser le point send pour envoyer la chaîne à ce tour spécifique. La dernière chose que nous devons faire ici est de démarrer notre serveur. Ici, nous pouvons écrire un serveur HTTP. N'écoutez pas et n'entendez pas. Nous fournissons un port, par exemple, pour 1001. Après cela, nous avons un rappel. Le serveur Web de la tour est aussi talentueux. Nous pouvons donc écrire dans un journal de console, par exemple, que notre API écoute sur le port. Et voici notre rôle. Et en fait, il aurait été isolé pour mettre le sport dans un fichier de configuration supplémentaire, mais pour l'instant il ira aussi. Voyons donc si cela fonctionne. J'ai ici un onglet avec un serveur API ouvert. Et comme vous pouvez le voir ici, aucun démon n'a redémarré ce serveur web encore et encore. Et à un moment donné, notre API de journal de console écoute sur le port 4,001, ce qui signifie que même le navigateur, nous ouvrirons l'hôte local pour 1001. Vous pouvez voir ici que notre API de message est active, mais elle n'est pas tolérable. Je veux également vérifier si notre connexion de couche de socket fonctionne. C'est pourquoi ici après EB, nous pouvons écrire ir point et ici nous l'avons sur. Et comme vous pouvez le voir, tout d'abord, nous obtenons tous les types prêts l'emploi avec Socket Layer. Nous n'avons pas besoin d'installer de package supplémentaire. Deuxièmement, vous pouvez le voir sur la fonction d'écoute de notre socket IO, ce qui signifie que nous pouvons écrire ici, et nous fournissons ici comme premier paramètre de connexion. Et en fait, c'est l'action par défaut qui peut se produire dans les E/S de socket. Et voici notre rappel. Nous ne voulons rien pour l'instant, mais nous pouvons simplement écrire console.log connected. Et nous ne pouvons pas vraiment voir que la couche socket fonctionne pour nous parce que nous lui avons simplement défini un onglet sur le back-end, mais pas sur le client. Mais c'est ainsi que nous écrirons notre code Socket Layer sur le backend et nous y sommes parfaitement préparés. Ici, nous zappons, nous travaillons avec Express avec un yard, nous travaillons avec Socket Layer et serveur HTTP que nous utilisons pour démarrer le serveur. Et la dernière chose que nous devons faire ici est de configurer notre mangouste. Et juste pour vous rappeler, mongoose le package pour fonctionner avec MongoDB. Donc, ici en haut, je veux entrer une mangouste. Et voici un point très important. Vous ne voulez jamais démarrer vos serveurs Web avant de vous connecter à la base de données. L'idée principale est qu' à l'intérieur de votre observateur, vous allez faire quelques requêtes à la base de données, et la base de données n'est pas encore prête, alors nous pouvons faire cette requête, qui signifie en fait chaque fois nous voulons être sûrs que MongoDB est, leur connexion est établie. Et ce n'est qu'après cela que nous démarrons notre serveur Web. C'est ici ce que je veux écrire après notre socket IO, nous pouvons écrire ici Mongoose dot et nous avons ici une méthode connect. Et en fait, à l'intérieur, nous voulons fournir notre URL mongodb. Donc ce que je veux coller ici, c'est cette année, c'est MongoDB deux-points slashes, barre oblique du port 27017 de l'hôte local l Trello. Et en fait, cette partie sur la gauche est le chemin par défaut de MongoDB. Et peu importe comment vous avez installé Mongo DB manière officielle ou avec le conteneur Docker, cela fonctionnera exactement de la même manière. Soit vous avez un processus MongoDB en cours d' exécution sur votre machine, sur le sport, soit vous avez un MongoDB en cours d'exécution à l'intérieur du conteneur avec le sport, qui est disponible à l'extérieur sur notre machine locale. Ici, après la barre oblique, c'est juste le nom de la base de données que vous pouvez écrire ici, n'importe quel nom et elle sera créée. Je viens d'écrire ici la bande annonce, comme le nom de notre projet. Cette ligne est donc en fait une promesse. C'est pourquoi nous pouvons écrire point. Ensuite, une fois que nous nous sommes connectés avec succès à notre base de données MongoDB, il sera déclenché. Et maintenant, à l'intérieur, nous pouvons tout d' abord écrire que nous nous sommes connectés avec succès à notre base de données. Je peux donc écrire ici connecté à MongoDB. Et je souhaite également déplacer cet écouteur HTTP à l'intérieur. Dans ce cas, tout d'abord, notre connexion à MongoDB est établie. Ensuite, nous démarrons notre serveur. Maintenant, je veux accéder à notre serveur Web et vérifier s'il fonctionne. Comme vous pouvez le voir maintenant, je reçois un message connecté à MongoDB et après le semestre réussite de notre API, le standard, ce qui signifie en fait que le standard, ce qui signifie en fait c'est exactement notre objectif. Tout d'abord, MongoDB. Deuxièmement, notre serveur Web. En fait, en ce moment, vous pouvez obtenir un peu d'Azure concernant la connexion ici. Et le problème le plus courant que vous pourriez avoir, vous n'avez pas démarré votre processus MongoDB sur votre machine. S'il n'est pas démarré, ne pouvons pas nous connecter à une base de données MongoDB. Ensuite, vous obtiendrez probablement une erreur, comme impossible de vous connecter à Mongo DB ou échec de la connexion. Mais si vous voyez sur votre écran connecté à MongoDB et que le paiement est démarré, cela signifie que vous avez tout configuré avec succès. Et nous avons démarré notre serveur Web sur le backend avec MongoDB et socket IO. 9. Créer un modèle d'utilisateur de Mongoose: Dans cette vidéo, nous allons parler création de notre modèle d'utilisateur. En fait, le démarrage de l'application va enregistrer les utilisateurs. Donc, utilisateur actuel, nous pouvons nous connecter avec l'utilisateur, ce qui signifie que nous devons gérer nos utilisateurs sur le front-end, sur le backend et dans la base de données. Dans cette vidéo, nous allons nous concentrer sur la mangouste et la base de données. Encore une fois, ce qui est mongoose était déjà installé dans le package R JSON. Vous pouvez voir Mongoose ici, mais ce qu'il fait essentiellement, c'est le site officiel de Mongoose. Vous pouvez voir ici l'exemple. Nous injectons donc des biens humains et nous faisons connecter Mongoose point. Et voici une base de données MongoDB. Après cela, nous pouvons écrire le module mongoose cat, et nous définissons que notre chat a nommé string, ce qui signifie en fait que cat est notre entité. Et maintenant, nous pouvons créer cette entité juste à l'intérieur de JavaScript. C'est là que nous en sommes au Royaume-Uni, et nous indiquons à l'intérieur du nom. Nous avons donc créé un minou, qui n'est qu'un objet. Mais maintenant, dans Katie, nous avons une méthode de sauvegarde. Et cette méthode retourne comme une promesse, qui signifie en fait que c'est ainsi que nous allons enregistrer l'enregistrement dans MongoDB. Maintenant, vous pouvez vous demander, pourquoi avons-nous besoin de mangouste ? Pourquoi nous ne pouvons pas simplement utiliser le pilote officiel MongoDB comme mongodb dot save et lancer dans un objet que nous voulons enregistrer. Ce n'est pas confortable de travailler dans le grand projet, même dans le projet moyen, ce n'est pas si confortable parce que vous n' avez aucune abstraction. Vous écrivez du code de très bas niveau, comment vous devez enregistrer des données dans une base ou comment vous allez les lire. En fait, c'est pourquoi nous préférons utiliser rampes dans nos projets backend. Qu'est-ce que Ram Dass est rapide, nous définissons quelque chose comme des modèles, qui sont nos entités au sein de notre projet. Par exemple, nous avons un utilisateur qui a peut-être des tâches ou vous avez des tableaux si nous parlons d'application de parcours, etc. Ensuite, nous pouvons définir les relations entre ces modèles. Et puis toutes ces relations se font de manière beaucoup plus facile. Nous pouvons le faire nous-mêmes avec MongoDB, ce qui signifie simplement que nous écrivons moins de code. C'est pourquoi, dans cette vidéo, nous voulons nous concentrer sur notre modèle d'utilisateur. Et la première chose que je veux faire dans la source, je veux créer un dossier de types. Et en fait, nous sommes ici en TypeScript, ce qui signifie que nous devons l'exploiter. Et c'est très important pour investir plus de temps dans TypeScript que dans l' écriture de votre code. Dans ce cas, il vous sera plus facile de développer votre application. C'est là que, dans les types de source, je veux créer des points d'interface utilisateur. Et comme vous pouvez le voir ici, j' ai cette notation où nous avons un suffixe de ce que c'est exactement. À l'intérieur, je veux créer notre nouvelle interface utilisateur. Et si vous ne connaissez pas bien TypeScript, c'est juste une définition de l'objet que nous pouvons utiliser partout. Dans ce cas, nous utilisons l'interface Word, qui est un mot réservé dans TypeScript. Et ici, nous définissons un utilisateur d' interface et nous pouvons définir les champs que nous avons à l'intérieur de notre utilisateur. Tout d'abord, nous devons créer un e-mail, car c'est ce que nous utilisons dans l' application pour enregistrer un utilisateur, valider cet utilisateur, puis envoyer un e-mail à l'utilisateur. De plus, nous avons besoin d'un nom d'utilisateur et il sera diffusé en continu et un mot de passe sera également nécessaire. Et évidemment, nous devons hacher un mot de passe et ne jamais arrêter les mots de passe juste comme une contrainte plane. Enfin et surtout, ici sera créé à, nous n'avons pas besoin d'utiliser ce champ, mais c'est vraiment agréable de l'avoir, tout d' abord à des fins de débogage. Et deuxièmement, nous pouvons l' obtenir chez Mongoose tout juste sorti de la boîte et il sera daté. Voici donc à quoi ressemble une interface utilisateur. Maintenant, dans l'ensemble de notre application, dans notre back-end, nous pouvons utiliser cette interface utilisateur. Maintenant sur la droite, je veux créer un modèle pour cet utilisateur. C'est pourquoi, dans la source, nous pouvons créer un nouveau dossier appelé modèles. Et à l'intérieur, nous pouvons enregistrer les points utilisateur, et c'est notre modèle. C'est exactement quelque chose pour Mongoose. Ce que je veux écrire ici, c'est notre schéma utilisateur. Et ce que cela signifie ici, nous définissons un schéma de notre modèle. Et pour cela, nous utilisons un nouveau schéma. Et comme vous pouvez le voir, je n' ai pas de saisie semi-automatique. Essayons donc d' importer ici le schéma. Et comme vous pouvez le voir, je n' ai pas une bonne entrée ici. J'ai un autre commentaire de l'inspecteur, et ce n'est pas correct. Je vais donc taper ici le schéma d'entrée de mongoose. Vérifions-nous s'il y a une erreur. Nous n'avons pas d' erreur, ce qui signifie que c'était juste un problème de mon éditeur. Ici, je peux inspecter le schéma, ce qui signifie qu'il est vraiment disponible avec TypeScript à l'intérieur. Nous voici dans votre schéma. Et maintenant, entre crochets, nous pouvons définir notre objet, mais le schéma n'est pas ce que nous allons utiliser dans l'application. Ça doit être un modèle. C'est pourquoi ici nous pouvons écrire cela puis exporter le modèle par défaut. Et ce modèle provient également de Mongoose. Mettons donc ici le modèle de virgule. Et ici model est une fonction où nous fournissons notre chaîne. Il sera utilisé avec une grande teinte. Et il y a un deuxième argument. Nous fournissons ici un schéma utilisateur. C'est ainsi que nous définissons un modèle à l'intérieur de Mongoose. Nous pouvons donc exporter ici le modèle par défaut que nous fournissons ici, le nom et notre schéma. Et ici, nous devons définir notre schéma. Mais nous sommes en plein TypeScript. Et en fait, ce n'est pas le meilleur moyen de créer un nouveau schéma. Pourquoi est-ce que c'est ? Ici, nous mettons en évidence notre schéma et vous pouvez voir qu'une grande partie de n est ici et c'est mauvais. Pourquoi est-ce que c'est ? Parce que nous n'avons défini aucun type de schéma. C'est pour cela que nous voulons faire. Nous voulons créer une définition du schéma pour un utilisateur. Je veux donc sauter ici sur la gauche et créer ici une interface experte. Il s'agit donc d'une nouvelle interface pour le document utilisateur. Voici une énorme différence, nous avons ici une interface pour l'utilisateur. C'est juste l'utilisateur avec les champs et c' est utiliser un document. C'est ce que nous utilisons uniquement pour la mangouste. Et ici je veux écrire x tans. Et si vous ne savez pas avec quoi s'étend, prenez simplement tous les champs de notre utilisateur ici. Je veux donc écrire ici extends User comma document. Et en fait, ce document doit être chargé depuis Mongoose. Donc ici en haut, j'ai besoin d'écrire le document d'entrée de Mongoose. Et en fait, pour l'instant, nous n' avons rien à fournir à l'intérieur. Et vous pouvez demander maintenant, d'accord, mais cela n'a aucun sens ce qui s'est passé ici. Nous avons créé un document utilisateur d'interface. Ici, nous sommes simplement un utilisateur étendu et un document. Et oui, c'est logique parce que tout d'abord, nous avons notre interface utilisateur. Nous pouvons l'utiliser partout. C'est notre rôle, mais nous le mélangeons également avec le document. Et le document vient de Mongoose. C'est la définition du document et la partie la plus importante est, par exemple, cet AD, car chaque document à l'intérieur de mongodb possède NAD. Et dans ce cas, nous n'avons pas besoin de spécifier que l'utilisateur a AD, il provient du document de mongoose. Et maintenant, nous pouvons sauter ici sur la droite et utiliser souvent le schéma. Nous pouvons fournir dans les réservoirs un document utilisateur que nous venons de créer. Et maintenant je peux le saisir ici en haut. C'est donc à partir de notre interface utilisateur de types. Dans ce cas, nous disons que notre document utilisateur est ce que nous devons fournir dans notre schéma utilisateur. Et exactement la même chose que nous pouvons faire avec notre modèle ici, nous pouvons fournir notre document utilisateur. Et si vous ne savez pas ce que signifie cette partie, il s'agit en fait d'un générique, ce qui signifie en fait que nous fournissons un type générique. Il peut s'agir de n'importe quoi par défaut. Mais si nous inspectons maintenant notre schéma, vous pouvez voir qu'il n'en est plus. Nous avons ici notre document utilisateur, ce qui est extrêmement important pour nous et pour la validation de TypeScript. Parce qu'en fait ici, maintenant à l'intérieur de ce que je veux faire, je veux lancer quelque chose qui n' existe pas à l'intérieur de l'utilisateur. Par exemple, supposons que nous avons un formulaire de propriété d'utilisateur interne. Et ici, à l'intérieur, nous voulons fournir le type est chaîne. Et je sauvegarde cela , puis j'entre ici et je réduis cet argument de type foo n'est pas assignable au paramètre de type. Et ici, nous pouvons voir notre nom d'utilisateur e-mail, passe créé ajouter un identifiant de soulignement, qui provient du document et ici pour souligner la version. qui signifie en fait que si nous n'essayons pas ce document utilisateur ici, nous n'obtenons aucune validation de TypeScript. Il est extrêmement important que nous l'obtenions. Maintenant, à l'intérieur du masque, fournissez tous les champs. Chairman d'Etre pour notre utilisateur. Commençons par l'e-mail. Donc ici notre champ est email et puis dit, Nous devons fournir le type, c'est une chaîne. Deuxièmement, ici nous pouvons dire propriété requise et comme vous pouvez le voir, TypeScript nous aide et montre quelles propriétés nous pouvons fournir un aperçu Mongoose. Donc en fait à l'intérieur requis, mais peut fournir un tableau avec des données et des messages valides. Parce qu'en fait, nous voulons afficher sur le front-end un message sympa lorsque notre e-mail n'est pas valide. Il ne s'agit donc pas simplement d'une chaîne. Cet e-mail n'est pas valide. Et pour cela, nous pouvons entrer ici sur le validateur supérieur. Ici, je veux entrer des données valides pour le validateur John. Comme vous pouvez le voir, nous obtenons un module d'erreur. validateur n'est pas installé, nous devons donc accéder à notre serveur. Ici, j'arrête le serveur Web et ils vont écrire ici des données valides sur des déficiences, mais ce n'est pas tolérable. Je souhaite également obtenir des types pour ce package. C'est y ici aux types slash valid data, mais il doit être installé en mode développement. Donc ici, n'oubliez pas, moins t. Nous pouvons maintenant ouvrir sur la droite, sont empaquetés en JSON et comme vous pouvez le voir ici dans les dépendances de développement, j' ai validé des types validateur et des indépendances validées. Maintenant, nous n'avons aucune erreur pour les données valides, nous pouvons donc les spécifier à l'intérieur requis. Et en fait, je me trompe un peu. Ce champ n'est pas obligatoire car suffit de fournir s'il est obligatoire ou non. Dans notre cas, l'e-mail est obligatoire. Ici, en tant que deuxième paramètre, nous pouvons fournir un message d'erreur s'il est vide. Et ici, nous pouvons fournir un e-mail est requis. Et après cela, nous avons notre validation. C'est ici que nous avons une propriété validate, et c'est exactement là que nous voulons utiliser notre validateur. Donc, ici, je peux écrire un point de validation et nous obtenons une bonne auto-complétion à cause des types. Et ici je vais écrire un e-mail. Nous avons donc ici de nombreuses validations. Et où je reçois une validation par e-mail prête à l'emploi. Et il y a un deuxième argument que nous pouvons fournir ici, l'e-mail non valide. Enfin, je souhaite créer des index. Et en fait, si vous ne savez pas ce que sont les index, sont des éléments qui peuvent accélérer les requêtes de votre base de données. Et deuxièmement, cela peut rendre, par exemple, un champ de courrier électronique unique. Dans ce cas, je souhaite écrire des index de création. Et ici en tant qu'objet, je fournis un aperçu, unique, vrai ce qu'il fait, il lit notre e-mail est un index unique dans ce cas, mais ne peut pas enregistrer deux personnes avec le même e-mail. Encore une fois, dans le schéma mongoose, nous fournissons tous les champs dont nous avons besoin pour notre utilisateur. Et le premier champ était un e-mail ici, mais doit fournir un type à l'intérieur. Et c'est exactement la ligne de chargement dont nous avons besoin par défaut. Mais en fait, nous pouvons fournir ici requis que nous pouvons définir en vrai ou faux ici nous pouvons fournir des validateurs et nous pouvons créer des index. Et en fait, nous pouvons faire tout cela comme ce pilote MongoDB à l'intérieur du plan. C'est pourquoi je préfère utiliser Mongoose parce que c'est dans un domaine où nous sortons toutes ces choses de la boîte. Le champ suivant est notre nom d'utilisateur. Nous pouvons donc ici fournir notre nom d'utilisateur et ce sera plus facile. Tout d'abord, le type sera chaîne, et deuxièmement, required doit être vrai. Et ici, je veux également fournir l'erreur de validation. C'est pourquoi nous utiliserons la même notation avec le tableau. C'est vrai et le nom d'utilisateur est requis. Nous pouvons maintenant copier-coller cet utilisateur car ce sera le même. Et le dernier, ce que nous avons ici est notre mot de passe et notre mot de passe est une chaîne de caractères, et il est également requis, mais ici le mot de passe est requis. Et la dernière chose que nous voulons faire est de sélectionner false. Et en fait, ce que fait select false, il ne sélectionnera jamais ce champ lorsque nous ferons une demande. Par exemple, nous voulons obtenir un identifiant utilisateur à partir de la base de données. Nous ne récupérerons pas ce terrain. Et c'est extrêmement important car cela permet d'économiser notre application. Peu importe les requêtes que nous écrivons. Nous savons toujours que nous ne récupérerons pas de mot de passe, ce qui signifie que nous sommes par défaut en sécurité. Enfin, ce qu'ils veulent fournir ici, ce sont les horodatages. Nous pouvons donc fournir ici à l'intérieur d'un objet et écrire ici des horodatages, et ici nous le définissons sur true. Dans ce cas, notre propriété CreatedAt sera directement générée par mongoose. Mais comme vous pouvez le voir ici, il y a une faute de frappe. Nous n'avons pas besoin de fournir le sujet ici. Il s'agit d'un deuxième argument après notre objet, ce qui signifie que dans le nouveau schéma tant que fonction, nous fournissons d'abord cet objet avec tous nos champs, et deuxièmement, l'objet avec horodatages vrai. C'est donc le deuxième document sur la façon dont le nouveau schéma. Nous sommes donc prêts avec la première partie de notre modèle. Mais nous avons un énorme problème ici si nous essayons simplement d'utiliser notre utilisateur comme ça. Par exemple, ici, nous pouvons écrire un nouvel utilisateur et nous avons été fournis dans un objet avec un mot de passe de nom d'utilisateur e-mail. Et après cela, nous appellerons safe, puis notre utilisateur enregistrera directement ce mot de passe sous forme de chaîne simple. C'est interdit, c'est mal et nous ne devrions jamais le faire. C'est pourquoi nous devons résoudre ce problème. Ce que nous pouvons faire à ce sujet, nous devons hacher notre mot de passe avant de le stocker dans la base de données. Et pour cela, nous pouvons utiliser une bibliothèque vraiment sympa, qui s'appelle la crypte. Et c'est la solution la plus populaire. Hachez le mot de passe. C'est ici que nous devons accéder à la console et installer ce package. Donc npm a installé be crypt jazz et nous voulons également installer des typings. Donc ici aux types slash be crypt jazz, mais évidemment ça doit être width moins t. Alors vérifions-nous le son. Je passe au package JSON. Et ici, je vois que les types sont des chrétiens dans des dépendances de développement et des indépendants cryptés. C'est tout à fait correct. Maintenant, ce que nous pouvons faire ici, nous pouvons définir la prière par points du schéma utilisateur. Et c'est la possibilité d'exécuter une fonction avant quelque chose. Ici, nous sommes intéressés à fournir un coffre-fort, ce qui signifie en fait que nous exécuterons notre fonction directement avant la sécurité. Donc, ici, je veux écrire une fonction sinc et ils diront Pourquoi j'utilise ici la fonction et non la fonction flèche dans une seconde. C'est vraiment important de l'écrire ainsi. Et voici le Next. Et maintenant, nous avons des crochets et nous pouvons faire quelque chose à l'intérieur. L'idée principale est que nous pouvons faire ce que nous voulons ici avec notre objet. Et après cela, lorsque nous changeons de sujet, par exemple, nous devons appeler ensuite et mongoose procédera à la sauvegarde de nos données. Et les préventes signifient que cette fonction sera appelée, d' abord après Create et ensuite après la mise à jour. Et c'est exactement ce que nous voulons. Par exemple, nous voulons non seulement créer un mot de passe pour l'utilisateur, mais également le mettre à jour ultérieurement dans le formulaire de mise à jour. Et la première condition que je veux écrire ici est la suivante. Dans le cas contraire, ce point est modifié. Et comme vous pouvez le voir, nous avons une fonction qui est modifiée et nous pouvons fournir un mot de passe, puis nous voulons juste ne rien faire et revenir ensuite. Ce que nous faisons ici, est vérifier si notre champ de mot de passe a été modifié. Ce n'est pas le cas a été créé parce que nous y aurons un mot de passe, mais c'est le cas avec update if suggestions utilisateur et nous n'avons pas changé le mot de passe, alors cela n'a aucun sens à appliquer cette fonction. C'est ici que le poulet, d'accord, si le champ du mot de passe n' est pas modifié, alors nous disons simplement pour Mongoose, allez-y. Comme vous pouvez le voir ici, nous avons écrit une fonction sinc et non une fonction error. Et c'est important ici parce que nous voulons utiliser ici cette propriété. Et pour avoir une référence correcte , nous devons l'écrire en tant que fonction et non en tant que fonction flèche car dans un autre cas, elle sera exécutée et nous utiliserons également ici une fonction sinc car l'opération cryptée sera synchrone. Après ça, je veux écrire try-catch. Et en fait, si nous obtenons une erreur, ce sera une crypte, alors nous entrerons dans la cage. Ici, nous recevons notre erreur et nous voulons renvoyer cette Sarah à l'intérieur ensuite. Ici, nous lançons dans Azure en tant qu'erreur. Et vous vous demandez peut-être, d'accord, mais pourquoi cette étrange erreur de notation est-elle due à l'ère ? En fait, si vous essayez simplement d'écrire comme ça, nous obtiendrons une erreur. L'argument de type unknown n' est pas assignable au paramètre de type callback error ou undefined, ce qui signifie en fait que dans une cage, chaque Azure est inconnu, ce qui est évident car c'est Sketch et nous ne savons pas ce qui s'est passé. C'est pourquoi nous écrivons catch, mais en fait nous ne pouvons pas utiliser une flèche comme celle-ci et nous pouvons la fournir à l'intérieur suivant, c' est pourquoi nous devons convertir un type de notre époque en quelque chose de significatif. Dans ce cas, j' utilise la flèche S et nous pouvons fournir des erreurs dans la fonction suivante. C'est exactement ce que nous faisons ici. Maintenant, nous devons essayer notre logique pour hacher le mot de passe. Et pour cela, je veux en haut entrer notre gros module js déchiré. Je suis donc en train de saisir be crypt jazz de Big Rip jazz. Et maintenant, dans notre essai, nous pouvons d'abord prendre un sel. Et si vous ne savez pas For be crypt où générer et saler d'abord , puis nous avons fourni fonction de déchiffrement pour hacher le mot de passe. C'est par ici, nous avons besoin d'un sel. Et pour cela, nous sommes Colin qu'il nous a sertis de sel de chien. Comme vous pouvez le voir, il s'agit d'une fonction qui génère de manière synchrone du sel rapide. Et ici, nous pouvons en fournir dix, par exemple. Et il s'agit d'une fonction asynchrone. C'est là que nous devons essayer d'attendre, afin qu'il obtienne rapidement du sel. Et maintenant, nous devons mettre à jour notre mot de passe. En fait, cette fonction est appelée avant d' enregistrer cet enregistrement, ce qui signifie nous avons une référence à tous les champs que nous essayons d'enregistrer. Et ici je vais écrire ce mot de passe point pour changer le champ que nous essayons d'enregistrer. Ici, nous voulons attribuer un hachage de point d'échecs fluage de poids B et en fait un hachage, comme vous pouvez le voir ici, nous aurons notre mot de passe et à l'intérieur nous devons d'abord fournir notre mot de passe, ce mot de passe. Et deuxièmement, dans ce cas, notre mot de passe sera haché et nous allons simplement stocker un hachage dans notre base de données. Dans ce cas, après que nous appellerons ensuite et que nous devons le faire à coup sûr, ce mot de passe sera mis à jour et nous sauvegarderons le dossier vierge. C'est pourquoi à l'intérieur nous voulons écrire return next et nous l'appelons simplement, cela déclenchera l'enregistrement d'un enregistrement dans la base de données. Et la partie la plus importante qui redessine cette logique à l"intérieur du modal vendu cette logique avec sauvegarde est complètement isolée à l"intérieur du modèle. Et lorsque nous écrirons code lié à l'utilisateur, nous ne connaîtrons même pas cette logique. Tout est à l'intérieur du modèle. Cela n'a rien à voir avec recherche d'un utilisateur ou son enregistrement. C'est ce qui se passe à l'intérieur du modèle. La dernière chose dont nous avons besoin pour l'avenir est la fonction valider le mot de passe. Pourquoi en avons-nous besoin ? Parce qu'en fait, lorsque nous essaierons de connecter l'utilisateur, nous voulons comparer non seulement l'e-mail, mais également le mot de passe fourni. Et nous avons une très bonne chose qui s' appelle des méthodes à l'intérieur de Mongoose. Ici, nous pouvons écrire des méthodes de schéma utilisateur, et ici nous voulons créer une nouvelle méthode, par exemple, valider le mot de passe. Et en fait, cela fonctionne exactement de la même manière, comme par exemple, les méthodes à l'intérieur des classes. Nous pouvons donc faire appel à notre instance de notre utilisateur. Cette méthode valide le mot de passe. Et ici, nous devons fournir la fonction. Et encore une fois, je n'écris pas ici la fonction flèche mais juste une fonction ici en obtenant le mot de passe en tant que paramètre. Parce qu'en fait, lorsque nous voulons comparer un mot de passe, nous fournirons quelque chose que nous voulons comparer. C'est ici que mot de passe est une chaîne, et ici à l'intérieur, nous voulons comparer le mot de passe fourni avec notre mot de passe dans notre instance. Ici, nous pouvons simplement retourner be grip js dot compare. Et c'est une fonction qui permet de comparer, tout d'abord, un mot de passe d'avion qui est fourni de l'extérieur. Et deuxièmement, notre chaîne, et c'est ce mot de passe point que nous stockons sous forme de hachage dans notre enregistrement. Notre dernière utilisation ressemblera donc à ceci, où, par exemple, nous avons un utilisateur et que nous voulons l'enregistrer. Nous avons donc ici un nouvel utilisateur. Nous devons le fournir dans notre e-mail. Ensuite, nous devons fournir ici un nom d'utilisateur, puis nous fournirons ici un mot de passe. Après cela, nous essaierons de sauvegarder un utilisateur. allons donc nous appeler ici. Cela permet d'économiser. Et en fait, après que Colin soit aussi mince, notre presse Save sera appelée et nous stockerons le mot de passe correct. Mais après cette ligne, nous pouvons également écrire un mot de passe de validation point utilisateur. Et ici, nous pouvons fournir n'importe quel mot de passe que nous voulons comparer. Cette fonction nous renverra vrai ou faux selon l'exactitude du mot de passe. Et c'est tout à fait correct de faire tout cela dans le modèle User et non dans certains contrôleurs où nous travaillons simplement avec des utilisateurs. Parce que dans ce cas, notre logique est complètement isolée à l'intérieur de l'utilisateur. Et maintenant, il ne nous manque qu'une seule ligne dans notre interface utilisateur types avec document utilisateur défini. Mais en fait, nous devons spécifier dans ce document utilisateur que nous avons écrit ici une nouvelle méthode, validate password. C'est pourquoi ce que je veux faire ici, je veux créer une nouvelle méthode dans validate password. Et nous savons qu'à l'intérieur nous obtenons un paramètre, nous pouvons simplement le nommer param1, et c' est une chaîne, et nous savons que nous obtenons une chaîne de caractères. Dans ce cas, j' utiliserai un document complètement correctement tapé et nous pourrons utiliser plus tard dans TypeScript pour appeler cette méthode de validation du mot de passe et obtenir la saisie semi-automatique. 10. Ajouter un enregistrement: Dans la vidéo précédente, nous avons créé avec succès notre modèle d'utilisateur. Et ils peuvent comprendre que vidéo précédente était vraiment sèche parce que nous venons créer un modèle et vous n'avez pas vu comment nous utilisions ce modèle dans une application réelle. C'est pourquoi le but de cette vidéo est de créer notre méthode d'enregistrement, qui signifie que nous allons enregistrer l'utilisateur, et c'est exactement comme cela que nous utiliserons notre modèle d'utilisateur. Examinons donc notre code. Pour l'instant, nous n'avons qu'un modèle dans les modèles sources. Et ce que nous voulons construire, c'est une architecture MVC. Qu'est-ce qu'il a une moyenne réellement exprimée en tant que cadre. Je n'ai pas d'architecture exprimée avec des routes simplement définies démarrer le serveur Web et nous sommes prêts à partir. Nous n'avons pas beaucoup de règles qui sont définies à l'intérieur. C'est pourquoi nous devons faire quelque chose par nous-mêmes. Et l' architecture très populaire qui utilise bien notre projet back-end est MVC, ce qui signifie en fait la vue du modèle et le contrôleur. Et en fait 90  % des cas, nous n'utiliserons que des modèles et des contrôleurs. Nous n'utiliserons aucune vue simplement parce que nous travaillons et créons un EPI et que nous n'avons pas besoin d'y afficher des vues. Nous répondons simplement par le châtiment et c'est tout. C'est pourquoi mon idée est de créer un nouveau dossier appelé controllers. L'idée principale est qu'ici, sororité S enregistrera tous nos itinéraires. Par exemple, nous avons ici un itinéraire vers la page d'accueil. L'idée principale est que nous n'écrivons pas la logique de cette route directement en tant que callback, nous l'écrirons dans un contrôleur spécifique au site, ce qui signifie en fait toutes nos requêtes que nous voulons scinder différents contrôleurs. Par exemple, nous avons un contrôleur utilisateur et il y a eu émeutes dans toutes nos actions concernant l'inscription, la connexion, la déconnexion de l'utilisateur, etc. Ensuite, nous avons un contrôleur de carte où nous écrirons à l'intérieur de tout ce qui est lié à la carte. partie la plus importante est que modèle interne définirait façon dont nous travaillons avec la base de données. Nous créons donc notre entité comme utilisateur, mais à l'intérieur du contrôleur en utilisant cette entité. Et nous créons certaines réponses de notre API, ce qui signifie en fait que nous séparons notre logique. Tout ce qui était la base de données va aux modèles, mais nous utilisons des modèles dans de tels contrôleurs. C'était donc la théorie. Créons maintenant notre premier contrôleur. Et pour cela, je veux m' inscrire ici dans votre itinéraire, et ce sera un itinéraire pour l'enregistrement. C'est pourquoi nous avons ici la publication de l'application et l'URL sera celle des utilisateurs de slushy pie slash. Voici le registre des points de notre contrôleur d'utilisateurs. Donc notre première règle ici est que toutes nos URL, nous allons commencer par une API slash, parce qu'en fait c' est vraiment sympa d' avoir un espace de noms pour notre API. Deuxièmement, comme vous pouvez le voir là où ce n'est pas important, quelque chose comme register où les entrées ici sont contrôlées par tout l'utilisateur et nous devons avoir un bon nommage. Le nom typique et pour les contrôleurs est toujours plus actif que, par exemple, contrôleur d' un utilisateur et non le contrôleur utilisateur. Importons maintenant l'étoile lorsque les utilisateurs la contrôlent. Et si vous ne savez pas ce que cela fait, l'idée principale est qu'à l'intérieur nous aurons un tas de fonctions. Et cette fois en tant que groupes, toutes ces fonctions se trouvent à l'intérieur de cet objet. Ensuite, nous pouvons écrire quelque chose comme registre des points du contrôleur des utilisateurs. Ici, nous voulons l' importer, et ici nous avons la barre oblique de nos contrôleurs, et ici nous allons créer des utilisateurs de fichiers. Et comme vous pouvez le voir, cela n'a aucun sens de nommer ce fichier users controllers, car ce fichier se trouve directement à l'intérieur des controllers. C'est par ici, nous allons sauter pour que ce soit des contrôleurs. Et voici users.js. Et voici notre dossier qui est un contrôleur. Et puis dites que c'était juste, toutes les actions qui sont liées à l'entité utilisateur. Maintenant sur la droite, je veux ouvrir notre serveur Ts. Et comme vous pouvez le voir, en fait, cette partie que vous pouvez voir ici est ce que nous écrivons à l'intérieur du contrôleur. C'est donc notre rappel. Et comme vous pouvez le voir, il s'agit simplement d'une fonction simple avec la réponse à la requête. Et le troisième paramètre ici peut être le suivant. C'est pourquoi ce que je veux faire ici, je veux créer une fonction qui s'appelle register. Et il s'agit d'une fonction asynchrone. Pourquoi avons-nous besoin ici d'une fonction synchrone, parce que nous allons travailler avec la base de données et ces requêtes pour notre base de données ou en tant que synchrone. Et ici, nous obtenons comme argument est d'abord une demande, ensuite une réponse, et le dernier est le suivant. Et ce n'est qu'une fonction. Donc c'est exactement la même chose que nous collons ici directement, mais nous l'avons simplement déplacée à l'extérieur, à l'intérieur de notre contrôleur. Mais ce code est mauvais. Pourquoi est-ce que c'est ? Parce qu'en fait, nous n'avons pas saisi notre réponse à la demande. Et ensuite, ici je peux écrire deux points, et voici notre demande. Et c'est la partie la plus importante. Nous avons ici une requête qui provient de l'API Fetch. Nous n'en avons pas besoin, mais nous avons besoin d' une demande qui vient d'une expression. C'est ici, demande d'importation d'express. Et comme vous pouvez le voir maintenant, nous avons une définition complètement différente. Nous avons ici la robe intérieure, le corps, le corps de la demande. Et c'est exactement ce dont nous avons besoin. En outre, nous avons besoin ici non seulement d'une demande mais d'une réponse, et je suis en Grande-Bretagne ici également une réponse. Tapez ici response en tant que réponse. Et le dernier n'est pas le suivant, mais la fonction suivante. Ici, nos deux entrées sont correctes. C'est de l'expression. C'est ainsi que nous allons généralement créer une nouvelle action du contrôleur. Peu importe qu'il s'agisse un contrôleur utilisateur ou d' un contrôleur d'article, ce sera toujours le même. Maintenant, directement à l'intérieur, ils veulent écrire try-catch. Pourquoi est-ce que c'est ? Parce qu'en fait, nous allons écrire un code synchrone avec async wait dans cette fonction. Et nous voulons gérer toutes les erreurs. Et le moyen le plus simple a été exprimé pour gérer une erreur est d'utiliser next, et nous l'avons déjà utilisé précédemment dans notre modèle. Ici, cela fonctionne exactement de la même manière. Donc nous pouvons écrire ici, essayer et nous avons une cage et nous obtenons une erreur. Ce que nous voulons faire, celui à appeler ici ensuite et à lancer l'erreur. C'est ça en fait, est une seule ligne qui propagera notre erreur à exprimer, puis express montrera Sarah à l'écran. Maintenant, à l'intérieur, nous voulons créer un utilisateur car en fait, il s'agit l'enregistrement et l'enregistrement signifie simplement créer un utilisateur. C'est pourquoi je souhaite importer le modèle utilisateur à partir de. Et ici, nous avons nos modèles slash user model que nous avons créés précédemment. Et comme vous pouvez le voir ici, je ne l'ai pas nommé user avec un U majuscule, mais j'ai utilisé le modèle. C'est juste pour être parfaitement clair dans notre code que nous travaillons avec le modèle. Et maintenant, nous pouvons utiliser ce modèle à l'intérieur. Nous pouvons donc écrire ici const, et voici un nouvel utilisateur, parce que nous voulons enregistrer un nouvel utilisateur et nous sommes ici dans le modèle utilisateur hue. Et maintenant, à l'intérieur, nous devons transmettre quelques données. Dans notre cas, nous devons passer ici en homme que nom d'utilisateur et mot de passe. Nous voulons donc écrire cela ici. Nous voulons définir un e-mail, et il s'agit d'un e-mail point body dot. Ensuite, nous voulons définir ici username, et ceci est request point, point username. Et le dernier est mot de passe, et c'est le mot de passe du point du corps du point de demande. Mais ici, nous avons un énorme problème. Par défaut, express ne peut pas fonctionner avec l'ébullition et, par défaut, express ne lui transmettra pas de tau. C'est pourquoi ce que nous devons faire, nous devons installer un package supplémentaire pour cela. Et ce package s'appelle BodyParser. C'est pourquoi je vais sauter dans la console et savoir que je suis à l'intérieur du serveur. Je vais écrire npm install. Et ici, nous voulons installer BodyParser. J'appuie sur Entrée et le package est installé. Nous pouvons maintenant redémarrer notre serveur et revenir en arrière. L'idée principale est donc qu' ici à la place de la sororité S, je vais importer mon analyseur corporel. Appelons-le BodyParser avec CamelCase et nous l' importons à partir du package BodyParser. Maintenant, quelque part ici, avant de faire nos routes, nous pouvons écrire ab use et à l'intérieur nous voulons essayer BodyParser dot json. Et en fait, ici, vous pouvez vérifier directement ce que fait BodyParser Jason et il renvoie un middleware, le tone lip analyse JSON et c'est exactement ce que nous voulons. Nous voulons transmettre notre JSON, mais ce n'est pas seulement cela, mais nous voulons également un analyseur de corps IPO supplémentaire. Et ici, l'URL sera codée par point. Et à l'intérieur, nous fournissons des services étendus à travers ce que font ces deux lignes. La première ligne recherchera simplement le type de contenu json d'application , puis les parents d'un corps dans le JSON. Nous pouvons donc travailler avec notre corps comme un objet et c' est extrêmement facile. À la ligne suivante, nous ferons exactement la même chose , sauf pour les chaînes codées en URL. Ensuite, nous aurons aussi notre corps. Ainsi, avec cette configuration dans chaque projet, vous pouvez travailler normalement avec l'API où vous avez body comme adjacent. Et c'est exactement ce que nous faisons ici. Nous lisons le corps à la demande. Maintenant, je veux connecter notre nouvel utilisateur par console afin que nous puissions vérifier à quoi il ressemble. Et après cela, je veux essayer de sauvegarder l'utilisateur. Donc, ici, nous pouvons essayer l'utilisateur enregistré, et ici nous pouvons appeler un poids dans votre sauvegarde de points utilisateur. Cette ligne unique créera un nouvel utilisateur France dans la base de données. C'est pourquoi je veux ici consigner l' utilisateur enregistré, le coma, l'utilisateur enregistré. Maintenant, je veux utiliser un tel outil qui s' appelle Postman pour faire une demande. Et si vous n'avez pas de facteur sur votre machine, vous pouvez simplement passer à Postman. Ne le chargez pas ici. C'est totalement gratuit. Il comporte des niveaux payants, mais nous n'en avons pas besoin pour notre cours. Ici, on dirait. Et en fait, ce que nous voulons faire, faire une demande de publication sur notre URL. Et ici, nous avons notre hôte local pour 1001 utilisateurs de slash slash. Maintenant, nous devons sauter au corps et sélectionner ici mal. Et sur la droite, nous pouvons dire que c'est adjacent. Ce que nous voulons maintenant passer à l'intérieur est un objet avec trois champs. Tout d'abord, nous avons ici un e-mail, par exemple, foo sur gmail.com. Ensuite, nous avons notre champ nom d'utilisateur, par exemple foo, et nous avons notre champ mot de passe, par exemple 123. Nous allons maintenant envoyer une demande et vérifier si elle fonctionne. Comme vous pouvez le constater, la demande est bloquée. Et c'est tout à fait normal parce qu'en fait ici mais je n'ai pas appelé Rest Jason par exemple. C'est pourquoi c'est une arme de poing. Mais maintenant, nous pouvons passer à l'intérieur la console et voici notre sortie. Tout d'abord, nous pouvons voir ici notre nouvel utilisateur. C'est avant d'enregistrer. C'est ce que nous avons après Colin, le nouveau modèle d'utilisateur, ce qui signifie en fait que nous jetons à l'intérieur ces trois champs et que nous obtenons l'utilisateur d'une seule Goose. Et comme vous pouvez le voir, la principale différence de notre objet est que nous avons ici NAD, qui est un AD MongoDB, et il a été généré automatiquement rapidement. Et en fait, après cela, nous pouvons utiliser ce nouvel utilisateur et l'enregistrer, par exemple, base de données avec la méthode de sauvegarde par points, ce qui est extrêmement facile. Et la partie la plus importante est ici l'utilisateur enregistré. Il s'agit de notre utilisateur enregistré, qui provient de la base de données. Comment pouvons-nous savoir qu' il est déjà enregistré ? Tout d'abord, nous voyons ici notre mot de passe et notre mot de passe ici. Nous avons donné 123, mais ici nous ne l'avons pas enregistré comme 123. Il s'agit d'un mot de passe haché. Pourquoi cela se produit-il ? Parce qu'en fait nous définissons le modèle et que nous avons ici une méthode appuyez sur Enregistrer. Et juste pour vous rappeler, ici nous avons généré un hachage à partir de notre mot de passe et nous l'enregistrons avec la crypte au lieu du mot de passe. Et c'est un modèle extrêmement important. Nous ne voulons pas écrire ici logique concernant le remplacement du mot de passe par le hachage. Cela n'a aucun sens car nous voulons définir un modèle avec une certaine logique. Et puis ça se passe comme par magie parce que c'est défini. Dans ce cas, nous enregistrons, nous venons de changer notre mot de passe et notre hachage et à l'intérieur de notre contrôleur sans rien savoir à ce sujet. Les mêmes objectifs concernant ces champs créés et mis à jour à. Ces deux champs ont été ajoutés pour nous parce que nous avons défini ici les horodatages vrais. Notre utilisateur a donc été enregistré avec succès dans MongoDB. Mais en fait, nous ne pouvons pas simplement lancer l' utilisateur enregistré en tant que réponse. Est-ce que tout d'abord, nous n'avons pas besoin de tous les champs et bien sûr, nous ne devrions jamais donner ce mot de passe à l'extérieur. Et en fait juste pour vous rappeler ici, l'intérieur de l'utilisateur de nos modèles, nous avons dit que le mot de passe n' est pas sélectionné, il est sélectionné faux. Mais en fait, après avoir enregistré l'utilisateur ici, ce mot de passe est renvoyé rapidement. Et en fait, si nous nous en sortons bien, nous n'obtiendrons pas le champ du mot de passe. Mais après avoir enregistré, l'utilisateur l' obtiendra évidemment. C'est pourquoi nous devons créer une réponse adaptée à nos besoins. C'est pourquoi je veux créer une fonction supplémentaire, normaliser l'utilisateur. Et ici, nous obtenons l'utilisateur et nous savons qu'il s'agit d'un document utilisateur. Et comme vous pouvez le voir dans notre document utilisateur, nous pouvons entrer à partir de l'interface utilisateur de types. Juste pour vous rappeler, utiliser un document est juste comme un objet utilisateur avec ID et méthode de validation du mot de passe. Et comme vous pouvez le voir ici, nous pouvons inspecter un nouvel utilisateur et nous pouvons voir que c'est utiliser un document et la propriété, c'est exactement ce que nous passons ici et ici dans cette fonction, nous voulons renvoyer l'utilisateur normalisé pour l'API. Donc tout d'abord, nous aurons ici un e-mail, c'est l'e-mail point de l'utilisateur. Ensuite, nous voulons notre nom d'utilisateur. Il sera utilisé nom d'utilisateur, et le dernier est 80, c'est l'ID de point utilisateur. Et juste pour vous rappeler, dans MongoDB ou les dames sont stockées avec un identifiant de soulignement. Mais en fait, dans Mongoose, nous pouvons les utiliser dans les deux sens, comme l'identifiant du trait de soulignement et comme le point AD. Cette méthode existe déjà et c'est simplement comme références underscore id. Donc je vais normaliser l'utilisation d'une fonction complètement prête et maintenant nous pouvons appeler ici eat lorsque nous répondons avec cet utilisateur enregistré. Je peux donc simplement écrire ici en tant que sable et à l'intérieur, nous passons un utilisateur normalisé et voici notre utilisateur enregistré. Allons voir si ça fonctionne. Nous n'avons aucune erreur sur le serveur Web. Je vais ouvrir ici Postman et appuyer à nouveau sur Envoyer. Et comme vous pouvez le voir avec succès dans normalisation de notre utilisateur et nous ne sommes pas arrivés ici, par exemple, le mot de passe de retour, ce qui est extrêmement important. Mais voici quelque chose que je n'aime pas dans nos réponses. En fait, nous avons fait quelques validations à l'intérieur d'un modèle. Mais si je supprime le nom d'utilisateur ici et que je clique sur Envoyer, nous obtenons 500. Et il s'agit en fait d' une page HTML avec une certaine validation ici. Ce n'est pas ce que nous voulons, ce que nous pouvons faire ici, nous pouvons utiliser le sketch et lire les messages de notre époque. Mais le problème principal est que notre erreur n'est pas toujours une erreur de validation. Il peut s'agir, par exemple, de 500, mais nous pouvons également obtenir des erreurs de validation. Et la façon la plus correcte de le vérifier dans TypeScript est la suivante, où Azure est une instance d'erreur de validation Azure DOD. Mais ici, il est important de saisir correctement l'erreur car nous voulons importer cette erreur depuis Mongoose. Je suis donc en train de saisir notre époque depuis Mongoose. Dans ce cas, il sera traité correctement car en fait, ici, cette erreur de validation est une classe de mangouste. Et si nous avons des erreurs de validation de Mongoose, nous pouvons les traiter ici. Essayons-le dans le journal de la console et voyons ce que nous obtenons ici. Je vais appuyer à nouveau sur Envoyer. Et comme vous pouvez le voir dans la console, nous obtenons ici des erreurs. Et c'est un objet. Ce qui signifie que nous pouvons lire les messages du sujet et les afficher à l'écran. Ici, je veux créer un message de propriété. Et ici, nous pouvons écrire des valeurs de points d' objet, qui liront les valeurs de notre objet. Et à l'intérieur, nous lançons des erreurs. C'est exactement ce que nous obtenons de Mongoose et nous voulons passer en revue tous les champs. Et ici, nous obtenons une erreur et nous avons juste besoin d'un message d'erreur. Ce sera donc un tableau de chaînes. Maintenant, nous pouvons simplement écrire l'état du risque de retour, par exemple, quatre contre deux, ce qui signifie une entité non traitable. Et voici les messages JSON point, ce qui signifie que lorsque nous recevons des messages de validation, nous répondons avec ce statut et que nous affichons ces messages d'erreur, nous n'avons pas toute erreur dans la console. Essayons donc à nouveau. Je suis en train de frapper le sable et nous recevons de bons messages d'erreur. Le nom d'utilisateur est requis pour cela car ici nous avons vérifié à l'intérieur de la cage, par exemple, de la classe, nous avons normalisé nos messages ici et nous avons répondu avec eux. Et en fait, il est très logique de déplacer cette fonction plus tard vers un déplacer cette fonction plus tard vers assistant, car nous ferons exactement la même chose encore et encore, où nous en aurons une qui sera validée. Et voici la dernière étape que nous voulons franchir. Nous avons besoin que notre client fournisse un jeton, ce qui signifie que lorsque notre utilisateur est logger tin, nous générons un jeton unique pour effectuer une authentification DVT. Qu'est-ce que cela signifie ? Nous avons un jeton de chaîne spécial que nous lançons sur le client. Ensuite, le client peut joindre ceci pour être t à l'en-tête. Et plus tard, nous vérifierons si la demande est authentifiée et que le diffuseur est autorisé à effectuer certaines modifications. Mais dans cette vidéo, nous devons simplement insérer dans notre réponse, le jeton GBT que nous allons générer. Et pour cela, nous devons installer un package supplémentaire. Ici, je vais écrire le jeton Web JSON d'installation npm. Et ce n'est pas seulement qu'il voudra également taper. Voici donc les types slash JSON web token. Nous avons donc installé deux packages , puis redémarré mon serveur Web. Maintenant, revenons en arrière. Ici, nous voulons importer maintenant notre JSON Web Token, ou simplement DVT. Essayons-le ici en productivité à partir du jeton Web JSON. Et maintenant, ce que nous voulons faire ici à l'intérieur de normalize, et c'est le meilleur endroit pour le faire, parce que nous avons ici tout l'utilisateur et nous construisons quelque chose qui n'est pas lié à la base de données. Nous voulons donc générer ici notre objectif. Et pour cela, nous sommes juste Colin, points GBT signent l'intérieur. Nous devons fournir une charge utile et une clé secrète. Alors, que montrons-nous la charge utile d' aperçu ici ? Tout d'abord, nous voulons obtenir une annonce et il s'agit d'un identifiant de point utilisateur , puis d'un e-mail. C'est user.email. En fait, il nous suffit de fournir juste un identifiant pour pouvoir l'utiliser plus tard par ID. Mais le courrier électronique est également agréable à avoir pour validation et compréhension avec Susan et ce qui est secret ici. C'est juste une chaîne aléatoire qui nous aidera à décoder puis à appeler des jetons. Donc, ce que nous voulons faire ici dans ces services, créer un nouveau fichier. Par exemple, config point ds. Ici, nous allons stocker toutes les propriétés nécessaires comme par exemple, secret. Donc ici, je veux juste exporter, const, notre propriété secrète et ils le nommeront secrets, évidemment pour des raisons de production, vous voulez avoir ici quelque chose de plus sûr. Peut-être un hachage long comme 12 symboles. Maintenant, nous pouvons utiliser le secret ici simplement en inversant notre secret pour John. Et voici notre fichier de configuration. Maintenant, au lieu de cette clé secrète ou privée, je vais simplement écrire un secret. Donc, ce que fait cette ligne, elle génère un jeton qui n'est qu'une chaîne. Et maintenant, nous devons ajouter ce symbole à notre réponse. Vérifions-nous si cela fonctionne, mais nous n'avons aucune erreur. Allons à l'intérieur. Facteur, appuyez sur Envoyer. Comme vous pouvez le voir ici, je dois fournir mon nom d'utilisateur. Par exemple, pour, regardons ça. Ici, nous obtenons tous nos champs et nous parlons également. Et comme vous pouvez le voir, notre jeton n'est qu'une chaîne unique que nous attacherons à toutes vos requêtes sur le client et que nous décoderons sur le backend, ce que nous ferons dans nos prochaines vidéos. Nous avons donc mis en œuvre avec succès notre méthode d'enregistrement notre méthode d'enregistrement avec validation et normalisation de notre API. 11. Implémenter le login: Dans les vidéos précédentes, mais entièrement implémenté notre méthode de registre dans cette vidéo, nous voulons implémenter le début de notre utilisateur, mais en fait, je veux que vous essayiez de le faire vous-même car ce sera super similaire à l' inscription et nous sommes déjà tout préparés. Alors de quoi as-tu besoin pour faire un orteil ? Tout d'abord, insights server.js, vous souhaitez créer un nouvel itinéraire. Et en fait, nous avons déjà notre itinéraire pour l'inscription. Nous devons maintenant en créer un pour la connexion. Par exemple, nous pouvons créer une chaîne slash api slash users slash login. Maintenant, ici dans ce contrôlable doit créer une nouvelle connexion de méthode. La question est évidemment de savoir ce que nous allons atteindre et ce que cette méthode doit faire. Et en fait, insérez Postman, nous pouvons simplement essayer de l'utiliser. Donc, ici, vous aurez un identifiant slash et au lieu de e-mail, nom d'utilisateur, mot de passe, nous lançons simplement à notre demande e-mail et mot de passe. Nous n'avons pas de nom d'utilisateur car il s'agit identifiant et d'une adresse e-mail unique. Et ici, vous avez deux variantes possibles, comment vous pouvez l'implémenter. La première variante est plus facile. Vous voulez simplement lire un e-mail dans le corps du message. Vous voulez essayer de trouver l'utilisateur dans la base de données et le renvoyer à nouveau. Et n'oubliez pas d'utiliser l' utilisateur normalisé parce que nous avons besoin de cette discussion. Et aussi, si vous souhaitez une approche plus difficile, vous pouvez également essayer de valider non seulement l'e-mail mais également le mot de passe pour cette méthode de validation dans notre modèle. Mais même si vous essayez de faire le premier pas par vous-même, c'est très bien. Si vous souhaitez implémenter l'une d'entre elles, mettez simplement la vidéo en pause maintenant, et maintenant, faisons-le ensemble. Notre première étape sera donc de sauter à l'intérieur de nos sororités. Ici, nous voulons créer un nouvel itinéraire. Nous avons donc ici un article car il s'agit d'une demande de publication suite à la Guinéenne. Et ici, nous avons la barre oblique utilisateur CPI slash login. Et voici la méthode de connexion point de notre contrôleur utilisateur, que nous allons créer dans une seconde. Maintenant, je vais sauter dans l'utilisateur de sauvegarde des contrôleurs et ils ne copieront rien parce que nous voulons essayer de l'écrire à partir de zéro. Nous avons donc ici notre méthode de connexion et nous savons qu'il s'agit d'une méthode asynchrone où nous recevons notre demande, qui est exactement comme haut à l'intérieur de l'enregistrement. Deuxièmement, nous avons ici notre réponse, qui est une réponse de type. La dernière est la suivante, c'est la fonction suivante. Et maintenant, dans notre fonction, nous voulons écrire, essayer et attraper. Donc, à l'intérieur de la cage, nous aurons notre ère et ils veulent juste la propager à l'ère suivante. Pourquoi ça ? Parce qu'en fait, ici, nous n' aurons aucune règle de validation, mais nous allons juste vérifier, oh, validation dans notre try et non dans catch. Que devons-nous faire à l'intérieur ? Ici, nous obtenons notre corps de demande avec e-mail et mot de passe à l'intérieur. Et notre première étape consiste à essayer de faire entrer cet utilisateur dans la base de données. Ici, nous pouvons écrire un K. Nous avons besoin de notre utilisateur et réessayez avec un modèle d'utilisateur de poids en trouver un. Et comme vous pouvez le voir ici, nous avons find by ID, find and find one. Donc, en utilisant model.fit find, on essaie trouver tous les documents sous forme de tableau par un prédicat. Par exemple, nous pouvons trouver ici une liste par champ actif. Trouvez-en un. Nous ferons de même mais très bien, juste un seul disque. C'est ce que nous voulons utiliser et parfois nous aurons besoin de trouver un élément par ID. Ici, nous avons une belle amende par la méthode. Et comme vous pouvez le voir ici, nous avons également beaucoup d'autres méthodes, comme par exemple, trouver une, supprimer et mettre à jour, etc. Mais pour l'instant, nous allons utiliser find one, puis nous avons dit Nous devons donner un prédicat en tant qu'objet. Et ici, nous avons notre e-mail et c' est l'e-mail du corps de la demande. Donc, en fait, ce paquebot va essayer de trouver notre dossier dans la collection de l'utilisateur par ce mail. Ici, comme vous pouvez voir où obtenir le document utilisateur. Mais en fait, ce n'est pas vrai parce que nous pouvons arriver ici maintenant et pas un document parce que peut-être la femme n'existe pas. C'est par ici. Je veux vérifier si nous n'obtenons pas d'utilisateur, puis nous voulons lancer une erreur. Et pour cela, nous pouvons simplement renvoyer notre statut de point de réponse. Ici, nous avons la photo au statut comme précédemment. Et ici, nous voulons renvoyer du JSON. Et en fait, ici avec pas de validations différentes. Dans tous les cas, nous renvoyons simplement un identifiant ou un mot de passe invalide. C'est ici au sommet. Je peux créer et enregistrer dans l'objet nos erreurs. Je veux donc créer des erreurs. Il s'agit d'un objet avec un champ, e-mail ou un mot de passe, par exemple. Et ici, la valeur est une adresse e-mail ou un mot de passe incorrect. L'essentiel est donc que nous avons exactement la même structure de nos erreurs, comme nous l'avons fait dans tous les autres endroits. Ici, nous renvoyons simplement nos erreurs dans JSON. Si nous n'avons pas d'utilisateur. Ensuite, nous pouvons répondre à nos utilisateurs. Voici donc du sable et ici nous pouvons appeler notre utilisateur normalisé et nous avons fourni un utilisateur d'insertion que nous avons trouvé. Et en fait, si vous avez écrit ce code même sans cette erreur, vérifiez votre golden, car vous avez essayé de faire quelque chose par vous-même. Voyons maintenant si ce code fonctionne. Nous n'avons donc aucune erreur ici dans le serveur Web. Ouvrons notre facteur et cliquons sur Envoyer. Et comme vous pouvez le voir ici, cela fonctionne déjà. Voici notre slash api slash users slash login. Il s'agit d'une demande post avec nos deux champs. Ici, nous obtenons le bon utilisateur avec le Tonkin. Et en fait, si ici, notre e-mail n'existe pas, envoyé masqué et que nous obtenons un objet avec un e-mail et un mot de passe, un e-mail ou un mot de passe incorrect, ce qui signifie en fait que nous avons réussi mis en œuvre notre poumon kenyan de l'utilisateur. Mais ici, il ne nous manque qu'une petite chose, et c'est validé du mot de passe, mais c'est extrêmement facile à utiliser Juste parce que nous avons déjà tout préparé à l'intérieur de notre modèle. Et juste pour vous rappeler que dans notre modèle d'utilisateur ici en bas, nous avons cette méthode de validation du mot de passe et nous utilisons ici be crypt compare, où nous comparons le mot de passe de l'utilisateur avec une chaîne. C'est exactement ce que nous voulons faire ici. Nous pouvons simplement créer une variable avec le même mot de passe. Ici, nous voulons appeler le mot de passe de validation point utilisateur. Et comme vous pouvez le voir, nous avons ici notre saisie semi-automatique du TypeScript. Et en fait, nous obtenons cette saisie semi-automatique simplement parce que dans notre document d'interface utilisateur, nous avons écrit cette ligne. Si vous n'avez pas écrit cette ligne ici, vous ne les obtiendrez pas automatiquement. Nous avons donc ici notre mot de passe de validation et à l'intérieur nous voulons fournir une chaîne pour vérifier s'il est correct. Et voici le mot de passe du corps de la demande Et en fait, si ces mots de passe sont égaux, alors nous obtiendrons ici Boolean. Mais comme vous pouvez le voir, nous obtenons une chaîne, ce qui signifie que quelque chose ne va pas. Regardons notre interface. Validate password renvoie une chaîne, elle est incorrecte, elle doit être booléenne ici. Now is same password renvoie un faux booléen. Et ici, nous pouvons écrire une condition. Par exemple, si aucun mot de passe n'est le même, nous voulons renvoyer exactement la même erreur. Je vais donc copier-coller ici. Depuis l'état des deux erreurs JSON, vérifions-le. Je suis assis ici et on a un bon utilisateur. Mais que se passera-t-il si nous lançons ici un mot de passe incorrect ? Je clique ici envoyer et nous obtenons une erreur. Regardons donc à l'intérieur de la console. Ici, nous recevons un message assez étrange, argument illégal, une chaîne non définie. Et comme vous pouvez le voir ici dans notre trace de pile, cela provient de notre contrôleur et nous entendons par défaut notre ligne Model Ts source. Passons donc à l'intérieur de notre modèle Ts line 44. Comme vous pouvez le voir, c'est notre grande comparaison de cryptes. La question est de savoir quel est le problème. C'est pourquoi ce que nous pouvons écrire ici c'est valider le mot de passe. Et voici tout d'abord notre mot de passe et ce mot de passe. Et en fait, je veux juste voir ceci, pour savoir que nous sommes du bon côté. Notre serveur est redémarré. Allons vérifier le son. Je clique sur Envoyer un regard infini à l'intérieur de la console. Et comme vous pouvez le voir ici, plus nous verrons bien, tout d' abord, valider le mot de passe. C'est une chaîne et voici notre objet. Mais comme vous pouvez le voir dans ce sujet, avec don't have password, c'est pourquoi nous ne pouvons pas comparer l'objet avec le mot de passe parce que nous n' avons pas de mot de passe. Pourquoi ne l'avons-nous pas ? Parce qu'en fait , en haut, nous avons dit pour le mot de passe, sélectionnez false, ce qui est tout à fait correct. Dans 99 % des cas, nous ne voulons pas sélectionner de mot de passe parce que c'est sûr. Mais en fait, dans ce cas précis, dans cette méthode de connexion, nous ne pouvons pas travailler sans mot de passe car nous devons comparer notre mot de passe de l'utilisateur. C'est pourquoi ce que nous pouvons faire, nous devons supposer qu'il en trouve un. Il obtient donc également un mot de passe. Et pour cela, nous pouvons écrire point select. Voici une chaîne à l'intérieur que nous écrivons plus mot de passe. Et en fait c'est une très bonne notation parce que nous pouvons utiliser ici plus le mot de passe, moins la biographie et ainsi de suite. Si nous voulons supprimer ou ajouter des champs spécifiques, dans ce cas, pour cette demande spécifique, nous obtenons non seulement le champ utilisateur complet, mais également le champ mot de passe. Et maintenant, si nous réessayons, je suis sur le sable. Nous pouvons vérifier et dire console. Et maintenant nous obtenons notre utilisateur avec le mot de passe, qui est haché, et puis nous n'avons pas d'erreur, mais cela ne fonctionne pas correctement parce que j' ai un mauvais mot de passe et nous obtenons toujours l'utilisateur, pourquoi cela se produit. Et en fait, si nous examinons ici notre méthode de validation du mot de passe que nous utilisons ici big crypt compare. La question est de savoir ce que nous obtenons ici, nous pouvons voir dans les Taiping qui recevaient une promesse booléenne. Et c'est extrêmement important. Il s'agit d'une opération asynchrone. Il n'est pas synchrone. C'est ainsi que nous devons revenir à l'intérieur de notre interface utilisateur types. Et ici, nous pouvons dire que nous obtenons le booléen. Il s'agit en fait de Rami du booléen. Et maintenant c'est complètement correct parce que maintenant si nous allons sauter dans notre contrôleur ici, nous avons utilisé le mot de passe de validation. Nous voyons que nous sommes en train de récupérer promise Boolean Maintenant le même mot de passe est promis booléen, qui n'est pas ce que nous voulons. C'est là que nous pouvons écrire un poids et cela va tenir notre promesse. Et ici, nous allons obtenir notre booléen. Comme vous pouvez le constater, TypeScript nous aide vraiment beaucoup à comprendre les bonnes saisies. Et nous pouvons toujours vérifier quel type nous avons. Ici. Nous obtenons le même mot de passe et il devrait fonctionner. Allons voir ça à l'intérieur de Boltzmann. Je suis sur le sable et nous recevons un message, un passe par e-mail ou un mot de passe incorrect. Ici, avec le mot de passe correct, 123, nous récupérons notre utilisateur et c'est exactement la demande de connexion implémentée. 12. Créer des middleware auth: Dans cette vidéo, je veux parler des middlewares. Qu'est-ce qu'un middleware ? Généralement, lorsque nous faisons une demande du client au backend, nous lançons simplement cette requête à l'intérieur de notre parcours. Ensuite, à l'intérieur du contrôleur, c'est exactement ce que nous avons fait ici dans notre serveur source. Donc, ici, nous avons deux demandes de publication, enregistrement et connexion, et nous sautons simplement à l'intérieur de notre contrôleur, ce qui signifie en fait ici insérer le contrôleur, nous recevons une demande et une réponse. intergiciel est quelque chose qui peut être appelé avant que nous n' arrivions ici, ce qui signifie en fait qu'un intergiciel est appliqué sur le back-end, mais avant que notre requête ne se trouve deux-points dans notre contrôleur ou à l'intérieur de notre route, Kohlberg, en faisant des middlewares du tout. Si vous devez faire quelque chose avec request avant que cette requête n'entre dans le contrôleur, c'est exactement à ce moment que vous avez besoin d'un middleware. Des intergiciels, avons-nous besoin dans notre projet ? Il s'agit de l' intergiciel d'authentification. Pourquoi en avons-nous besoin ? Imaginez juste que chaque fois que nous avons besoin de faire quelque chose avec Strategist chez l'utilisateur, nous devons vérifier son jeton, ce qui signifie en fait dans chaque méthode, comme par exemple ici s'inscrire, nous obtenons le jeton de l'utilisateur. Nous devons transmettre ce signe. Nous devons valider ce jeton, et nous devons trouver l'utilisateur actuel avec ce jeton. Et cela n'a aucun sens d'écrire ce code dans chaque action du contrôleur. C'est pourquoi nous devons créer un middleware que nous réutiliserons partout. C'est pourquoi je veux sauter ici dans le dossier source et créer ici un nouveau dossier, qui s'appelle middle. Alors qu'ici nous pouvons stocker tous nos middlewares. Et le premier intergiciel que nous devons créer est hiboux point ts. Et en fait, qu' est-ce que le middleware ? Ce n'est qu'une fonction. C'est pourquoi je souhaite exporter la default et la fonction synchrone. Et vous vous demandez peut-être, d'accord, mais pourquoi est-ce synchrone ? Nous obtenons simplement ici notre demande et faisons quelque chose avec elle. Parce qu'ici, nous voulons également travailler avec la base de données. Si nous avons un jeton, celui-ci est valide. Nous voulons lire une idée de l'utilisateur à partir de ce jeton et obtenir cet utilisateur dans la base de données. Nous pouvons donc utiliser cet utilisateur qui sera préparé ultérieurement dans notre contrôleur. C'est pourquoi il s'agit d'une fonction asynchrone. Nous recevons ici une réponse à la demande. Et ensuite, exactement comme nous l'avons fait précédemment, ici, tapez notre demande, puis nous aurons notre réponse. La dernière ici sera notre fonction suivante, qui sera la fonction suivante à partir de R exprimé. Et ici, je vais inverser en haut notre demande et notre réponse. Et cette fonction ne renvoie rien. C'est pourquoi il s'agit d'une fonction vide. Et à l'intérieur de cette fonction, nous voulons lire le jeton de notre requête, mais je ne vais pas directement encapsuler tout notre code avec try catch. Pourquoi est-ce que c'est ? Parce que nous allons essayer de faire des requêtes asynchrones à notre base de données et cela peut échouer. C'est pourquoi ici, c'est une bonne approche pour écrire try-catch où nous obtenons notre flèche puis notre capture latérale. Nous voulons juste prendre les risques et statut et voici 401. Vous pouvez demander, d'accord, mais pourquoi n'avons-nous pas affiché d'erreur ici ? Parce qu'en fait, on s'en fout. Il s'agit d'un intergiciel permettant de vérifier notre authentification. Si, pour une raison quelconque, nous ne pouvons pas analyser la conversation, parler et écouter, c'est valide. Nous n'avons pas pu trouver cet utilisateur de toute façon, cela signifie que notre utilisateur n' est pas connecté. C'est ici que nous sommes directement notre statut 401. Maintenant, nous devons lire notre statut. Donc, ici, je veux créer notre en-tête et nous pouvons obtenir notre en-tête à partir d' en-têtes de points de demande, d'autorisation de points. En fait, cela signifie que nous allons stocker notre jeton dans notre en-tête d'autorisation. Et en fait, une approche typique, j'espère que nous implémenterons notre autorisation de devoir est que nous avons ici la clé d'autorisation, c'est notre en-tête et la valeur ici sera le jeton d'espace porteur. Nous aurons donc ici un flux unique. C'est pourquoi nous devons diviser notre jeton en conséquence. Mais tout d'abord, nous lisons ici notre en-tête et il se peut qu'il ne soit pas défini. Dans ce cas, nous pouvons simplement dire que pour 01, c'est y ici. Si nous n'avons pas notre en-tête, nous pouvons simplement copier-coller cette ligne avec des silences et un statut pour 01. Après cela, nous devons vraiment analyser notre jeton. Nous allons donc parler et voici notre entête divisée, et c'est juste une chaîne qui a été divisée par un espace. Nous obtenons donc un tableau avec deux éléments. Comme vous pouvez le voir ici. En première position, nous aurons mieux. Et en deuxième position , ce sera notre chaîne. Ce que nous voulons obtenir, c'est ici que je vais prendre le deuxième élément du tableau et ce sera notre jeton. Mais comme vous pouvez le voir ici, nous recevons le message du TypeScript. Cet objet n'est peut-être pas défini. C'est pourquoi j'aime tant TypeScript. Cela aide beaucoup pendant le développement. Quel est le problème ? En fait, nous avons ici notre IV, notre tenue vestimentaire et notre statut, ce qui signifie que nous ne viendrons pas ici. Mais TypeScript comprend que nous allons venir ici parce qu'en fait nous ne l'avons pas essayé ici, revenez. Et c'est pourquoi ce code n'est pas valide parce que dans ce cas, notre en-tête peut être contraint ou non défini. Mais après cette vérification correcte avec return, il ne peut s'agir que d'une chaîne valide. La prochaine étape que nous devons faire est donc de vérifier notre jeton. En utilisant GBT, c'est ici que je veux importer DVT à partir de JSON Web Token. Et juste pour vous rappeler il s'agit d'une bibliothèque que nous utilisions pour générer un jeton sur le backend, et maintenant nous devons le valider. C'est pourquoi nous pouvons simplement essayer d'obtenir des données de notre jeton. Et ici, GBT vérifiera l'intérieur. Eh bien Python, tout d'abord, un jeton. Deuxièmement, notre clé secrète. Et juste pour vous rappeler que dans notre configuration, nous avons notre secret. C'est pourquoi ici je vais juste l'essayer secret et il sera entré à partir de notre config. Et nous n'avons pas besoin de fournir d'options supplémentaires. Mais si nous vérifions ici notre lot de données ou de TVP PE, mais que nous savons que ce n'est pas correct, ce n'est pas ce que nous commençons à l'intérieur. Si nous regardons ici, à l'intérieur de nos utilisateurs de contrôleur, nous avons généré notre jeton et à l'intérieur nous avons un identifiant et un e-mail, ce qui signifie en fait qu'il est valide ici pour dire après la vérification dérivée comme. Et ici, nous pouvons dire que nous récupérons un objet avec une chaîne D et aussi notre e-mail, qui est une chaîne, dans ce cas, ici maintenant dans les données nous obtenons une base de données correcte. Il s'agit d'un objet avec un courrier D et D. Nous avons donc ici l'idée de l'utilisateur et nous pouvons maintenant essayer de le récupérer dans la base de données. Mais pour cela, nous devons utiliser notre modèle. C'est par ici, au sommet. Nous pouvons importer notre modèle utilisateur à partir de nos modèles. Nous pouvons donc revenir à l'intérieur de la barre oblique de nos modèles, et ici nous avons notre utilisateur. Maintenant, après avoir reçu nos données, nous pouvons faire une demande pour récupérer un utilisateur. Et en fait, nous utilisons un poids. Ici, nous aurons utilisé un point modèle. Et ici, nous voulons trouver l'utilisateur par AD, et nous avons cette fonction par défaut dans mongoose. Et ici, au lieu d'une div, nous pouvons écrire un point de données AD, et cet utilisateur sera là, ou peut-être maintenant, c' est là que nous devrons également le vérifier. Si nous n'avons pas d'utilisateur de retour, nous voulons également indiquer que l'utilisateur n'est pas connecté. Mais si tout va bien, alors nous voulons définir une requête interne à notre utilisateur. En fait, l'idée principale est que cette demande sera mise à jour par nous ici. Ensuite, lors de notre prochain appel, cette demande arrivera à notre contrôleur et nous aurons ensuite un accès direct à cet utilisateur. C'est ici, je veux écrire une demande utilisateur égal à utilisateur. Et c'est cet utilisateur que nous avons obtenu de la base de données. Et après cette histoire d'amour , appelle le suivant. Et cette ligne indique que nous sommes prêts avec notre middleware et que notre requête peut être transmise à notre contrôleur. Mais ici, nous avons un problème, comme vous pouvez le voir ici, où j'obtiens un utilisateur de propriété d'erreur qui n'existe pas sur la demande de type et qu'il est complètement valide. Cette demande provient d'express et à l'intérieur, il n' y a pas d'utilisateur sur le terrain. Donc, ce que nous pouvons faire ici, l'approche de Ron sera d'écrire ici tout et je vous recommande vivement d'éviter d'en utiliser dans vos projets car TypeScript ne peut pas vraiment vous aider. Vous avez simplement votre code avec des trous de JavaScript brut. C'est là, Ras comme tout le monde, sera une super mauvaise approche. Pourquoi est-ce que c'est ? Parce que nous disons simplement que nous ne nous soucions pas de ce qui concerne les demandes. Nous disons simplement qu'il s'agit de n'importe quel utilisateur point et que cela fonctionne. Il s'agit de l'approche pour débutants. Nous n'écrivons pas de code comme ça. Ici. Request user est tout à fait correct, mais cette demande ne doit pas être une demande expresse. Nous devons l'étendre. Et en fait, ici, à l'intérieur de types, nous pouvons créer un nouveau type et le nommer interface point de requête express, point ds. Maintenant, je peux créer cette nouvelle interface. Et nommons l'interface de demande expresse et elle doit en fait s'étendre. Voici donc une demande d'extension. Et en fait, cette demande viendra directement de l'expression. Donc, ici en haut, je peux écrire une demande d'importation à partir de exprimé. Donc, ce que nous faisons ici, nous avons simplement créé une interface et nous avons étendu tout ce que nous avions demandé à notre interface. Et maintenant, nous pouvons simplement dire que nous avons un champ, l'utilisateur, qui peut ne pas être défini, et c' est notre document utilisateur. Ici, vous pouvez tâche ou k, mais pourquoi l'utilisateur peut être indéfini ici, nous n'avons pas de cas où l'utilisateur de la requête interne est indéfini et vous avez tout à fait raison, mais nous n'utilisons pas de middleware à chaque demande. Parfois, nous n'avons pas d'utilisateur dans notre demande car toutes les demandes ne doivent pas être autorisées. Et maintenant, nous pouvons simplement copier-coller cette interface de requête express et définir notre middleware et le mettre ici au lieu de request. Je dois donc maintenant importer un middleware de requête express. Nous n'utilisons plus de demandes d'Express. Nous utilisons la version étendue normale . Et maintenant, nous n' avons plus aucune erreur. Et ce que nous obtenons ici, c'est une demande complète d' express plus notre champ utilisateur. Et c'est exactement la bonne approche pour utiliser TypeScript. Nous avons donc créé avec succès notre middleware. Maintenant, nous devons l'utiliser. Et pour cela, je souhaite créer un nouvel itinéraire. Eh bien, nous allons obtenir l'utilisateur actuel en parlant. Revenons donc en arrière et disons serveur source. Et ici, nous avons deux rails postérieurs ici. Maintenant, je veux créer apt-get et nous avons ici slash API slash user. Il s'agit de la route pour récupérer l'utilisateur actuel. Maintenant, après cela avec une virgule, je veux écrire un intergiciel. Et en fait, dans ce fichier, nous n' avons pas déclaré quel est notre middleware. Nous devons donc entrer ici notre middleware à partir de nos middlewares. Nous avons donc ici les heures d'ouverture des middlewares. Et c'est exactement ce que nous allons faire. Si vous écrivez comme ça, alors vous appliquerez ce middleware avant que nous ne soyons à deux points ici contrôleur. Et ici, nous obtiendrons le point de notre contrôleur utilisateur , par exemple, l'action actuelle l'utilisateur, ce qui signifie tout d'abord, dans cette route, cet intergiciel owls sera exécuté si nous obtenons une demande d'utilisateur est entrée dans le contrôleur, puis où champion ici. Et comme vous pouvez le voir avec express, il est assez facile à lire et à comprendre. Maintenant, je veux sauter dans le contrôleur des utilisateurs et créer cette nouvelle méthode. Donc, en bas, créons notre nouvelle fonction, qui sera un utilisateur actuel. Et ici, nous savons que nous recevons demandes et des réponses, mais c'est important, mais ici nous n'utilisons pas de demandes d'express, nous utilisons notre version étendue. Donc ici je vais écrire de cette façon j'obtiens une interface de requête express. Et le paramètre suivant ici sera augmenté la réponse. Elle reste la même qu'auparavant. Et ici, à l'intérieur de notre fonction, nous devons appliquer une certaine logique. Ce que nous voulons faire ici, en fait à l'intérieur de l'utilisateur actuel, nous pouvons directement obtenir cet utilisateur à partir de la requête. Ici, nous pouvons dire des points de robe et normaliser l'utilisateur, comme nous l'avons fait sur le dessus. Et ici, nous allons demander à cet utilisateur. Et en fait, cela fonctionnera principalement parce que ce que nous faisons ici, nous utilisons notre utilisateur à partir de la requête avec throw it inside normalized user. Et juste pour vous rappeler, nous avons normalisé l'utilisateur ici en haut. Et ce n'est qu'un document utilisateur normal. Et nous générons ici notre réponse et nous la renvoyons. Mais en fait, nous avons TypeScript. Qu'est-ce que cela signifie ? Ici, nous obtenons un argument error de type user document ou undefined it. Il n'est pas assignable pour utiliser un document. Et c'est tout à fait valide parce que nous avons dit que dans notre demande, nous n'avons pas toujours d'utilisateur. Et en fait, le fait est que cette logique ne se produira jamais parce qu' à l'intérieur de notre serveur, nous lancerons cet intergiciel, qui signifie en fait que si nous n'avons pas d'utilisateur, alors ce middleware maison retour pour 01. Mais TypeScript ne se soucie pas notre intergiciel car il lit simplement notre fonction. Et si je regarde simplement notre fonction sans notre middleware, alors notre code est invalide, car ici nous essayons de le lancer indéfini dans un utilisateur normalisé. Et pour gérer cela pour TypeScript, nous devons l'essayer ici. Avec ne pas avoir d'utilisateur, alors nous voulons lancer 401. Ici, nous pouvons écrire return, res, send status, et ici à l'intérieur pour 01. Dans ce cas, il est complètement valide pour TypeScript car ici, dans request user, il ne peut pas être indéfini avec cette vérification ici ? Et en fait ce code est bien meilleur parce que dans ce cas, nous avons cette fonction unique et nous pouvons complètement tester isolément, mais ne vous souciez pas de cette fonction, de ce que nous avons fait à l'extérieur avec des fonctions supplémentaires, middleware over terror avec une note plus simple que cette fonction fonctionnera correctement dans chaque cas, parce que nous avons couvert tous les cas ici, notre fonction doit être correctement implémentée. Allons voir si ça fonctionne. Je passe au serveur et nous avons une erreur. Allons voir ce que nous avons. Et en fait, vous pouvez voir ici que c'était l'ère de TypeScript et que la dernière compilation s'est déroulée avec succès. Nous avons démarré l' observateur connecté à MongoDB et voici notre API. Nous pouvons donc passer directement à Postman et essayer de faire une requête GET. Mais dans notre demande, nous devons fournir un jeton. C'est par ici. Je vais copier-coller pour parler car nous devons l'utiliser. Et pour cela, je vais créer ici une demande GET. Et c'est l'utilisateur slash api slash. Je suis juste en train de frapper ici envoyé. Et comme vous pouvez le voir, nous arrivons ici sans autorisation. Pourquoi est-ce que c'est ? Parce que l' autorisation interne avec n'a pas fourni de jeton valide. Mais si au lieu de cette ficelle, je vais coller notre birra parlant plutôt que l'espace. Et puis nous avons notre ficelle, je frappe ici envoyer, et ça a marché comme par magie. Et voici notre utilisateur normal avec le Tonkin. Mais le plus important, c'est que nous n'avons pas essayé. Toute cette logique avec l'obtention utilisateur actuel ici dans cette méthode, elle est écrite dans un middleware. Et maintenant, nous pouvons utiliser notre middleware partout où nous voulons vérifier l'utilisateur actuel ou si nous avons besoin des informations utilisateur actuelles dans notre contrôleur. 13. Créer un module de la voix: Dans les vidéos précédentes seront toujours préparées quelques demandes de Pi pour notre utilisateur enregistré et utilisateur actuel de gating. Donc maintenant, ce ne serait pas bien de commencer à implémenter quelque chose sur le front-end. C'est pourquoi je veux entrer dans notre client. Et ici, je veux commencer par notre module utilisateur. Et ce que nous aurons dans notre module utilisateur, ce sont deux pages de connexion et d'inscription. Mais il ne suffit pas d'avoir deux pages pour s'inscrire et se connecter à l'intérieur de notre module, nous aurons également besoin d'un service pour travailler avec l'utilisateur actuel. Par exemple, nous devons enregistrer l'utilisateur, l' utilisateur de connexion, obtenir l'utilisateur actuel, etc. et ainsi de suite, nous avons besoin d'une interface pour notre utilisateur actuel également, c'est là que dans cette vidéo, allons nous concentrer sur les bases de notre module d'authentification. Pour cela, je veux aller dans le dossier source de notre application. Et ici je veux créer un nouveau dossier. Ici, nous voulons tout isoler, ce qui parle d'authentification, l' enregistrement commence. La première étape consiste à créer un module. Et si vous n'êtes pas très familier avec Angular, juste deux mots sur les modules dans Angular, dans les autres frameworks comme par exemple, React, nous utilisons simplement des importations et des exportations, Bot Insight angular, nous avons beaucoup plus, nous avons des injections de dépendance, ce qui signifie que l'ensemble de l'application est divisé en différents modules. Par exemple, dans notre cas, nous définissons ici et maintenant le module. Nous pouvons maintenant créer différentes choses à l'intérieur de ce module et elles seront isolées à l'intérieur de ce module. Et nous pouvons définir ce que nous voulons exposer à l'extérieur. Et si nous n'avons rien exposé pour une utilisation en extérieur, alors nous ne pouvons pas simplement utiliser les éléments de ce module. Et c'est vraiment une bonne approche pour les applications volumineuses. Créons d' abord notre module. Pour cela, nous devons exporter notre classe, notre module. Maintenant, au sommet de cette classe, nous voulons fournir un décorateur de module NG. Et à l'intérieur, nous passerons différentes choses, mais pour l'instant, nous n'avons pas encore besoin d' enregistrer quoi que ce soit ici. Ce que je veux faire maintenant, je veux revenir dans notre module d'application, car nous devons enregistrer ce module dans notre module d'application. Dans un autre cas, ce module ne le lie pas à notre application car nous ne faisons charger un module et nous devons également y placer tous les modules enfants. C'est ici qu' à l'intérieur, dans birds, nous pouvons simplement écrire notre module. Et avec cette ligne où obtenir une entrée automatique ici en haut. Maintenant, nous sommes sûrs que notre module est chargé. La prochaine étape consiste à créer une interface utilisateur actuelle. Et de mon point de vue, cela n'a aucun rapport avec le module hiboux. Ici, nous pouvons créer un nouveau type de dossier et enregistrer ici, l'interface utilisateur actuelle point ts. Et dans notre projet Express, nous n'avions aucune règle concernant le nommage des fichiers parce que nous venions exprimer et que tout ce que nous écrivions, nous écrivons simplement avec nos propres directives Dans l'angle, il est fortement recommandé de nommer tous nos noms de fichiers, Start puis le suffixe de l'entité. Par exemple, ici nous avons écrit le module point car il s' agit d'un module annoncé. Dans ce cas, nous sommes juste ici, interface point parce que ce sera une interface et exactement la même chose s'applique aux classes. Ici, nous n'écrivons pas des hiboux de classe, mais notre module. Et ici, dans CurrentUser, nous sommes ici, l'interface experte, et ici nous avons notre interface utilisateur actuelle. Maintenant, la question est de savoir ce que nous allons trouver à l'intérieur ? Et il est facile de répondre qu'il suffit de regarder à l'intérieur de notre facteur. Nous revenons donc ici pour notre utilisateur actuel, notre e-mail, notre nom d'utilisateur, notre identifiant et notre jeton. Nous pouvons donc simplement écrire ici que nous obtenons un DStream. Nous avons notre jeton, qui est une chaîne. Nous avons notre nom d'utilisateur. Il s'agit également d'une chaîne, et le dernier est notre e-mail. Et grâce à cela, nous avons réussi à définir notre entité utilisateur actuelle sur notre client. Et maintenant, dans chaque endroit où nous parlons d'utilisateur actuel, nous pouvons utiliser cette interface. Notre prochaine étape ici est de créer une classe, car en fait, avant, nous allons commencer par créer des composants pour l' enregistrement et la leucémie, mais nous devons créer un service qui communiquera avec notre API. Et le service appartient certainement à notre module. C'est pourquoi ici je vais créer un nouveau dossier, services, et je veux créer ici point services.js. En fait, c'est vraiment un bon nom si vous ne savez pas comment nommer votre service. Si vous voulez juste emballer quelques méthodes dans votre service dans le module et que vous ne savez pas vraiment en quoi consiste cette méthode II. Vous pouvez simplement nommer le service comme un module. Dans notre cas, nous avons ici notre module et notre service. Mais si vous êtes un service à un moment donné, ce sera trop grand. Tu peux toujours te séparer. Il peut s'agir du service de connexion, du registre, service, du service utilisateur actuel, de ce que vous préférez. Pour l'instant, notre service est parfait. Ici, je souhaite exporter le nouveau service des heures de cours. Maintenant, il est super important de ne pas oublier d'écrire sur le dessus injectable. Parce que si vous le souhaitez, essayez cette seule ligne, il sera très difficile de déboguer un problème. Vos entrées fonctionneront, mais vous obtiendrez un peu de magie dans la console. C'est pourquoi il ne faut jamais oublier injectable s'il s' agit de services, il faut maintenant enregistrer le service à l'intérieur d'un module. Et c'est exactement, cela va dans le sens des injections de dépendances et des modules dans Angular. Ce que nous voulons faire ici, c'est créer un nouveau champ appelé fournisseurs. Et ici, c'est un tableau et nous écrivons à l'intérieur de notre service. C'est donc exactement la bonne façon d'enregistrer tous les services dans notre module. Maintenant, nous voulons créer notre première méthode ici et elle sera l'obtention de l'utilisateur actuel. Eh bien, ici, nous pouvons simplement écrire que nous voulons créer, obtenir la fonction utilisateur actuelle et elle retournera rapidement observable de l'utilisateur actuel. Et à ce stade, vous pourriez avoir des questions si vous ne connaissez pas Angular à ce point, et si vous ne savez pas du tout ce que nos observables et si mince avec générique ici peuvent être déroutants pour vous. Qu'est-ce qui est observable ? Il s'agit simplement d'une représentation du flux. Qu'est-ce que Stream ? C'est quelque chose qui a changé au fil du temps, ce qui signifie que nous pouvons nous abonner au stream. Et lorsque le changement se produira dans le flux, nous obtiendrons une nouvelle valeur. Alors dites l'angulaire, tout fonctionne sur l'amour avec les flux quand vous n'utilisez pas de promesses. Ce qui signifie en fait des flux et des observables, est un modèle spécifique, façon dont nous allons écrire notre code. Donc, ce que nous disons ici, c'est que nous récupérons un observable. Et ici, nous indiquons le type de données que nous récupérons. Et dans notre cas, nous disons ici que cette fonction doit renvoyer un observable de type interface utilisateur courante. L'interface utilisateur actuelle est exactement notre objet utilisateur actuel. Maintenant, à l'intérieur, nous voulons récupérer des données, et pour cela dans Angular, nous avons HTTP. C'est pourquoi ici je vais écrire constructeur et à l'intérieur de private, http est égal au client HTTP. Donc, ce que cette ligne fait en haut, cette notation avec constructeur, puis private some variable equals some class est la façon dont nous injectons des dépendances dans un service. Et c'est très bien si c'est un peu effrayant pour vous de voir un tel code, nous écrirons exactement le même code encore et encore dans chaque vidéo. Pour l'instant, il vous suffit de comprendre que nous devons utiliser HTTP ici dans notre service. C'est ici que nous devons injecter ce client HTTP. Et maintenant ici dans nos méthodes, nous pouvons utiliser ce point HTTP et dynamique est ici nous voulons utiliser méthode GET pour obtenir notre utilisateur. Donc, ce que je veux faire maintenant, je veux créer une URL. Et en fait, ici, nous pouvons simplement coller http localhost 4,001 slash api slash user, et nous jetons simplement ici notre URL. Et maintenant, nous devons renvoyer cette URL HTTP GET. Mais ici, nous obtenons une erreur. type d'objet observable n' est pas assignable à l'interface utilisateur actuelle de type observable, pourquoi cela se produit-il ? Parce qu'ils sont en fait HTTP GET renvoyant par défaut observable off object parce que notre HTTP GET Cantril et savent quelles données nous récupérons quand non, ce n' est que nous-mêmes dans notre application, mais nous pouvons le faire ici, nous devons préciser ce que nous récupérons. Et dans ce cas, nous disons, d'accord, ce HTTP GET spécifique par cette URL retournera fausse interface utilisateur actuelle et pas simplement un objet aléatoire. C'est pourquoi dans ce cas, lorsque vous n'obtenez aucune erreur, car cette seule ligne retourne rapidement observable de l'interface utilisateur actuelle. Et vous devez juste vous rappeler que tout ce HTTP reviendra pour nous toujours observable de quelque chose. Maintenant, la prochaine chose qui est vraiment mauvaise, c'est cette ligne. Pourquoi est-ce que c'est ? Tout d'abord, ici nous avons directement la base routière ici. C'est une très mauvaise approche. Pourquoi est-ce que c'est ? Parce que cette ligne va rompre en production. Il ne convient que pour le développement. Et nous devons écrire exactement le même code encore et encore dans chaque méthode, c'est mauvais. Pour cela, nous avons des variables d'environnement dans Angular. Nous pouvons revenir à l'intérieur des environnements sources et ici de l'environnement, oui, c'est exactement là que nous devons définir toutes nos constantes en fonction d'un environnement spécifique. Donc, ce que nous devons faire ici, nous pouvons créer une nouvelle URL d'API de propriété, et nous pouvons simplement coller notre flux ici. Donc hôte local pour l'API barre oblique 1001. Et c'est tout à fait correct parce qu' ici, dans notre environnement de développement, où l' URL de l'API est définie, aura également un environnement de production. Et nous pouvons y définir différentes URL d'API. C'est la façon la plus correcte de procéder. Maintenant, nous pouvons simplement utiliser l'environnement here, et comme vous pouvez le voir, nous obtenons une URL d'API de point d'entrée externe plus. Et ici, nous avons simplement besoin d'utiliser slash user et rien de plus. Dans ce cas, nous réutilisons cette URL d'environnement qui est complètement isolée à l'intérieur de la variable d'environnement, nos services étant entièrement prêts. Mais ce que nous voulons faire, c'est que nous voulons obtenir cet utilisateur chaque fois que nous chargeons notre application angulaire. Pourquoi est-ce que c'est ? Parce qu'ils ont réellement été volés. Notre utilisateur actuel est normalement en mémoire et après s'être connecté ou enregistré, nous parlons simplement dans le stockage local. C'est pourquoi chaque fois que nous sautons dans notre application, nous devons obtenir l'utilisateur actuel. Pour cela, je souhaite revenir à l' intérieur de notre composant d'application. Et c'est exactement le composant qui sera chargé sur n'importe quelle page. Ici, nous pouvons écrire implémenter sur init. Et si vous ne savez pas ce qui ne s'y trouve pas, il agit d'une méthode spéciale qui sera appelée lors de l'initialisation de notre composant. Ici, je suis en plein génie là-dedans. Et puis nous avons dit que nous pouvions utiliser notre service, mais pour l'utiliser, nous devons l'injecter ici. Et ici, nous écrivons exactement les mêmes choses que celles que nous avons écrites à l'intérieur ou au service. Privé, pas HTTP comme nous l'avons fait dans le service, mais notre service que nous venons de créer. Et ici, nous devons entrer notre service, qui se trouve à l'intérieur de notre module. Et maintenant nous pouvons l'utiliser ici directement à l'intérieur du moteur. C'est donc notre service et nous avons ici la méthode utilisateur actuelle. Mais ce qui est le plus important, ces retours pour nous et observables. Et en général, nous voulons faire quelque chose pour écouter les changements de l'observable. C'est pourquoi nous allons essayer ici dot subscribe. Et maintenant, abonnez-vous ici, nous allons obtenir quelques informations. Donc ici je vais juste écrire les rads et journal de console Ras afin que nous puissions vérifier si cela fonctionne. Je vais accéder au navigateur et recharger la page. Et juste pour vous rappeler, votre serveur Web client doit également être démarré. Nous obtenons ici une erreur. Service client HTTP, aucun fournisseur pour le client HTTP. Qu'est-ce que cela signifie ? Cela signifie que nous utilisons le client HTTP dans notre application, mais que nous n'avons pas injecté de module de client HTTP dans notre application. C'est une façon de le réparer. Nous devons sauter à l'intérieur d'un module, et ici nous devons importer le module client HTTP. Dans ce cas, notre erreur sera corrigée. Rechargeons la page. Comme vous pouvez le voir maintenant, cela fonctionne, mais ici, nous obtenons une erreur propos de la demande d'origine croisée. Et en fait, c'est tout correct car nous n'avons pas configuré correctement notre application dorsale Express pour qu'elle fonctionne avec des requêtes cross-origin. C'est pourquoi nous pouvons simplement revenir à l'intérieur de notre serveur. Et en ce qui concerne les niveaux de serveurs open source, notre prochaine étape sera d' installer un package supplémentaire. C'est pourquoi je vais sauter à l'intérieur de notre serveur. Et ici, npm install course and course est le package le plus populaire pour résoudre problèmes de cours avec l'application Express. Je vais juste retourner à l'intérieur de la sororité S. Et ici je peux écrire sur le premier cours d'entrée, Drum Corps. Et maintenant, la seule chose que nous devons faire ici est qu'avant notre analyseur corporel, par exemple, nous pouvons écrire un pews et nous fournissons un cours d'aperçu en tant que fonction. Comme vous pouvez le voir, nous n' avons plus d'erreurs dans backend et nous pouvons recharger notre page frontale. Comme vous pouvez le voir maintenant avec l'ère Don't have Discourse et nous ne faisons que devenir non autorisés. Voyons ce que nous avons à l'intérieur du réseau. Nous avons cette demande pour l'utilisateur, et si je la réduis un peu, nous pouvons voir ce que nous obtenons dans les en-têtes de réponse et nous obtenons ici le contrôle d'accès allow origin star. Et en fait, c'est pour cela que cela fonctionne. Notre back-end, réglez-le correctement. Ils permettent l'origine de l'accès. C'est pourquoi nous n'obtenons aucune erreur de la part du navigateur. Mais comme vous pouvez le voir ici, nous obtenons 401 non autorisés. Et en fait c'est tout à fait normal. Nous ne sommes pas connectés, dans notre application. Nous avons simplement récupéré l'utilisateur actuel et nous avons reçu une erreur. C'est très bien. Ce qui ne va pas avec n'a pas réagi à cette demande autorisée. Ce que nous pouvons faire, c'est revenir à l'intérieur notre composant d'application où nous avons écrit ce code. Et nous pouvons également gérer une erreur. Et pour cela, nous pouvons écrire dans Subscribe, non pas une fonction mais un objet. Ici, à l'intérieur de l'objet, nous pouvons avoir deux champs. Tout d'abord, ensuite, c'est exactement notre succès. Comme vous pouvez le voir ici, je laisse cette fonction telle quelle. Mais après cela, nous pouvons créer une erreur. Et dans ce cas, c'est ce qui se passera si nous avons une erreur. Donc, ici, nous pouvons simplement écrire erreur de journal de console et peut-être que nous voulons voir Sarah, vérifions ce que nous obtenons. Je recharge la page et nous obtenons notre erreur, la réponse d'erreur HTTP. Et ici, nous n'avons pas autorisé et nous pouvons réagir à cette époque. Donc, ce que je veux faire maintenant, je veux créer la fonction utilisateur actuelle. Et en fait, cela n'a pas beaucoup de sens parce que nous n'avons pas de chance, mais nous devons quand même enregistrer des informations dans notre application selon lesquelles l'utilisateur n'est pas verrouillé. Dans ce cas, l' ensemble de l'application, chaque composant peut vérifier, sommes-nous bloqués maintenant et notre composant sait comment réagir à cela. C'est pourquoi nous devons revenir à notre service. Et ici, je veux créer un nouveau jeu de méthodes utilisateur actuel. Ici, nous obtenons l'utilisateur actuel, qui est notre interface utilisateur actuelle. Et cela renverra un vide parce qu'en fait, nous allons simplement modifier les données à l'intérieur et ne rien retourner. Et en fait, ce n'est pas tout à fait correct. Voici l'interface utilisateur actuelle ou null si nous n' avons pas d'utilisateur actuel. Parce qu'en fait, si nous ne sommes pas bloqués dans Poupon pour définir l'utilisateur actuel sur maintenant. Maintenant, la question est : qu'est-ce qui se passe à l'intérieur En général, ce que vous verrez dans de nombreuses applications. Les gens définissent simplement une propriété locale quelques heures, comme l'utilisateur. Et puis ici, vous pouvez simplement écrire cet utilisateur est égal à utilisateur. Ce n'est pas la meilleure approche avec Angular. Et à l'intérieur de l'Angular, il est très confortable et efficace de travailler avec des flux, car il est beaucoup plus facile de réagir aux flux et de les combiner. C'est pourquoi nous devons utiliser une approche plus difficile, mais elle est la plus adaptée aux grandes applications. C'est exact. C'est là que je veux écrire que nous arrivons ici, le flux utilisateur actuel. Ici. Je veux créer un nouveau comportement un sujet, et cela dit comportement un sujet. Je dis que nous obtenons ici l'interface utilisateur actuelle ou maintenant, ou non définie. Et après ces crochets ronds, et ici nous disons qu'il n'est pas défini par défaut. Donc ce que j'ai écrit ici et comment nous allons l'utiliser. En fait, qu'est-ce que le sujet du comportement ? Il s'agit simplement d'une représentation des flux. Il s'agit simplement d'un flux qui possède une valeur par défaut. Dans ce cas, notre valeur par défaut est undefined it, et nous pouvons également définir à l'intérieur du flux types tels que current user interface now ou undefined. Et maintenant, dans set current user, nous pouvons changer le flux. Nous pouvons écrire ici ce point utilisateur actuel. Et pour changer le flux, nous utilisons point next et nous vous apportons de la valeur. Dans ce cas, nous fournissons l'utilisateur actuel et il est complètement valide car l'interface utilisateur actuelle est un type valide. Le point principal est ici que de nombreux composants de notre application peuvent s'abonner à ce flux d'utilisateurs actuel, et ce seront des pillards automatiques terminés en ce moment ici, quand nous vous modifiez la valeur dans le flux utilisateur actuel. Et ne vous inquiétez pas, si vous ne l'avez pas complètement compris, vous verrez comment nous l'utiliserons dans les prochaines conférences. Nous avons donc créé avec succès notre utilisateur actuel défini. Maintenant, dans notre composant d'application, au moins par erreur, nous pouvons faire quelque chose. Nous pouvons définir notre utilisateur actuel à deux. Maintenant, ici je vais écrire ce point notre service point set utilisateur actuel. Et ici, à l'intérieur, je vais le faire maintenant. Donc, ce qui se passe ici sur Initialize de notre application, nous obtenons ici l'utilisateur actuel. Si nous n'avons pas obtenu l'utilisateur actuel, nous le définissons sur null. Et maintenant vous voulez certainement me demander pourquoi j'ai écrit ici maintenant et je le définis et l'utilisateur actuel, il est logique de définir ici l'utilisateur actuel et maintenant, mais pas l'indéfini. De plus, ils l'ont fait dans le but car nous devons gérer trois états différents. Tout d'abord, par défaut, nous l'avons indéfini, ce qui signifie que pour nous, nous n'avons pas encore récupéré l'utilisateur actuel. Ce n'est pas prêt si nous sommes assis ici maintenant, cela signifie que nous avons récupéré l'utilisateur actuel, mais cela n'a pas réussi. Nous ne sommes pas enfermés. Donc maintenant, ça veut dire que nous ne sommes pas enfermés. Et l'interface utilisateur actuelle signifie évidemment que nous sommes bloqués. Nous avons donc créé avec succès notre module, notre service, l'interface utilisateur actuelle et certaines fonctions de base dont nous aurons besoin lors des prochaines conférences. 14. Page d'enregistrement - Markup + Form: Dans la vidéo précédente, nous avons préparé de nombreux membres du personnel concernant l'utilisateur actuel. Dans cette vidéo, je souhaite me concentrer sur la création notre page d'inscription car le gâteau pour l'inscription sera déjà implémenté. Et pour cela, il faut d'abord créer un nouveau composant. C'est pourquoi je suis ici pendant les heures d' application nous devons créer un nouveau dossier appelé composants. Le premier composant que nous pouvons implémenter est l'enregistrement. Et voici un mot important. En fait, nous allons implémenter deux composants, l' enregistrement et la connexion. Les différences entre ces deux composantes ne sont pas si importantes. Nous avons dans l'inscription, un champ supplémentaire, nom d'utilisateur et une connexion avec, nous n'avons pas ce champ. Ensuite, nous avons différents Le caoutchouc du pneu. C'est ça. Tout. D'autres choses restent les mêmes. C'est pourquoi nous avons deux possibilités. Nous pourrions créer un composant unique et gérer simplement entre la connexion et l'enregistrement. Nous pouvons également créer deux composants différents. Je préfère créer deux composants différents simplement parce que c'est plus facile à maintenir par la suite, même lorsque nous dupliquons un peu le code. Nous allons donc créer un nouveau dossier et l'appeler register. Maintenant, dans ce dossier, nous devons créer son fichier, un fichier HTML. Et ici, nous aurons enregistré les points de composant point et aussi composant point HTML enregistré. Maintenant, dans notre composant, nous devons expertiser notre nouveau composant de registre de classe , puis dire ce composant, nous devons d' abord fournir un sélecteur. Vous avez ici une décision importante. Vous pouvez nommer tous vos sélecteurs commençant par le nom de votre application. Par exemple, vous créez un préfixe valide dans l'application. Par exemple, dans notre cas, nous pouvons le nommer L Trello ou simplement L. Ensuite, vous avez une différence entre toutes les bibliothèques que vous utilisez et les composants de notre projet. Parce qu'en fait, si nous sautons dans le code HTML, nous avons ici le registre L, alors nous savons que c'est une composante de notre projet. Si vous avez ici, par exemple, préfixe vide puis un bouton, vous comprenez le k. Il s'agit d'une bibliothèque de matériaux et ce n'est pas notre projet. C'est la première approche possible. Je préfère une autre approche où je préfixe chaque composant du module, ce qui signifie que nous sommes maintenant à l'intérieur de notre module. C'est ici que le sélecteur sera enregistré. C'est beaucoup plus facile car nous n'utiliserons pas de bibliothèques. Et dans ce cas, nous pouvons voir à partir de quel module nous obtenons ce composant. La prochaine chose que nous devons fournir à l'intérieur notre composant est notre URL de modèle. Et il s'agit de l'URL de notre composant de registre HTML. Maintenant, n' oublions pas d'enregistrer nos composants dans notre module. Ici, nous allons sauter à l'intérieur de notre module Ts, et nous créons ici des déclarations de champs. Et à l'intérieur, nous pouvons maintenant écrire le composant de registre et le delta E importé à partir de composants enregistrés, enregistrés. Notre composant est donc là. Maintenant, nous pouvons écrire un balisage pour notre composant dans notre composant de registre, oui, et en fait ici j'ai oublié lettre S dans le registre de mots. Maintenant, lançons un marqueur pour notre page d'inscription. Et la première classe que nous avons ici est div avec la page de connexion de classe. Et cela peut être déroutant pour vous, mais c'est juste parce que nos styles ont été écrits pour la page de connexion et c'est exactement la même chose que la page d'enregistrement. Nous avons donc ici notre page de connexion div, et maintenant à l'intérieur, nous aurons un lien en haut. Ici, nous avons un lien de routeur et voici une barre oblique. Cet itinéraire va donc vers notre page d'accueil. À l'intérieur du lien de notre routeur, nous voulons une image. Voici donc les acides slash source d'image, barre oblique Trello, logo point SVG. Et après ce cours, loi sur les fils, logo principal. Et en ce moment, vous voulez certainement dire, accord, nous n'avons pas d'images. C'est en particulier pour vous que vous avez préparé toutes les images et les mettre dans ce dossier, à l'intérieur des actifs. Et vous pouvez prendre toutes ces images de l'archive de cette leçon spécifique dans la boîte de description ci-dessous, comme vous pouvez le voir ici, dans la source, dans les ressources, j'ai pas mal d'images, alors n'oubliez pas pour les prendre pour notre projet. Revenons maintenant à l'intérieur de notre application, nos composants s' enregistrent, enregistrent HTML, et après notre balise a ici en haut, nous voulons créer div avec class firm container, et ce sera notre conteneur pour notre formulaire. Maintenant, à l'intérieur du conteneur, nous voulons tout d'abord écrire l'en-tête de connexion de la classe def. Et encore une fois, nous avons la classe à partir de la connexion, mais ce n'est pas grave. Et ici, nous écrivons «  Register to Trello ». Ensuite, nous écrirons une classe pour les erreurs de validation. Et en fait, pour l'instant, nous n' y mettrons aucune erreur, mais nous l'utiliserons plus tard. C'est ici, juste des erreurs de classe div le fermaient. Il est complètement vide et rien n'y est encore rendu. Après cela, nous avons notre formulaire. Nous allons donc ouvrir et fermer la balise form. Et à l'intérieur, nous avons des champs spécifiques. Donc tout d'abord, nous avons ici un e-mail, donc entrez un e-mail de type e-mail. Et ici, nous voulons placer l'adresse e-mail du titulaire. Et le dernier sera la saisie de la connexion à la classe. Maintenant, je souhaite copier-coller cette ligne deux fois parce que nous avons besoin non seulement d'un e-mail, mais également de notre nom d'utilisateur. Ici, nous n'avons pas besoin de Type. L'espace réservé sera le nom d'utilisateur et la classe. Nous allons chercher des commentaires. Et après cela, tapez mot de passe et mot de passe d'espace réservé. Après cela, nous pouvons créer notre bouton pour enregistrer l'utilisateur. Ici, nous serons le bouton Type, Soumettre, Classe, Connexion, Bouton Soumettre. Et à l'intérieur de ce bouton, essayons-le pour un registre. Après notre formulaire, nous voulons afficher nos liens. Nous aurons donc ici des liens de formulaire de bas de classe div. Fermons cette div et créons simplement un lien unique vers notre page de connexion. Voici donc un lien de routeur. Encore une fois. Ici, nous aurons une page de connexion slash et un lien d' inscription de classe. Ici, à l'intérieur de notre étiquette a, nous allons simplement lancer la connexion. Vérifions si quelque chose est rendu. En fait, nous voulons aller à la page d' enregistrement des barres obliques et voir notre page, mais cela ne fonctionne pas parce que nous n'avons pas enregistré notre itinéraire. Enregistré. Pour cela, nous devons revenir à l'intérieur de notre module, notre module. Et ici, nous devons enregistrer toutes les routes que nous voulons créer dans ce module spécifique. C'est là qu'en haut, nous pouvons créer un tableau de routes et nous pouvons dire que c'est des rounds, et dans ce cas, ce ne sera pas juste un tableau. Nous aurons à l'intérieur de la validation de chaque tour. Nous devons donc ajouter ici un objet avec notre chemin qui sera enregistré et notre composant que nous venons de créer. Et c'est un composant de registre. Dans ce cas, cela fonctionnera une fois que nous aurons ajouté ces routes à nos entrées. C'est là que nous devons entrer directement dans les oiseaux et utiliser point du module Hear Route pour les enfants. Et il est important de l' utiliser ici pour enfant et non sillonné car nous voulons créer le module Strauss inside ou un module enfant, pas dans le module app. C'est ici que se trouvent les itinéraires enfants et les itinéraires pour ce module spécifique. Maintenant, voyons ça. Je vais recharger la page et passer à la barre oblique. Et comme vous pouvez le voir dans ce cas, il a été rendu. Nous pouvons voir notre téléphone sans CSS, et voici notre fichier SVG que nous fournissons en haut. Donc maintenant, votre question est sûre, alors que c'est notre CSS et c'est le but. J'ai également préparé l'ensemble du CSS pour notre projet. Nous allons donc nous concentrer uniquement sur Angular et écrire dans la logique métier. C'est pourquoi vous devez prendre le code source de notre projet sous la vidéo. Ensuite, dans le dossier source, dans styles.css, vous devez copier ces lignes. Et comme vous pouvez le voir ici, tout cela se trouve dans des parties de styles Nouveau dossier, que vous devez également copier. Vous devez donc copier deux choses, le dossier des styles source et les styles source, CSS, vous devez remplacer ce fichier. Donc, à l'intérieur de nos styles sources, nous avons beaucoup de styles différents. Comme vous pouvez le voir ici. Par exemple, créez une tâche. Nous avons tout ce qui concerne la création de tâches. Et tous ces styles sont globaux et nous utiliserons styles les plus anciens juste pour nous concentrer entièrement sur l'application Angular. Aussi, je tiens à vous rappeler que notre fichier global, styles source, CSS, est automatiquement utilisé par Angular, ce qui signifie que si vous avez écrit ces symboles ici, cela fonctionnera immédiatement. Et maintenant, si nous allons recharger la page, nous avons ici, notre balisage. Nous avons donc ici l'icône trello, et il s'agit en fait d'un lien vers la page d'accueil. Et nous avons notre formulaire d'inscription avec e-mail, nom d'utilisateur et mot de passe. Le seul problème est ici, bonjour le Trello que nous pouvons voir dans le coin. Ce ne sont que quelques restes dans notre application source, le composant HTML de l'application. Ici, nous pouvons supprimer cette ligne et vivre ici la sortie du routeur. Nous avons donc créé avec succès notre balisage pour la page de registre. Passons maintenant à lier d'une manière ou d'une autre ce formulaire avec Angular. Et en fait, dans Angular, nous avons des formes réactives. Et il s'agit d'un module Angular supplémentaire pour travailler avec les formulaires à la manière des échecs de cette semaine. C'est y. Revenons à l'intérieur sont nos composants, inscrivez-vous, inscrivez le composant ts. Et ici tout d'abord, je veux mettre dans notre formulaire, nouveau groupe de formulaires d'attributs. Et ici, je vais essayer c'est égal à la forme. Et là aussi, nous avons besoin de NG Submit pour soumettre le formulaire. Et ici, nous allons créer sur Soumettre. Maintenant, la question est de savoir quel est ce groupe de formulaires ? En fait, dans les formulaires réactifs, nous pouvons créer un groupe de formulaires à l'intérieur d'un composant. Et il s'agira d'une représentation de notre formulaire HTML. Et il sera entièrement lié à nos éléments HTML et fonctionnera immédiatement. Ce que nous voulons faire ici dans notre classe, nous voulons créer notre formulaire. Et c'est en fait ce point si groupe de points b. Et nous n'avons pas du tout de B à l'intérieur de notre composant. C'est pourquoi nous devons insérer un constructeur injecté. Donc, ici, je vais écrire private if b, et c'est un générateur de formulaire. Et comme vous pouvez le voir, il a été importé à partir de formes angulaires. Maintenant, en haut, nous avons accès à ce grand groupe et voici notre formulaire. Quels domaines possédons-nous ? Tout d'abord, nous avons un e-mail et en fait ici nous pouvons dire sous forme de tableau nos validateurs, donc la valeur initiale ici est vide et ici nous pouvons écrire des validateurs point requis, dans ce cas des formulaires réactifs. Nous vérifierons par défaut le caractère vide de ce champ. Maintenant, nous pouvons copier-coller cette ligne car nous avons exactement la même. Nous avons ici notre nom d'utilisateur, également un champ vide et une validation requise, et voici notre mot de passe. Il s'agit également d'un champ vide par défaut et il est nécessaire pour que notre entreprise soit déjà performante. Et cette ligne ici pour le formulaire Firm Group lie ce formulaire spécifique à notre code HTML, mais ce n'est pas tout. Nous devons également lier chaque champ. Partout ici, nous avons cette contribution. Et en fait, ce que je veux faire ici, je veux mettre un attribut de nom de contrôle de formulaire. Ici, nous allons lier un champ spécifique pour chaque entrée. Le premier ici sera notre e-mail. Le second est notre nom d'utilisateur et le dernier est le mot de passe. Dans ce cas, lorsque nous modifierons ces entrées, elles seront mises à jour dans notre groupe de formulaires ici. Et la dernière chose que nous devons créer est sur la méthode Submit. Nous l'avons donc déjà créé dans notre code HTML. Ici, nous pouvons simplement ajouter sur submit et il retourne nul. Et maintenant, à l'intérieur, je veux juste me connecter à la console sur Submit comma, ces valeurs de points de formulaire. Allons voir si ça fonctionne. Je vais recharger le patient que nous obtenons une erreur qui ne peut pas se lier au groupe de formulaires car il ne s'agit pas d'un élément connu du formulaire. Pourquoi cela se produit-il ? Parce que nous n'avons pas injecté module de formulaires réactifs dans notre module. Revenons donc à l'intérieur ou à l'extérieur du module. Et ici, dans les entrées, nous devons écrire un module de forums réactifs. Et après cette contribution, nous ne devrions pas avoir Sarah. Rechargeons la page. Comme vous pouvez le constater, nous n'avons pas d'erreur. Maintenant, je peux fournir quelque chose à l'intérieur et cliquer sur Enregistrer. Et comme vous pouvez le voir ici dans la console où obtenir onsubmit, e-mail, nom d'utilisateur et mot de passe, ce qui signifie en fait que tous nos champs ont été liés avec succès à notre composant angulaire. 15. Page d'enregistrement - service + validation: Dans les vidéos précédentes, nous avons créé un marché pour la page de registre et également pour l'entreprise, mais nous manquons toujours notre appel API, que nous devons implémenter dans cette vidéo. C'est pourquoi Tout d'abord, je veux revenir à notre, nos services, notre service, parce qu'en fait, ici, nous allons écrire tous nos appels d'API et nous avons déjà ici obtenir l'utilisateur actuel, que nous allons polir plus tard. Mais pour l'instant je veux créer un registre API charbon. C'est pourquoi ici nous pouvons simplement écrire register. La question est : qu'est-ce que nous en arrivons là ? Nous recevons notre formulaire, mais nous ne l'avons pas encore tapé. C'est pourquoi il n'est pas confortable à utiliser. Et nous ne voulons pas écrire ici que nous en obtenons parce cela n'a pas beaucoup de sens ce que cette méthode veut, elle veut savoir ce qui a été fourni à l'intérieur. C'est pourquoi j'ai voulu revenir à l'intérieur nos types et créer ici un nouveau type. Et nous pouvons nommer ce type d'interface de demande de registre. Et vous vous demandez peut-être, d'accord, mais pourquoi un nom si étrange ? Et en fait, ce n'est pas étrange. L'idée principale est le temps de corriger tout ce que nous écrivons concernant la demande et la réponse avec un suffixe spécifique dans ce cas, je sais. Ok. Il s'agit d'une demande de registre. Voici donc le corps de la demande. Si nous parlons de réponse de notre registre si nécessaire, alors ce serait un test d'interface de réponse enregistré. Dans ce cas, il est plus facile comprendre pourquoi vous utilisez cette interface. Créons maintenant cette interface. Donc, ici, je veux exporter notre nouvelle interface et ce sera une interface de demande de registre. Ce que nous aurons exactement dans tous les champs que nous avons écrits à l'intérieur d'un formulaire. Nous aurons donc ici notre e-mail, c'est une chaîne, notre nom d'utilisateur, ce sera également une chaîne. Le dernier est notre mot de passe. Et le mot de passe est également une chaîne. Et en fait, il ne s'agit pas seulement de la forme. Si nous regardons à l'intérieur de nos contrôleurs source de serveur, les utilisateurs ont déjà créé ici une méthode de registre. Et dans notre méthode de registre, c'est ce que nous recherchons à l'intérieur du corps. Demandez donc le corps de l' e-mail, le nom d'utilisateur , le mot de passe, et c'est exactement ce que nous envoyons du client. Nos inscrits ont donc demandé que nous puissions revenir à l'intérieur de nos services, de nos niveaux de service. Ici, à l'intérieur de register, ce que nous obtenons en tant que paramètre, c'est notre demande de registre et notre type est l'interface de demande enregistrée que nous venons de créer. Maintenant, la question est de savoir ce que je récupère après l'enregistrement, nous récupérons notre utilisateur actuel. C'est ainsi que nous pouvons écrire exactement comme si l'utilisateur actuel pouvait observer l'interface utilisateur actuelle. Nous l'avons déjà. Dans ce cas, tout ce qui se trouve dans notre méthode est correctement saisi. Nous devons maintenant créer une propriété URL. Donc, voici l'URL et nous utilisons à nouveau l'environnement point un royaume payeur parce que ce sont les mêmes utilisateurs de barre oblique, parce qu'ils ont été enregistrés, la demande est juste de poster pour les utilisateurs de slash. Et maintenant, je veux renvoyer ce HTTP et nous avons accès ici au message HTTP et à l'intérieur, nous fournissons l'URL du festival. Et deuxièmement corps, et notre corps est notre demande de registre. Mais encore une fois, nous obtenons ici une erreur car notre type est observable de l'objet et non observable par l'interface utilisateur actuelle. Parce que, évidemment, par défaut, publication HTTP ne sait pas ce que nous voulons fournir des informations. C'est là que, dans notre publication HTTP, nous devons fournir ce que nous récupérons. Et c'est l'interface utilisateur actuelle, mais ce n'est pas tout, devra également créer une méthode supplémentaire pour définir le jeton dans le stockage local. Qu'est-ce que cela signifie ? En fait, lorsque nous enregistrons un utilisateur ou que nous obtenons l'utilisateur, nous obtenons également le champ de jeton que nous avons préparé sur le backend. Et nous ne devrions rien faire avec ce champ sur le client, mais nous devons simplement l' enregistrer et le stockage local et l'attacher à chaque demande. Dans ce cas, notre backend peut comprendre quand la demande est autorisée et que nous avons fourni le bon jeton. C'est ici que je souhaite ajouter un jeton de jeu de méthodes supplémentaire. Et en fait, à l'intérieur, nous fournirons l'utilisateur actuel car soit nous appellerons cette méthode après avoir obtenu un utilisateur actuel, soit après enregistrement ou guinéen. Donc, ici, l'utilisateur actuel est l'interface utilisateur actuelle et maintenant il renverra nul car à l'intérieur, nous voulons simplement utiliser le stockage local. Et ici, je vais écrire l'élément de jeu de points de stockage local. Et à l'intérieur, je veux fournir une discussion sur le terrain et nous écrivons à l'intérieur du jeton de point utilisateur actuel. Cette méthode stocke donc simplement dans LocalStorage notre jeton de l'utilisateur actuel, et maintenant nous sommes entièrement prêts à ajuster notre composant. Revenons donc à l'intérieur notre composant de registre des composants. Et nous avons ici à soumettre, et évidemment cette valeur ferme est tirée ici. Nous voulons utiliser notre service. C'est pourquoi je souhaite injecter ici notre service. Nous écrivons donc à nouveau en privé et nous avons notre service, qui est notre classe de service d'authentification. Et maintenant, à l'intérieur de la soumission, nous pouvons écrire ce registre de points de service. Et comme vous pouvez le voir, nous sommes fournis dans une demande de registre, mais à l'intérieur de notre composant, nous avons juste cette forme de point, la valeur du point. Et en fait, cette valeur ferme, comme vous pouvez le voir ici, le type de celle-ci est quelconque, c'est pourquoi elle fonctionnera pour nous et nous ne pouvons pas vraiment la taper de quelque façon que ce soit. Alors, quels sont les retours enregistrés rapidement ? C'est un observable. C'est pourquoi ici nous pouvons à nouveau écrire Subscribe with so object inside dans les champs qui seront suivants s'il est correct ou s'il s'agira d'une erreur. Donc à l'intérieur suivant, mais nous allons obtenir le sac utilisateur actuel. Et ici, nous allons faire un peu de logique. Et si nous avons une erreur ici, nous devons spécifier un aérodrome. Et voici une fonction avec Era. Et à l'intérieur, nous pouvons simplement vous connecter à la console et réduire. Donc tout d'abord, je veux écrire une erreur, une erreur ici dans le journal de la console suivante notre utilisateur actuel, coma, utilisateur actuel. Maintenant, vérifions-nous si cela fonctionne. Je fournirai un e-mail qui n'existe pas dans le nom d'utilisateur et le mot de passe et je clique sur Enregistrer. Et comme vous pouvez le voir, voici notre réseau. Nous arrivons ici pour demander. Tout d'abord, nous recevons une demande d'options. Et c'est tout à fait normal parce que nous avons utilisé bien sûr. Et nous avons une demande entre deux hébergeurs différents parce que nous hébergeons nos applications sur des parties différentes. Vous verrez donc ces options à chaque fois. C'est tout à fait normal. Mais nous sommes intéressés par notre demande de publication, qui est la publication par les utilisateurs sans chemin slushy. Et voici notre charge utile. La charge utile est parfaitement correcte et voici notre réponse. Comme vous pouvez le voir, nous récupérons notre identifiant e-mail et notre nom d'utilisateur, ce qui signifie que tout fonctionne correctement. Et voici notre utilisateur actuel. Mais comme vous pouvez le voir précédemment, nous obtenons une erreur, une réponse d'erreur HTTP. Et cela ne devrait pas vous déranger car c'est l'erreur de cette requête non autorisée et nous la corrigerons dans la vidéo suivante. Cela n'a aucun effet sur notre composant de registre. Comme vous pouvez le voir ici dans la console, nous récupérons notre utilisateur actuel, ce qui signifie que notre code est complètement correct. Donc, ce que nous pouvons faire maintenant, nous pouvons écrire ce point et ici nous avons notre service et nous pouvons appeler ici un jeton de jeu de méthodes et fournir insert current user. Ensuite, cette ligne, parce que nous avons ici l'utilisateur actuel enregistrera notre jeton de CurrentUser dans le stockage local, mais il n'est pas conservé. Nous voulons également enregistrer un utilisateur pour l'ensemble de l'application, et nous sommes déjà préparés pour la même méthode dot set CurrentUser. À l'intérieur. Nous pouvons simplement fournir notre CurrentUser et écouter cette méthode. Il va simplement définir cet utilisateur actuel dans le flux des utilisateurs actuels. Vous verrez comment utiliser flux utilisateur actuel dans les vidéos ultérieures. Plus important encore, maintenant après l'enregistrement, nous l'avons défini sur Target et nous nous sommes assis chez CurrentUser dans notre application. Et la dernière chose que nous voulons mettre en œuvre est notre validation. Parce qu'en fait, si nous obtenons une erreur, nous voulons la montrer. C'est pourquoi ici. Tout d'abord, je veux taper notre erreur parce que nous savons de quoi il s'agit. Il s'agit d'une réponse d'erreur HTTP. Et là, nous obtenons notre erreur et nous pouvons écrire ici point Azure au moins. Et oui, cette flèche sera quelconque, mais c'est toujours mieux que rien. Mais nous voulons maintenant enregistrer notre erreur ici. Maintenant, la question est de savoir dans quel format nous obtiendrons nos erreurs. Et pour cette seconde ouverture à nouveau, nos contrôleurs, utilisateurs. Et comme vous pouvez le voir, voici notre truc. Et ce que nous faisons dans cette ligne, nous cartographions nos erreurs et nous recevons des messages sous la forme d'un tableau de chaînes, ce qui signifie que nous sommes sûrs que si nous obtenons une erreur, c'est toujours un tableau de chaînes. C'est pourquoi ce que nous pouvons faire dans le composant de registre interne de notre client, nous pouvons générer un message d'erreur et l'afficher ici. C'est y. Ce que je veux faire ici, je veux créer juste une seule erreur et elle sera de type chaîne maintenant. Et par défaut, ce sera maintenant parce que nous n'avons pas d'erreur. Maintenant, à l'intérieur de notre erreur, nous pouvons écrire cette ère de points. Nous savons que nous recevons ici notre erreur sous forme de tableau. C'est pourquoi ici, nous pouvons simplement créer une jointure point point Azure ici deviendra un espace, ce qui signifie en fait que nous voulons joindre toutes nos erreurs avec une virgule et un espace, et ce sera juste un terrain. Maintenant, je veux sauter à l'intérieur d'un composant de registre HTML ici où nous avons des erreurs de classe div. Je veux écrire et GE et afficher ce champ uniquement lorsque nous avons une erreur et qu' à l'intérieur, ils peuvent simplement rendre notre erreur. Maintenant, vérifions-nous si cela fonctionne. Mais comme vous pouvez le voir ici, nous obtenons une erreur impossible de lier à G si ce n'est pas une propriété connue de div. Et cela se produit lorsque nous n'avons pas injecté de module commun dans notre module. C'est là qu' à l'intérieur des importations, nous devons entrer le module commun d'Angular. Comme vous pouvez le voir, nous n'obtenons aucune erreur. Et ce que je veux faire, fournir des données non valides. Par exemple, dans un e-mail, je fournirai des données et non un format incorrect. Maintenant nettoyons tout et cliquons sur Enregistrer. Et comme vous pouvez le voir ici, nous recevons notre erreur. Et il s'agit d'un tableau avec une adresse e-mail non valide. Et nous rendons cet e-mail non valide ici en haut, qui signifie en fait que nous avons correctement réagi Azure et Don lors de l' enregistrement de notre utilisateur. Maintenant, vérifions-nous si nous parlons vraiment en toute sécurité après l'enregistrement. C'est là que nous allons recharger la page et fournir un e-mail, un nom d'utilisateur, un mot de passe corrects et cliquez ici pour vous inscrire. Comme vous pouvez le voir, nous avons notre utilisateur, ce qui signifie que nous avons commencé en mémoire. Mais ici, lorsque je suis champion du stockage local de l'application, vous pouvez voir notre jeton et voici une valeur, ce qui signifie que nous avons réussi implémenter l'enregistrement de l'utilisateur et nous avons stocké le jeton dans LocalStorage. 16. Page de connexion: Dans la vidéo précédente, nous avons terminé avec succès notre page d'inscription. Dans cette vidéo, nous devons implémenter la page de connexion. Et je pense que c' est une idée géniale que vous essayez de la mettre en œuvre vous-même. Que devons-nous implémenter sur cette page ? En fait, la page de connexion est simplement une URL slash login et nous voyons exactement le même formulaire comme s'inscrire, mais formulaire de connexion. En fait, nous n'avons qu'un e-mail et mot de passe et nous n'avons pas de nom d'utilisateur. Évidemment, tous les textes sont différents, mais c'est essentiellement ça. Nous utiliserons également l'autre demande de suivi du jeu sur les utilisateurs de slushy pie slash login. Et voici trois niveaux de complexité pour vous. Tout d'abord, vous pouvez mettre cette vidéo en pause dès maintenant et essayer de l' implémenter vous-même. deuxième niveau est que vous recevez quelques conseils de ma part avant de commencer à mettre en œuvre. Alors, que devons-nous faire ? Tout d'abord, comme vous pouvez le voir ici, à l'envers des composants, nous avons un composant de registre. Et comme je l'ai dit plus tôt, avec ne pas vouloir partager le composant entre l'enregistrement et la connexion, ce qui signifie en fait que nous pouvons implémenter le nouveau composant login avec exactement le même balisage, mais sans notre nom d'utilisateur et notre fichier ts sera super similaire. Nous avons besoin d'un formulaire, nous avons besoin de onsubmit et ainsi de suite. Mais la principale différence sera dans un service, nous n'utiliserons pas notre service qui s'enregistre, mais nous devons créer une méthode de connexion, ce qui signifie en fait que nous devons dans notre service ici, créer une demande de connexion, qui effectuera un appel d'API. Et en fait, il sera très similaire à notre registre. Mais ici, nous devons créer non pas une interface de demande enregistrée, mais une interface de demande de connexion. Et puis à l'intérieur, nous devons fournir une URL correcte si vous voulez l'essayer vous-même. Maintenant, il suffit de mettre la vidéo en pause ici. Et si tu ne veux pas l'essayer toi-même, faisons-le ensemble. Et notre première étape sera de créer l'interface de notre service. Nous avons donc ici notre interface de demande de registre. Et en fait, comme vous pouvez le voir, nous avons trois champs ici, nous ne pouvons donc pas les réutiliser dans login. Mais je veux faire ici, je veux créer une nouvelle interface, une interface demande de connexion. Passons à l'intérieur de ce fichier et nous pouvons copier-coller complètement notre interface de demande de registre, juste parce qu'elle sera super similaire et qu'ils ne veulent pas beaucoup taper. Nous devons donc créer ici notre interface, l'interface de demande de connexion. Et nous avons un e-mail interne et un mot de passe, et nous n'avons pas notre nom d'utilisateur. Nous avons donc créé notre interface avec succès. Maintenant, nous pouvons revenir à l'intérieur notre service et nous pouvons copier-coller méthode de registre complètement parce que méthode de connexion sera super similaire. Nommons notre méthode de connexion. Et ici, nous ne recevons pas de demande d' enregistrement, mais notre demande de connexion, ici nous avons besoin d'une autre interface que nous venons de créer. C'est une interface de demande de connexion. Et de retour, nous obtenons notre utilisateur, ce qui signifie que c'est une interface utilisateur actuelle correcte et observable. Voici maintenant l'URL. Nous avons ici API URL slash users slash login. Et cette API est déjà implémentée dans notre backend. Login est certainement une demande de publication, ce qui signifie que nous devons fournir un message avec une demande de connexion corporelle que nous définissons comme paramètre et notre service de connexion est entièrement implémenté. Notre prochaine étape sera de créer un composant ici et ce composant de registre défini est très similaire à notre composant de connexion. Cela n'a aucun sens de tout retaper vous-même. C'est pourquoi je souhaite copier l'ensemble du dossier et le coller ici et renommer le dossier login. Nous avons maintenant un composant de connexion. Nous devons renommer ici les pages. Ce sera donc le composant point point HTML de connexion. Et voici le composant point de connexion point ts. Nova doit sauter dans notre code HTML et le modifier un peu pour que ce ne soit pas si différent. Tout d'abord, ici, au lieu d'être inscrit sur Trello, nous pouvons écrire login dans la bande-annonce. Maintenant, nous partons d'ici erreur, tout comme nous les avions. Il fallait également soumettre un formulaire et ici nous avons e-mail, nom d'utilisateur. On n'a pas besoin du grand, on peut l'enlever. Nous avons notre mot de passe. Et maintenant voici le bouton de soumission, pas avec le registre, mais nous nous connectons, par exemple, le dernier mais non moindre est le lien du routeur ici en bas, il devrait aller à une page d' enregistrement. C'est ici que se trouve le registre des barres obliques. Et au lieu de ce texte, nous pouvons écrire dans «  S'inscrire pour un compte ». Nous avons donc réussi à modifier notre code HTML. Passons maintenant à notre fichier TypeScript. Tout d'abord, nous devons changer de sélecteur. Il n'est pas enregistré, mais notre identifiant et notre modèle sont des composants de connexion HTML. Maintenant, ClassName est également différent. C'est le composant de connexion Live era tel quel. Voici notre formulaire. Nous avons besoin d'un e-mail et d'un mot de passe, mais pas de nom Alors supprimons simplement le nom d'utilisateur ici. Notre constructeur reste le même. Notre onsubmit reste presque le même. Mais ici, nous n' utiliserons pas la méthode register. Nous avons créé une méthode de connexion à l'intérieur où nous fournissions le formulaire complet. Et ici, nous avons subscribe et si nous réussissons à nous connecter, alors ici nous avons le journal de la console et l'utilisateur actuel définis dans talking et nous sommes définis dans l'utilisateur actuel, ce qui signifie en fait que c'est exactement 99% exactement le même code comme enregistrement interne. Et la dernière étape sera d'enregistrer nos composants. Nous devons donc sauter dans les larmes de notre module. Ici, à l'intérieur des déclarations, nous devons dire que nous avons un nouveau composant et qu'il s'agit d'un composant de connexion. Et nous devons également créer ici un nouvel itinéraire. Je vais donc copier-coller la route du registre et ce chemin login et composant seront des composants de connexion. Allons voir si ça fonctionne. Nous n'avons aucune flèche ici à l'intérieur de l'observateur. Je vais recharger la page et essayer de sauter ici en bas, par exemple, dans la page de connexion. Et comme vous pouvez le voir où sur slash login. Et voici notre formulaire et nous pouvons recharger la page où tache sur cette page, tout va bien. Essayons maintenant si nous pouvons nous connecter. Donc ici, tout d'abord, je veux écrire quelque chose de incorrect. Voici un e-mail qui n'existe pas. Et puis un mot de passe. Je frappe ici en disant dedans, et nous obtenons une erreur, comme vous pouvez le voir ici auparavant, nous obtenons une erreur de photo avec des validations. Et à l'intérieur de notre erreur où obtenir un e-mail ou un mot de passe rempli, e-mail incorrect un mot de passe. Et nous le faisons dans ce cas parce que nous ne voulons pas avertir l' utilisateur de ce qui n'est pas correct. Nous ne devrions pas dire que quelque chose comme cet e-mail est déjà pris. Nous disons simplement qu'il n'est pas valide. C'est pourquoi cette logique à l'intérieur du composant de connexion de bone fonctionne. Et juste pour vous rappeler ici, nous copions collés lors soumission et ici à l'intérieur d'une erreur avec nos erreurs jointes, car dans le cas page Register, nous avions ici un tableau de chaînes. Ici, nous ne l'avons pas avec voir directement une flèche, un e-mail, un mot de passe, ce qui signifie en fait qu'ici, au lieu de rejoindre, nous pouvons écrire un e-mail ou un mot de passe Dodd. Dans ce cas, nous l'appliquerons correctement zone à l'intérieur. Allons vérifier le son. Je recharge la page. Tapons ici un e-mail qui n'existe pas, mot de passe de connexion et nous recevons un mot de passe incorrect , ce qui signifie que notre validation fonctionne correctement. Essayons maintenant de vous connecter avec les informations d'identification correctes. Voici donc j'ai complet sur gmail.com et voici notre mot de passe 123. Je frappe ici, disons méchant, et nous obtenons l'utilisateur actuel. Mais le principal problème, c'est que nous restons sur cette page. Et deuxièmement, nous n'avons pas du tout supprimé cette zone. Et en fait, nous pouvons faire les deux choses simultanément. Tout d'abord, ce que je veux faire ici en soumettant, nous pouvons supprimer Sarah. Voici donc cette erreur de dollar que nous pouvons écrire à l'intérieur maintenant. Et en fait, je peux dire maintenant que le nom de l'ère n' est pas le meilleur parce qu'en fait, error est super générique et ils aimeraient changer ce nom ici de era en message era par exemple, dans ce cas, nous devons le changer ici à l'intérieur de l'ère suivante et ici à l'intérieur de l'ère. Et après cela, nous devons passer au modèle et le modifier également. Donc, ici, nous avons Angie en cas d'erreur, ce devrait être un message d'erreur. Nous sommes ici en train de rendre notre époque. Et je pense que cette approche est beaucoup plus propre parce qu'elle nous permet de comprendre ce que nous rendons ici. Il ne s'agit pas d'une erreur générique. C'est vraiment un message d'erreur. Nous devons maintenant appliquer exactement la même chose dans notre registre. Revenons donc à notre registre. Et ici tout d'abord, je veux écrire un message d'erreur. Voici aussi un message d'erreur, puis dites le fichier ts, je veux changer le message d'erreur de la flèche deux ici, le message d'erreur droit dans era, et nous voulons le définir maintenant dans notre succès. Donc ici ce message d'erreur est égal à maintenant, la dernière chose que nous voulons faire, nous voulons rediriger l' utilisateur vers une autre page. Cela n'a aucun sens que nous restions sur cette page et qu'elle répertorie, nous voulons aller à la page d'accueil après la connexion d'un utilisateur. Pour cela, nous devons injecter ici notre routeur. C'est mon constructeur d'insert. Je peux écrire un routeur privé égal à un routeur. Et comme vous pouvez le voir, ce routeur provient de angular-ui-router. Et maintenant, dans le succès, sur la dernière ligne, nous pouvons écrire ce point, point de navigation par URL. Et nous fournissons ici une URL, par exemple, juste une barre oblique. Et maintenant, nous devons faire exactement la même chose sur notre page de connexion. Je saute donc à l'intérieur du composant de connexion ici. Tout d'abord, je veux injecter un routeur Zhao privé. Et après cela, je peux coller cette ligne, cette route naviguer par barre oblique d'URL, qui signifie en fait dans les deux cas, avec inscription et connexion, que nous voulons rejeter notre utilisateur sur la page d'accueil. Allons voir si ça fonctionne. Je suis ici sur la page de connexion J'écris ici f2 à gmail.com, ici 123. Je clique sur la connexion, puis sur la page d'accueil, ce qui signifie que nous avons réussi à implémenter notre page de connexion. 17. Page d'accueil: Dans les vidéos précédentes, nous avons terminé notre page de connexion. Dans cette vidéo, nous allons implémenter notre page d'accueil pour le projet. Et le point principal est que cette page sera juste un balisage et aucune logique du tout. Pourquoi est-ce que c'est ? Parce qu'en fait, cette page est réservée aux utilisateurs anonymes si nous sommes bloqués mais ne voyons jamais cette page car nous sommes directement redirigés vers la page des tableaux d'informations. Tout d'abord, implémentons dans votre module. Et pour cela dans l'application, je veux créer un nouveau module qui s'appelle Home, ce qui signifie en fait qu'il s'agit d'un module complètement séparé. Cela n'a rien à voir avec les heures, et il y a juste un composant de page d'accueil à l'intérieur qui est isolé à l'intérieur de ce module. Allons donc à l'intérieur de ce dossier et créons un nouveau fichier Home module Ts. Et beaucoup d'étudiants me demandent très souvent pourquoi ils n'utilisent pas de générateurs avec Angular. Et en fait, il y a une raison à cela. Je trouve qu'il faut plus de temps pour utiliser un générateur pour simplement copier-coller le module si nécessaire, et aussi pour le processus éducatif, afin que vous vous en souvenez mieux. Je l'écris de toutes pièces. C'est y. Créons à nouveau un module d'accueil à partir de zéro. Et à chaque module suivant, nous allons simplement copier-coller. C'est ce que nous voulons faire ici. Nous voulons créer une nouvelle classe et la nommer module d'accueil. Après cela, nous devons injecter ici un décorateur dans le module GI. Et à l'intérieur, nous devons fournir nos dépendances, au moins ici dans les entrées, nous devons fournir un module commun parce que nous en avons besoin dans chaque module. Par exemple, pour les boucles comme dans G4, offrant G Si maintenant, créons notre composant home pour cette biomasse, créez un nouveau composant de répertoire. Et à l'intérieur, nous voulons créer un nouveau dossier d'accueil. Et oui, je comprends que nous n'avons qu'un seul composant ici et cela n'a pas beaucoup de sens de créer des composants de barre oblique plutôt que le dossier Home à l'intérieur. Mais c' est quand même une bonne structure. Et si vous n'avez pas besoin de diviser cette page d'accueil en différents composants, vous pouvez le faire à coup sûr. Passons donc à l'intérieur de la page d'accueil et créons ici le composant principal point HTML et le composant principal point ds. Maintenant, allons à l'intérieur de la page HTML et rentrons chez nous ici, mais nous n'avons besoin de rien, juste quelque chose à tester. Passons maintenant à l'intérieur de notre fichier ts. Et ici, nous voulons créer notre classe et c' est le composant principal. Ensuite, nous devons enregistrer nos composants. Nous voulons donc injecter notre composant et à l'intérieur nous devons tout d'abord fournir un sélecteur. Donc, ici, je vais simplement utiliser un sélecteur home car cela n'a pas beaucoup de sens de préfixer notre composant home avec un nom de module comme home, home, ce n'est tout simplement pas nécessaire après notre sélection, nous devons fournissez ici à l'URL du modèle, puis dites URL du modèle, nous aurons le composant HTML de la maison. Et notre dernière étape consiste à ajouter notre composant à notre déclaration. Donc, dans le module home ici, nous voulons créer des déclarations et les mettre dans notre composant home. Tout va bien ici, mais nous n'avons pas créé d'itinéraire. C'est pourquoi je veux créer ici une propriété routes. Et nous pouvons dire que c'est un type routes et qu'il s'agit d'un tableau avec une seule clé. Et voici notre chemin. C'est une chaîne vide, cela signifie page d'accueil, et voici notre composant, et notre composant sera le composant principal. Ensuite, nous pouvons enregistrer cet itinéraire dans les entrées. Voici donc le point du module de route pour les routes enfants. Et maintenant, nous ne devons pas oublier d'enregistrer notre module d'accueil dans notre module d'application. C'est pourquoi je souhaite revenir à l'intérieur de notre module d'application. Ici, initié aux oiseaux, nous pouvons ajouter notre module d'accueil. Tout va bien. Je ne vois aucune erreur à l'intérieur de l'observateur. Ouvrons donc un navigateur et voici notre page d'accueil. Comme vous pouvez le voir, le mot home est affiché ici, ce qui signifie que nous avons créé avec succès tout notre module et notre composant vide. Et maintenant, nous devons simplement essayer de baliser la page entière. C'est mon, revenons à l'intérieur des composants home, home, home component HTML. Ici, commencez à écrire notre balisage. Rien de spécial ici, juste plein d'éléments DOM. Nous avons donc ici un en-tête avec un en-tête en verre. Et maintenant, fermons cet en-tête. Ensuite, nous voulons créer un lien vers notre page d'accueil. Voici donc une barre oblique de liaison de routeur. Et ici, nous avons la classe à la maison qui avait un lien de domicile. Fermons la vente et remplissons le double lien pour montrer une image. Nous aurons donc ici la barre oblique source de l'image, etc., barre oblique Trello, le logo, le point blanc SVG. Et terminons cette image. Comme vous pouvez le voir dans le navigateur, il est appliqué. Et ici, nous voyons notre en-tête et notre lien vers notre page d'accueil. Nous devons maintenant fournir des liens vers la page de connexion et d'inscription. C'est pourquoi après a, on peut écrire div. Et à l'intérieur de div, nous pouvons écrire deux liens. Tout d'abord, ici, à l'intérieur de div aura un lien routeur vers notre login slash que nous venons de créer avec la classe WHO avait un login, je vais fermer la vente. Et juste à l'intérieur de la connexion, nous pouvons maintenant copier-coller ce lien et ici nous avons slash register. Voici le registre d'en-tête de la classe d'accueil, et le texte à l'intérieur sera également enregistré. Nous allons vérifier si cela fonctionne, comme vous pouvez le voir dans le navigateur ici à droite, nous avons un lien de connexion et un lien d'inscription. Maintenant, disons le premier bloc de notre page. Voici donc Div, héros de la maison de classe. Fermons cette div et à l'intérieur nous voulons ajouter un conteneur home de classe div. Fermons cette division. Et à l'intérieur du conteneur domestique, nous avons un div. Et à l'intérieur de cette div se trouvera la balise H1. Et ici, nous avons le titre de maison de classe Desh. Fermons ce H1 et à l'intérieur de chacun d'eux je veux coller. Bien que le texte préparé aide les équipes à travailler de manière plus collaborative et à en faire plus après chacune d'elles, nous avons une balise p. C'est notre description. Voici une description de la maison en verre. Et à l'intérieur de ce p, je vais coller la description des tableaux Trello, des listes et des courants. Après la première div, nous aurons une deuxième div. Fermons-le. À l'intérieur. Il doit s'agir d'une image. Donc, voici source de l'image slash acides slash hero dot SVG. Fermons cette image et vérifions si elle fonctionne. Nous sautons dans le navigateur. Comme vous pouvez le voir ici, nous avons une première section de notre page d'accueil. Ici, à gauche, nous avons du texte et une belle image à droite. Je pense que vous avez une idée taux de travail et des blogs pour la page d'accueil. Comme vous pouvez le voir, nous avons simplement un titre de blog, une description et une image, ce qui signifie en fait que vous souhaitez accélérer le processus de création de la page d'accueil car il s'agit simplement d'un code HTML sans aucune logique. Ici, je veux coller la deuxième équipe d'accueil du blog. Si vous le souhaitez, vous pouvez simplement mettre la vidéo en pause , tout retaper ou simplement prendre le code HTML de la page d'accueil dans le code source sous la vidéo. Donc, ce que nous avons ici, nous avons une équipe à domicile, un conteneur d'équipe de conteneur à l'intérieur. Nous avons travaillé avec n'importe quelle équipe, description et une image. Voyons à quoi ça ressemble. Ici. Après notre premier élément, nous avons le second avec du texte et maintenant l'image. Créons maintenant un bloc de plus ici. Je colle les informations personnelles. Mêmes choses ici, nous avons des classes en image que H1 et p. Voyons ça. Je suis en train de recharger la page et nous avons ici en bas un bloc de plus avec une image et des textes. Et maintenant, collons notre dernier bloc. Comme vous pouvez le voir, il est un peu plus grand. Nous avons ici quelque chose sur le flux de travail et l'automatisation. Nous avons ici la description H1 et aussi la liste à puces. Et à droite, nous avons une image comme toujours, comme vous pouvez le voir ici, à droite, nous avons une image et à gauche, nous avons d'abord une description du titre puis une liste à puces, qui signifie que nous avons créé notre page d'accueil avec succès. Ce n'était pas quelque chose de spécial, juste un marqueur pour un utilisateur non connecté. 18. Intercepteur d'Auth: Dans la vidéo précédente, nous avons créé notre page d'accueil avec succès, mais nous n'avons plus qu' un seul problème. Nous avons en fait mis en œuvre l' obtention de l'utilisateur après la page pour vous rappeler, dans notre application d'information client, composant de l' application ts, nous appelons notre service obtenir l'utilisateur actuel. Et en fait maintenant, nous recevons toujours une erreur ici et non autorisée. Et en fait, si je vais aller à la page d'inscription et créer simplement un compte qui n'existait pas auparavant. Comme vous pouvez le voir après l'inscription où l'on a réagi à la page d'accueil. Et à l'intérieur du stockage local, nous avons ce jeton. C'est ce que nous avons défini depuis le back-end pour authentifier notre client. Mais ensuite, rechargez la page. Ce jeton n'est pas utilisé et nous arrivons ici sans autorisation. Et l'idée est essentiellement que le client de la tour doit, à chaque demande, appliquer ce jeton depuis le stockage local si nous l' avons, dans ce cas, notre backend sait quand nous sommes autorisés, mais imaginez simplement si nous avons rarement besoin d' entrer dans chaque méthode, comme par exemple, obtenir l'utilisateur actuel et qu'il a quelques cheveux du stockage local. Ce n'est pas déficient, cela prend beaucoup de temps, et nous voulons vraiment ajouter ce jeton à chaque demande. Pour cela à l'intérieur de Angular, nous avons des middlewares. C'est pourquoi nous allons maintenant créer un middleware now. Qu'est-ce qu'un middleware ? C'est quelque chose entre le début de notre requête et, et, en fait, ici, nous avons, par exemple, le HTTP GET et nous allons créer un middleware. Cela signifie qu'après le démarrage de cette demande, elle n'a pas été envoyée ici. Nous voulons appliquer un intergiciel, donc nous voulons faire quelque chose. Par exemple, il y a un en-tête. C'est pourquoi je veux entrer dans les services de notre maison et créer ici pendant vos heures de service, intercepteur, points de service DOD. Et ce ne sera qu'un cours, tout comme un service injectable normal. Ici, nous avons des experts, des heures de cours, un intercepteur, et ici nous devons dire implémente l'intercepteur http. L'idée principale est donc que cet intergiciel dans Angular est appelé interceptif parce qu' il intercepte notre requête. Et ici, nous écrivons implémente l'intercepteur http pour obtenir un intercepteur de classe étroit implémente incorrectement l'interface et l' interception de propriété est manquante, et c'est exactement ce que nous devons create afin d' implémenter ce middleware. C'est pourquoi nous allons créer ici une nouvelle méthode appelée intercept. Et comme vous pouvez le voir ici, ma saisie semi-automatique a déjà reçu la requête et la suivante, et elle renvoie un événement HTTP observable de bureau, ce qui signifie en fait que nous avons un accès complet ou une requête ici dans la propriété request. Et nous appellerons la prochaine fois que nous serons prêts et nous aurons terminé tout ce que nous devons faire ici. C'est pourquoi tout d'abord, ce que nous voulons faire à l'intérieur est d' obtenir un jeton de notre stockage local. Ecrivons ici que nous avons une cible et il s'agit d'un élément de stockage local. Et à l'intérieur, nous fournissons un jeton. Après cela, je veux écrire request equals request clone. Et ici, à l'intérieur, nous fournissons un objet avec des en-têtes de groupe de champs. Les informations qui l'entête sont un objet que nous fournissons autorisation sont égales à une chaîne parlante ou vide. Et après cela, nous appelons la poignée de retour à côté et nous avons été fournis dans notre demande. Donc, ce que fait ce code, tout d' abord, nous avons obtenu un jeton de la recherche Google. Il s'agit donc d'un élément non défini ou d'un jeton valide. Maintenant, nous faisons une demande de clonage. Pourquoi faisons-nous ça ? Parce que la requête est immuable, nous ne pouvons pas vraiment la modifier. C'est là que nous devons l'eau de Cologne afin de fixer quelque chose. Ici, nous utilisons des propriétés set header pour définir un en-tête. L'en-tête est appelé autorisation et à l'intérieur, nous fournissons notre jeton. Donc, si nous n'avons pas de jeton, nous disons ici une chaîne vide. Et après cela, nous appelons le handle suivant, qui signifie essentiellement que nous devons poursuivre notre demande et que nous fournissons une demande mise à jour à l'intérieur. C'est ainsi que nous créons des intergiciels ou des intercepteurs dans Angular. Mais maintenant, nous devons injecter cet intercepteur dans notre application. Mais la chose principale mais nous voulons faire pour injecter un intercepteur, pas à l'intérieur du module, mais à l'intérieur du module d'application parce que nous voulons le faire au niveau mondial pour injecter l'intercepteur, nous utilisons des fournisseurs ici. Donc, ce que nous voulons faire à l'intérieur de ceci fournit un objet avec un champ provide, et nous utilisons ici des intercepteurs HTTP. Il vient d'Angular aussi, nous utilisons ici la classe. Voici notre classe, notre intercepteur, que nous venons de créer. Et le dernier est déplacé vers vrai. Et c'est exactement comme ça que nous devons fournir des intercepteurs http dans Angular. Nous disons donc que nous devons nous inscrire et que vous avez fourni et qu'il s'agit d'un intercepteur http et que nous devons utiliser notre intercepteur d' heures de cours. Maintenant, vérifions-nous si cela fonctionne. Je recharge la page et vérifions à l'intérieur du réseau, notre utilisateur de demande. En fait, je veux faire défiler vers le bas. Ici, nous pouvons voir l'autorisation et notre jeton, qui signifie en fait notre interception, fonctionne correctement. Et nous avons directement appliqué cet en-tête d'autorisation à chaque requête, par exemple pour obtenir un utilisateur actuel. Mais nous sommes toujours en train de récupérer notre erreur 401 et ils savent quel est le problème. Si nous regardons à l'intérieur du stockage local, nous pouvons voir que ce jeton est simplement une cible, c'est juste une valeur. Mais si nous revenons à l'intérieur de notre backend ici, à l'intérieur de la source, des middlewares, des hiboux. Et c'est là que nous vérifions un jeton ici car vous pouvez voir où faire une division par un espace. Parce que comme je l'ai dit tout à l'heure, nous sommes dans la bière puis dans l'espace. Si nous utilisons une authentification DVT, ce n'est pas le cas ici. Nous n'avons pas un mot ici, bière, et c'est exactement notre problème. Nous ne l'avons pas implémenté, et nous devons le faire lorsque nous renvoyons un jeton au client. Donc ici, à l'intérieur des serveurs, des contrôleurs de source, des utilisateurs, lorsque nous générons un couple ici, dans utilisateurs normalisés, nous devons écrire ici de l'espace. Ici, nous avons le train de justice, où à l'intérieur, où bon, et de la bière. Et ici, nous injectons le jeton que nous avons généré. Allons voir si ça fonctionne. Donc notre jeton n'est pas valide, ils le supprimeront simplement et il passera à la page d'enregistrement. Maintenant, je veux juste mettre quelques informations d'identification ici et cliquer sur « S'inscrire ». Et maintenant, lorsque nous vérifions notre stockage local, vous pouvez voir que nous avons de la bière plutôt que de l'espace et que nous discutons. C'est pourquoi, lorsque je recharge la page avec l'erreur « ne plus obtenir pour 01 », nous obtenons ici notre réponse. Et en fait, ici, vous pouvez voir que notre utilisateur de requête est 200 et notre réponse est exactement ce que nous attendions, comment cela fonctionne. Une fois de plus, nous nous inscrivons, par exemple, ou nous nous connectons et nous créons un jeton dans le stockage local. Donc, l'espace Birra et le jeton chaque fois que nous faisons une requête sur l'intercepteur dans Angular, il s'attache à l'intérieur de l'en-tête, ce jeton d'autorisation. Et ici, nous avons ours, puis notre jeton et notre back-end vérifient cet utilisateur et nous donnent une réponse ici. C'est pourquoi chaque fois que nous rechargeons la page, nous récupérons notre utilisateur actuel. Et c'est exactement ce que nous voulions atteindre. Maintenant, ici, à l'intérieur de nos clients, source AB, composant AB, oui, je veux apporter une petite amélioration parce qu' en fait, ici, nous avons annoncé un service, mais nous n'utilisons pas ce Ras et en fait maintenant nous obtenons un utilisateur donc nous pouvons écrire ici non pas trans, mais c'est l'utilisateur actuel. Et au lieu du journal de console, nous voulons le définir avec la méthode que nous avons déjà préparée. Nous avons donc ceci, notre service dot set utilisateur actuel, et à l'intérieur nous fournissons notre utilisateur actuel. Notre utilisateur est maintenant connecté avec succès à notre application. 19. Garde de la bouche: Dans cette vidéo, je veux parler de Gvd dans nos URL, ce qui signifie, par exemple, que nous ne devrions pas autoriser l'utilisateur à accéder à la page d'accueil. S'il est déjà enfermé, il doit sauter directement sur le plateau. Par exemple, si nous ne sommes pas bloqués et que nous essayons d'accéder à la page du tableau, alors lorsque nous ne sommes pas autorisés à entrer nous devons être redirigés vers la page d'accueil. Il existe donc différentes approches à ce problème. Mais pour tout cas d'utilisation, je vous recommande vivement de commencer par créer un observable d' étain islamique. Faisons ça maintenant. Donc, en fait, je veux sauter dans notre application, nos services, notre service ici sera créé flux d'utilisateurs actuels. Et comme ils l'ont dit, il est coupé que nous pouvons utiliser à partir de n'importe quel endroit de notre application. Et juste pour vous rappeler, nous utilisons ici définir l' utilisateur actuel pour modifier le flux. Donc, essentiellement, ce que nous pouvons faire maintenant, par exemple, à l'intérieur de notre composant d'application quelque part après juin, nous pouvons écrire ce point, notre point de service utilisateur actuel ici nous avons raison et abonnez-vous au forum, et nous obtenons ici notre réponse. Et maintenant je veux juste écrire ici le journal de la console. Tu vois de quoi je parle ? Nous nous sommes donc abonnés au flux de notre service. Désormais, chaque fois que nous changeons de flux, nous récupérons ces données dans ce composant. Vérifions-nous maintenant dans le navigateur. Et nous obtenons ici deux journaux de console. Tout d'abord faire la course et le définir, puis Ras et les informations sur notre utilisateur, pourquoi cela se passe comme ça au début du flux ne l'est pas parce que nous n'étions pas encore un utilisateur louche. Mais après un certain temps, lorsque notre appel CurrentUser est terminé et qu'il est réussi, nous définissons CurrentUser dans ce flux. C'est pourquoi chaque endroit où nous nous abonnons à cet utilisateur actuel peut obtenir ces informations. Et c'est exactement cette information. Mais nous pouvons l'améliorer encore parce que nous voulons essentiellement vérifier s'il est verrouillé ou non. C'est pourquoi vous voulez généralement prendre cette réponse et la convertir en booléen et vérifier la valeur true. Dans ce cas, nous sommes bloqués, mais nous ne voulons pas écrire ce code partout. C'est là que nous pouvons, à l'intérieur notre service, créer un flux supplémentaire basé sur notre premier flux. Voici donc notre utilisateur actuel de Stream. Mais maintenant, je veux créer un nouveau flux, qui s'appelle logger tin. Et maintenant, dans notre application, à n'importe quel endroit que nous pouvons utiliser, nouveau flux est l'équipe de journaux. Alors qu'est-ce qu'ils y ont fait ? Ici, nous utilisons cet utilisateur actuel et il s'agit déjà d'un flux. Nous voulons simplement la transformer en une autre valeur. C'est là que je suis en plein dans le tuyau DOD, puis dans la fonction Plan du site. Et si vous ne le savez pas, c'est le code Rix JS. Donc, essentiellement, nous utilisons des looks chess et disons à Angular pour transformer nos flux. Et c'est de cette façon que nous l'utilisons. Nous écrivons toujours le point pipe , puis la liste de nos transformations. C'est là que vous verrez ce tuyau partout et ici à l'intérieur où vous utiliserez une carte pour cartographier nos données. Nous savons donc qu'à l'intérieur de notre carte nous pouvons obtenir trois états différents, non défini, faux et vrai. Mais le point principal est que notre application ne se soucie pas d'undefined. Il était pertinent de vérifier sa connexion. Si nous avons ces informations, si nous ne les avons pas encore, nous voulons simplement attendre ces informations. C'est bien avant que je veuille ignorer cette propriété non définie en tant que. C'est ici que nous pouvons utiliser le filtre avant notre carte. Et le filtre est également une fonction. Donc essentiellement, tout d'abord, nous utilisons un filtre à l'intérieur du tuyau, puis une carte. Donc, ce que nous obtenons filtre d"informations à l"intérieur du filtre en obtenant notre utilisateur actuel, et en fait cet utilisateur actuel peut être indéfini maintenant ou notre utilisateur actuel. Et ici nous ne voulons pas arriver à la carte si elle n'est pas définie, c' est pourquoi ici nous pouvons écrire l'utilisateur actuel n'est pas égal à undefined it. Dans ce cas, nous viendrons ici et voici notre carte. Donc, ce que nous voulons faire carte encart, où je suis ici, utilisateur actuel. Ici, nous voulons simplement le convertir en booléens afin que nous puissions écrire ici booléen puis utilisateur courant. Dans ce cas, cette logique nous ramènera vrai ou faux, et nous sauterons cela, non défini ce dont nous n'avons pas besoin et que nous n'utiliserons pas dans notre application. Mais nous pouvons encore simplifier ce code. Au lieu de voler et cette logique peut définir la carte, nous pouvons simplement écrire ici booléen, et cela fera exactement la même chose. Donc R is look at tin est un nouveau flux basé sur l'utilisateur actuel, qui retournera pour nous vrai ou faux. Allons voir si ça fonctionne. Je vais revenir en arrière dans le composant d'installation. Et ici je veux écrire ce point ou point de service est verrouillé. Ici, nous pouvons également écrire Subscribe et nos têtes et notre repos seront verrouillés. Alors voyons ça. Nous pouvons même le nommer pour être plus compréhensible, est connecté. Et ici, le journal de la console est le journal de tin, coma est la propriété de connexion. Sauvegardons cela et vérifions-le et naviguons. Je recharge la page et ici nous ne voyons pas l'islam devenir indéfini. C'est. Nous voyons simplement que le passage est faible parce que c'est le premier état où nous avons vrai ou faux. Et c'est exactement de cette façon que nous pouvons utiliser dans n'importe quel endroit de notre application, ce flux pour savoir si l' utilisateur est connecté ou non. Maintenant, je veux supprimer ce code car nous n'en avons pas besoin ici. C'était juste pour les tests. Et maintenant, je veux vous montrer la solution la plus simple, comment vous pouvez rediriger l'utilisateur vers une autre page. Et nous pouvons simplement commencer par notre composant d'accueil, parce que nous voulons essentiellement rediriger l'utilisateur vers la page du forum s'il est déjà verrouillé, comment nous pouvons le faire. Tout d'abord, ici, nous devons injecter à l'intérieur du constructeur notre, notre service. Voici donc le service des heures privées annoncé, service que nous avons déjà. Maintenant, nous voulons écrire des outils sur les besoins, nous avons donc initialisé. Nous allons maintenant utiliser l'ingénierie. Et à l'intérieur maintenant, nous pouvons écrire exactement cette logique Lake Road dans notre composant d'application. Voici donc ce point, notre point de service. Ici, nous sommes enfermés. Donc, après cela, nous pouvons écrire Subscribe et nous pouvons obtenir ici est le connecter à propriété ici à l'intérieur de cet subscribe soit devenir vrai, soit nous obtenons faux. Et si c'est vrai, nous voulons rediriger l' utilisateur vers la page du forum. C'est ici que nous pouvons simplement essayer. Eve est comme une boîte de conserve. Ensuite, nous voulons rediriger l'utilisateur. Et pour essayer de rediriger, nous pouvons utiliser comme nous l'avons utilisé précédemment, le routeur. Nous allons donc créer un nouveau routeur de propriété privée. Et ce routeur, maintenant dans notre condition if, nous pouvons écrire ce point, point de navigation par URL. Et ici, nous pouvons simplement fournir des tableaux slash. Et en fait, nous n'avons pas encore implémenté ces tableaux slash, mais cela n'a pas d'importance. Nous le faisons simplement à titre d'exemple, comment vous pouvez restreindre l' accès aux URL. Allons voir ça. Et en fait, nous avons déjà une erreur, impossible de faire correspondre de nouveaux itinéraires. Et voici les planches. Et essentiellement, nous pouvons le vérifier, par exemple, avec un registre de barre oblique. Pour comprendre que cela fonctionne, je vais recharger la page et comme vous pouvez voir où sur slash register, pourquoi cela se passe où sauter à la page d'accueil, j'appuie sur Entrée et nous n'avons même pas vu notre page d'accueil où ils s'inscrivent directement. C'est donc le moyen le plus simple de mettre en œuvre, par exemple, la redirection angulaire dans une autre route. Mais voici un problème que nous avons utilisé ici, abonnez-vous à partir d'un échange. Tu dois être très prudent avec ça. Parce que si nous utilisons subscribe, nous devons également écrire unsubscribe. Si nous n'avons pas essayé de nous désinscrire, cela signifie que nous avons un abonnement arme de poing dans notre application. En fait, notre pathologie de la composante d'origine a été détruite parce que nous sommes dans la page du registre, mais cet abonnement est toujours là parce que nous ne nous en sommes pas désabonnés. C'est là que nous devons toujours penser à nous désinscrire de nos abonnements. Pour ce faire, nous devons simplement créer un abonnement ici en haut, par exemple, c' est le connecter dans l'abonnement, et le type est abonnement. Maintenant, dans notre moteur, nous pouvons attribuer cet abonnement connecté. Le résultat de Subscribe sera notre abonnement. Maintenant, en haut, nous pouvons ajouter détruire. Donc quand ce composant sera détruit, mais je voulais créer en G sur la méthode de destruction. Et à l'intérieur, nous pouvons simplement écrire ceci, c'est comme obtenir un abonnement, le DOD, se désabonner. Je l'enregistre mais nous obtenons une erreur. Nous n'avons pas d'initialiseur ici parce que l'entrée par défaut faible n'est pas définie, elle n'est pas définie et c'est vrai. C'est pourquoi nous pouvons ici l' écrire ou l'indéfinir, car il n'est pas défini par défaut et nous le définissons simplement en ingénierie. Mais c'est mon code ici, n' est pas valide car cet objet peut être indéfini. C'est pourquoi nous devons ici mettre un point d'interrogation. Donc cette ligne ne fera rien si c'est un it indéfini. Mais si nous avons un abonnement, nous réussirons le désabonnement lorsque le composant sera détruit. Mais maintenant je veux vous montrer la deuxième variante possible à l'intérieur et à la couleur pour effectuer des redirections ou pour garder vos itinéraires. Et c'est exactement la fonction appelée quadrants dans Angular. Et l'idée est exactement la même que pour les intercepteurs, nous faisons quelque chose avant que le travail ne définisse le composant. Donc, essentiellement, nous voulons faire quelques vérifications, puis retourner vrai ou faux. C'est ici pendant les heures de notre module. Je veux créer un service Insights et votre fichier, et ce sera notre service word dot. Ici, je souhaite exporter notre nouveau service de mots sur les heures de cours. Et ici, nous écrivons que les outils peuvent activer. Et c'est exactement la même chose que nous avons fait avec nos intercepteurs. Comme vous pouvez le voir ici, nous devons définir, activer pour faire fonctionner ce R-carré. C'est pourquoi ici nous pouvons écrire, activer, et ici nous obtenons plein de choses à l'intérieur. En fait, nous n'avons pas besoin de tout ça. Nous pouvons le supprimer et ce retour est trop bavard. Nous voulons revenir ici. Nous voulons renvoyer un observable de booléen, ce qui signifie que nous retournons vrai ou faux. Mais en tant que flux, maintenant à l'intérieur, nous voulons utiliser notre, notre service. C'est pourquoi nous devons ici définir le constructeur et injecter ici dans notre service de nos heures de service. Et l'idée est qu' à l'intérieur de cette méthode, nous devons renvoyer un observable de booléen. C'est ici directement. Je peux écrire ça. Notre service. Le point est une boîte à billes. Ici, je veux écrire pipe parce que nous avons besoin de faire des choses à l'intérieur. C'est mon point de vue. Je vais également ajouter MAB et nous arrivons ici car un argument est la propriété de connexion. Maintenant, à l'intérieur, ils veulent simplement vérifier si nous avons une connexion, donc c'est vrai, puis ils veulent directement retourner vrai. Mais si nous avons false, je souhaite rediriger l' utilisateur vers une autre page. C'est là que nous avons également besoin d'un routeur. Nous pouvons donc injecter ici un routeur privé, et c'est notre routeur, et nous pouvons l'utiliser ici. Nous écrivons donc ce point router dot navigate by URL. Par exemple, avec le détecteur, utilisez la page d'accueil. S'ils ne sont pas bloqués. Après cela, nous devons retourner false. C'est obligatoire parce qu'il s' agit essentiellement d'un booléen observable et nous devons non seulement faire quelque chose ici, mais également renvoyer false. Et ici, je veux naviguer par URL, pas une chaîne vide, mais juste une barre oblique. Et vous pourriez dire, mais pourquoi nous ne sommes pas revenus, écoutez simplement ceci, parce que ce locked-in est un flux avec vrai ou faux. Parce qu'ici, nous voulons également utiliser route et naviguer par URL, et nous pouvons le faire si nous retournons simplement vrai ou faux. Notre gouache est maintenant prête, mais nous devons nous enregistrer correctement. C'est mon intérieur dans notre module. Ici, à l'intérieur des fournisseurs, nous devons mettre notre service de fil hiboux que nous venons de créer. Maintenant, nous devons vérifier un itinéraire, notre quadrant de route, c'est ici que nous pouvons, il peut s'activer. Et à l'intérieur, nous fournissons un tableau avec notre service d'authentification, ce qui signifie que lorsque nous passons à la connexion, notre service sortant vérifiera si nous sommes bloqués dans un nœud avec l' utilisation de notre flux. Et s'il retourne false, nous serons redirigés vers la page d'accueil. Allons voir ça. Je recharge la page et un message d'erreur s'affiche. La classe, notre service carré ne peut pas être créé car il n'a pas de décorateur angulaire. Et en fait, ici à l'envers, j'ai oublié d'écrire injectable. Ne l'oubliez pas. C'est par ici. Mettons des crochets injectables et ronds. Rechargeons la page, mais il n'y a pas d'erreur. Maintenant, je veux essayer de passer à notre même moyen. Je frappe le même moyen. Et comme vous pouvez le voir, je peux accéder à la page de connexion car ici nous avons écrit pour activer notre équipe. Ce qui signifie en fait que si nous arrivons ici , nous pouvons accéder à cette page. Ce qui signifie en fait que si ici dans notre application, je supprimerai notre jeton et ils rechargeront la page de connexion. Je serai redirigé vers la page d'accueil car ils n' ont pas accès à cette page spécifique raison de l'activation possible, ce qui signifie que nous avons réussi à accéder aux pages en deux de différentes manières. Tout d'abord, en utilisant le composant et deuxièmement en utilisant la fonction Angular qui peut être activée. Mais en fait, nous avons créé ce hibou carré, non pas pour se connecter ou s'inscrire, mais pour les futures cartes et les pages de portage car il y avait beaucoup de demandes uniquement pour les utilisateurs connectés. C'est là que je vais supprimer, activer. Et ils veulent également changer notre code à l'intérieur de la maison des composants, car ici nous ne devrions pas rediriger vers le registre des barres obliques, mais plutôt vers les tableaux de barres obliques, que nous implémenterons dans notre prochaine vidéo. 20. Obtenir des tableaux de jeux: Dans les vidéos précédentes, nous avons terminé la mise en œuvre notre page d'accueil et nous commençons maintenant une nouvelle section. Et il s'agit d'un tableau de page. Donc, en quoi consiste cette page, c'est une page où nous pouvons obtenir la liste des tableaux de l'utilisateur, les afficher à l'écran et créer un nouveau tableau. Ici, vous voulez certainement demander, d' accord, mais nous avons des E/S de socket. Allons-nous utiliser les sockets sur lesquels vous vous trouvez exactement sur cette page ? Et ma réponse est non parce que nous n'avons pas besoin d'utiliser socket ou partout où nous avons pour TP hier, beaucoup de cas où nous avons besoin de socket IO, mais certainement pas pour cette page. Pourquoi pas ? Parce qu'en fait c' est la page où nous, pour l'utilisateur actuel, une liste aléatoire plus simple de mots. autre utilisateur n'a besoin d' accéder à cette page spécifique. C'est là que cela n'a aucun sens d' utiliser ici socket IO, mais ne vous inquiétez pas, nous utiliserons socket ion beaucoup plus tard sur la page de la carte unique. Et dans cette vidéo, nous allons nous concentrer sur la création de notre tableau sur le backend et sur l'obtention de la liste des tableaux à partir de l'API. C'est pourquoi nous allons revenir de notre client à notre serveur. Ici, dans notre dossier source, à l'intérieur des types, nous voulons créer une nouvelle interface et la nommer board, dot interface et point ts. Board est donc notre nouvelle entité. À l'intérieur, nous enregistrerons notre interface de tableau que nous utiliserons dans différentes pages. Par exemple, dans la page contenant la liste des tableaux et sur la page du tableau unique. Nous voulons donc exporter notre nouvelle interface et ce tableau. Et la question est de savoir ce que nous aurons à l'intérieur, exactement comme nous l'avons fait chez notre utilisateur. Nous aurons ici une interface pour le tableau comme celle-ci. Et nous aurons ici un document du tableau, qui étendra le document pour obtenir au moins un identifiant. Nous n'avons donc pas besoin de NAD ici, mais nous avons besoin d'au moins un titre. Chaque port doit donc avoir un titre. Deuxièmement, nous l' aurons créé ici, il s'agit d'une date, et ce sera également une date. Et en fait ici sur le côté droit, utilisateur, comme vous pouvez le voir, nous n'avons pas créé de tête mise à jour, mais elle est là à cause de Mongoose, donc nous pouvons l'écrire ici aussi. Le dernier champ dont nous avons besoin ici dans notre tableau. Notre tableau doit appartenir à un utilisateur. C'est ici que nous devons enregistrer le MAD de l'utilisateur qui a créé ce forum. Et pour cela, nous pouvons écrire ici l'ID utilisateur, et nous n' écrivons pas ici une chaîne, mais des types de points de schéma, un ID d'objet point. Nous devons maintenant importer ici le schéma supérieur de Mongoose. Comme vous pouvez le voir ici, nous avons cette notation spéciale, types de schéma, l'ID d'objet point. Et c'est exactement comme ça que nous créons un « d » dans Mongoose. Donc à l'intérieur, ce n'est pas juste une idée, c'est un identifiant d'objet, mais au moment où nous allons créer notre API, cet ID utilisateur sera simplement une chaîne rapide, afin que nous puissions comprendre ce que l'utilisateur a créé cette partie spécifique. La prochaine étape consiste à créer notre document pour le tableau. C'est là que je veux une interface experte et nous avons ici un document Word, exactement comme nous l' avions sur la droite. Ici, nous voulons utiliser le document extents et ce document nous vient de Mongoose, nous ne devons donc pas oublier de l' ajouter ici haut parce que dans un autre cas, cela ne marchera pas. Ici, nous mettons simplement des crochets et rien de plus. Nous n'avons donc pas ici de mot de passe valide ou quelque chose de similaire parce que nous étendons simplement le document et avec quelque chose de nouveau découragé. Nous avons donc créé avec succès notre interface de tableau. Il est maintenant temps de créer notre modèle. Donc, à l'intérieur des modèles, nous créons de nouveaux points de tableau de fichiers. Et encore une fois, comme nous l'avons fait pour l'utilisateur, nous allons créer notre schéma de tableau. Donc ici à droite, je vais ouvrir notre utilisateur pour que nous puissions y jeter un œil. Tout d'abord, ici en haut, je vais importer le schéma et le modèle. Et maintenant, nous voulons créer notre schéma de tableau comme nous l'avons fait pour notre utilisateur. Et ici, nous voyons nouveau schéma et c' est le schéma mongoose. Et à l'intérieur, nous fournissons le document de notre tableau que nous venons de créer. Après cela, nous avons des crochets ronds et à l'intérieur, nous devons fournir tous les champs de notre document de conseil. Le premier champ ici sera intitulé. Qu'est-ce que le titre ? C'est une chaîne. Disons ici que notre type est chaîne. Et deuxièmement, c'est obligatoire parce que nous ne pouvons pas créer notre tableau sans titre. C'est pourquoi nous avons mis ici requis. Comme vous pouvez le voir ici, une erreur s'affiche. L'argument de type title n'est donc pas assignable au paramètre, ce qui signifie que nous avons fait quelque chose de mal avec notre document du forum. Et voyez notre problème car ici ont été étendus à partir du document, mais nous ne l'avons pas fait à partir de notre tableau, ce qui signifie en fait que toutes ces propriétés n' étaient pas disponibles rapidement, comme vous le pouvez voyez maintenant qu'il n'y a pas d'erreur. Le titre est que maintenant nous avons juste besoin de fournir un ID utilisateur. Et ici, à l'intérieur, nous devons définir notre type et ce sera exactement le même schéma, les mêmes types de points, l'ID d'objet point. Et le suivant est requis dans ce cas quand non, OK. L'utilisation du rayon D est également obligatoire. Ensuite, nous devons exporter notre modèle. Voici donc le modèle par défaut expert et nous fournissons un aperçu en tant que document générique de notre tableau ici maintenant nous pouvons ouvrir nos crochets et le premier périmètre que nous fournissons ici nommé tableau. Et il y a un deuxième paramètre, notre schéma de carte. Comme vous pouvez le voir, nous avons implémenté notre tableau exactement de la même manière que nous l'avons fait avec l'utilisateur. Mais board est beaucoup plus simple car nous n' avons pas ici de méthodes supplémentaires et de validations supplémentaires. Nous devons maintenant créer un nouveau contrôleur de carte. Et la méthode pour faire entrer Albert. C'est pourquoi ce que je veux faire, je veux sauter dans de tels niveaux de serveur de source de service. Ici. Tout d'abord, je veux enregistrer un nouvel itinéraire et ce sera app.get. Et nous avons ici des tableaux slash api slash. Et voici la liste pour obtenir tous les tableaux de l'utilisateur actuel. C'est ici que nous voulons utiliser notre middleware OS, car si nous ne sommes pas connectés, nous pouvons obtenir des cartes. Nous devons avoir un utilisateur. Et le dernier ici sera le contrôleur de notre conseil. Nous ne l'avons pas ici et là, point, par exemple, obtenez des tableaux. Nous devons donc créer contrôleur de notre carte et obtenir ici la méthode de la carte. C'est pourquoi au sommet. Tout d'abord, je veux entrer notre étoile en tant que contrôleur de la carte, Rome, et voici les tableaux slash des contrôleurs de chemin. Et nous n'avons pas encore ce fichier, créons-le maintenant. Ici, à l'intérieur des contrôleurs, je peux créer des points de tableaux, et ici nous devons créer une nouvelle action. Ici, nous allons le faire exactement de la même manière que nous l'avons fait dans le contrôleur de nos utilisateurs. Donc tout d'abord, en haut, nous devons entrer notre réponse à la demande et la fonction suivante d'express. Après cela, nous pouvons créer notre nouvelle fonction, get boards, qui sera une fonction asynchrone. Et nous arrivons ici tout d'abord, notre demande et ceci est type request, puis response, c' est type response. Et le dernier est le type suivant, la fonction suivante. Et cela précédemment, nous voulons écrire ici try-catch afin que nous puissions tout gérer correctement. Ici, nous obtenons notre erreur et nous pouvons simplement jeter à l'intérieur de notre prochaine ère, ce sera la prochaine. Maintenant, à l'intérieur de notre tribu doit essayer de laisser la logique pour cela. Nous devons injecter ici notre modèle de planche que nous avons déjà créé. Voici donc un important modèle de conseil d'administration pour Rome. Et ici pour danser, on saute à l'intérieur de modèles slash board. Et maintenant, nous pouvons essayer de trouver tous les tableaux par ID utilisateur spécifique. Nous voulons donc obtenir nos conseils de propriété. Et ici, nous utilisons un poids modèle Bohr dot find. Et si vous ne le savez pas, find trouvera pour nous anciens enregistrements par prédicat spécifique. Donc, à l'intérieur, nous pouvons fournir un objet avec une usure alimentée t égal à l'ID de point utilisateur de point de demande. Et comme vous pouvez le voir ici, nous obtenons directement une flèche de TypeScript indiquant que l'utilisateur n'existe pas dans la requête. Et c'est tout à fait juste. Pour rappel, nous avons créé ici nos propres demandes personnalisées avec un champ à l'intérieur. Ici, nous pouvons écrire une interface de requête express , et dans ce cas, elle fonctionnera correctement, mais notre utilisateur de requête peut éventuellement être indéfini et alors ce code ne fonctionnera pas. C'est ici qu'il faut essayer. Si nous n'avons pas d'utilisateur point request, alors nous voulons lancer ici pour 01. Donc, l'adresse de retour, le statut d'envoi, et voici 401, exactement comme nous le faisions précédemment dans le contrôleur d'un utilisateur. Donc, en bas, nous avons fait exactement la même chose. Et maintenant, nous devons simplement répondre par le biais de nos tableaux. Ici, nous pouvons écrire rest dot sand, et nous envoyons ici des tableaux. Et au centre, la liste de ce tableau n'est qu'un tableau. Allons voir si ça fonctionne. Comme vous pouvez le voir ici, insérez le serveur, celui-ci est connecté et il n'y a pas d'erreur. Alors passons à l'intérieur de Postman. Faisons ici une demande de planches à tarte slushy. Et comme vous pouvez le voir ici dans les en-têtes, ou vous avez déjà un jeton injecté parce que nous avons déjà utilisé cette requête. Je suis en train de frapper le sable. Et comme vous pouvez le voir, je récupère un tableau vide parce que nous n'avons pas de tableaux. Maintenant, la question de savoir comment nous pouvons obtenir des tableaux si nous n'avons toujours pas de tarte pour créer un tableau. Et pour cela, nous pouvons simplement sauter à l'intérieur Mongo et créer ce port par nous-mêmes. C'est par ici. À l'intérieur de la console, j'écrirai docker exec moins 80 MongoDB Mongo. Donc, essentiellement, nous voulons appeler commande Mongo dans notre conteneur, MongoDB. Juste pour vous rappeler si vous n'avez pas utilisé dark ici, mais que vous venez d'installer MongoDB sur votre machine. Ensuite, il vous suffit d'écrire console d'insertion MONGO et cela fonctionnera. Je frappe ici, saisis-les ici dans la console de Mongo. Nous devons maintenant utiliser notre base de données. C'est pourquoi je suis ici en train d'écrire en utilisant l'espace ultra long. Et après cela, ils ont mis un point-virgule. J'appuie sur Entrée. Comme vous pouvez le voir ici, nous sommes passés à la remorque dB HL. Maintenant, nous pouvons écrire des collections d'exposition en point-virgule, et comme vous pouvez le voir, ce sont nos collections. Nous avons ici des tableaux et nous avons nos utilisateurs. Ce que nous voulons faire maintenant, nous voulons insérer un nouvel enregistrement dans nos tableaux. Pour cela, nous pouvons écrire db point, ports, dot insert, et ici nous avons une fonction, donc des crochets et à l'intérieur d'un objet. Et ici, nous devons fournir ce que nous voulons insérer. Dans notre cas, ce sera juste le titre, par exemple, le premier tableau. Et nous devons écrire ici un identifiant utilisateur, mais ici nous ne devons pas fournir la chaîne VM doit fournir un ID d'objet. C'est là que je veux écrire l' identifiant utilisateur deux-points, puis l'objet IED. J'ai ouvert ici des crochets ronds et à l'intérieur je colle dans notre flux. Comme vous pouvez le constater, il ne s'agit pas seulement de l'usure, de la fin de la chaîne. Nous commençons ici à l'intérieur ID utilisateur et de l' ID d'objet avec la chaîne. Et à la fin, nous devons mettre un point-virgule. J'appuie sur Entrée et nous obtenons le bon résultat inséré. Et maintenant, nous pouvons essayer d'obtenir toutes les notices de cette collection spécifique. Donc, les tableaux de points db, recherche de points et les crochets ronds. J'appuie sur Entrée et nous n' obtenons qu'un seul objet avec ID. Et c'est l'idée de notre titre de tableau premier tableau et l'utilisateur AD est un identifiant d'objet correct. C'est pourquoi nous pouvons maintenant revenir dans notre facteur, choisir notre demande de tableaux API et cliquer sur Envoyer. Comme vous pouvez le voir, nous obtenons notre ASHRAE avec un objet à l'intérieur. Ici, nous avons notre identifiant et ici nous le voyons comme une chaîne, titre et un ID utilisateur, ce qui signifie que nous avons créé avec succès notre premier tableau depuis la console et que nous avons la liste de nos tableaux. Mais ici, je veux améliorer la dernière petite chose, comme vous pouvez le voir ici, nous obtenons nos identifiants du backend avec un trait de soulignement. Et en fait, généralement à partir de l'API, nous obtenons un DES. Normalement sans trait de soulignement. C'est juste le truc de MongoDB, qui signifie que ce n'est pas si confortable pour obtenir un, c'était souligné sur le front-end et je ne veux pas le faire. Et à l'intérieur de Mongoose, il est possible de régler ça. C'est pourquoi je veux revenir dans notre code, dans les sororités. Et ici, par exemple, après notre configuration d'abus, nous pouvons écrire ici Mongoose dot set here comme premier paramètre que nous fournissons à Jason. Et comme deuxième paramètre, nous fournissons un objet. Et à l'intérieur, tout d'abord, nous disons que nous sommes Charles jusqu'au bout. Et deuxièmement, transformez. Et ici, à l'intérieur transformé, nous avons deux arguments. Le premier sera souligné et second sera converti. Et c'est ça, la fonction. Et à l'intérieur de cette fonction, nous voulons écrire l' ID de soulignement du point converti par suppression. Donc, ce que nous faisons ici, nous pouvons passer à la méthode JSON qui est écrite à l'intérieur, nous fournissons une transformation, donc nous disons comment nous allons la transformer. Et en fait, à l'intérieur de Mongoose, nous allons récupérer NAD et underscore ID. Et ici, nous allons supprimer uniquement de l'ID de soulignement JSON, ce qui signifie en fait que dans Mongoose, nous avons toujours cet ID de trait de soulignement. Nous pouvons l'utiliser en toute sécurité, mais nous ne l'obtiendrons pas dans JSON, nous obtiendrons un identifiant normal. Et vous voudrez peut-être aussi savoir ce qu'est la force virtuelle et l'incitation à l' intérieur des modèles. Nous pouvons créer des propriétés virtuelles et par défaut dans Mongoose Whoop ne les récupérera pas. Et en fait, nous voulons les récupérer. C'est ici que nous écrivons des virtuels, c'est vrai. Voyons donc si ce code fonctionne. Je retourne voir le facteur et je suis sur le sable. Comme vous pouvez le voir ici, nous obtenons exactement la même réponse, mais nous n'avons pas d'identifiant de soulignement. Nous avons juste un d normalement, qui est une chaîne de caractères. Et c'est exactement comme si nous voulions l'utiliser dans le front-end. 21. Frontend pour les cartes de la réception: Dans la vidéo précédente, nous avons réussi à intégrer nos cartes en back-end. Nous devons maintenant commencer par notre festival de la partie frontale. Pour cela, nous devons implémenter notre module de cartes. Mais juste pour vous rappeler ici dans la source des clients , l'application, les composants maison, la maison, les T, nous avons très directement sur les tableaux slash lorsque nous sommes enfermés. C'est là que nous devons tout d'abord implémenter notre module de cartes et à l'intérieur de cette route, afin qu'au moins notre code puisse fonctionner correctement. C'est ici que nous voulons créer de nouvelles cartes de modules. Et il s'agit d'un module séparé pour une seule page où nous avons une liste des tableaux et, en fait, à l'intérieur, nous pouvons également créer un composant pour un seul tableau. Mais je tiens vraiment à séparer ces deux modules car ils sont deux différents. C'est mon module intérieur de nos cartes. Nous pouvons créer des tableaux point module.js. Et ici, je ne veux pas tout écrire à partir de zéro. Je veux copier et coller complètement le module entier et simplement le changer. Alors, qu'est-ce que nous avons ici ? Tout d'abord, notre classe sera ennuyée module. Nous n'aurons pas ici dans les déclarations, composant home et nous avons besoin de here and you round, mais ici nous n'avons pas besoin de path home, mais nous avons besoin de tableaux de chemin. Et ce composant home n'existe pas ici, nous devons donc le remplacer notre nouveau composant, le composant boards. C'est là que ce que je veux faire, je veux que les composants de la maison copient complètement ce répertoire personnel et le collent ici dans les tableaux, dans le dossier des composants. Vous pouvez donc utiliser des générateurs angulaires si vous le souhaitez. Je veux vraiment copier le module coller. C'est plus rapide pour moi. Donc, ici, je veux renommer ces composants en cartes, et c'est notre composant racine des cartes modules. Et à l'intérieur, nous avons deux dossiers. Tout d'abord, le composant de cartes HTML. Deuxièmement, les cartes composants ts. Ici, dans le code HTML, nous pouvons simplement tout supprimer et simplement écrire des tableaux pour vérifier si cela fonctionne. Maintenant, nous pouvons sauter à l'intérieur de notre composant Boards. Et ici tout d'abord, nous pouvons changer notre sélecteur et nous pouvons écrire ici des tableaux et notre URL de modèle sera un composant HTML important. Maintenant, à l'intérieur, nous avons notre classe, qui est le composant boards, et ici nous devons supprimer les outils. Nous n'en avons pas besoin pour l'instant. Et ils supprimeront tout le code de notre composant cartes, et nous pouvons également supprimer toutes les entrées. Nous avons donc créé avec succès notre nouveau composant de carte vide et nous pouvons maintenant l'utiliser dans notre module de cartes. Ici, nous pouvons écrire un composant de cartes et le faire. Saisissez-le automatiquement ici en haut. Et maintenant, nous avons un itinéraire pour les tableaux à barres obliques. Et ici, à l'intérieur des déclarations, nous pouvons définir notre composant de cartes. Et la dernière étape que nous ne devons pas oublier est enregistrer le module de ce forum dans notre module d'application. Donc ici, dans nos entrées, nous devons ajouter le module boards. Allons voir si ça fonctionne. Je n'ai pas de flèches ici sur le serveur Web. Maintenant, je veux accéder à notre page et la recharger. Et comme vous pouvez le voir, où se trouve notre texte sur les mots slash. Si je vais sauter ici sur la page d'accueil, je serai directement le tableau parce que je suis enfermé. Maintenant, voyons si nous allons être redirigés. Si nous ne sommes pas connectés. Pour cela, par exemple, nous pouvons simplement supprimer le jeton et recharger la page. Et comme vous pouvez le voir ici, nous ne sommes pas autorisés, mais nous ne sommes pas redirigés vers la page d'accueil. Et essentiel pour cela, nous avons créé à l'intérieur de notre maison des services r squared, et nous pouvons utiliser ce R-squared maintenant dans notre module de cartes. Donc, à l'intérieur des planches, à l'intérieur des cartes, le module T ici sur la route que nous pouvons attacher, peut être Et ici, nous devons fournir un tableau avec World Service que nous avons créé précédemment. C'est très bien de l'utiliser comme ça. Nous n'avons pas besoin de l' enregistrer ici. Comme vous pouvez le voir ici, il n'y a pas d'erreur. Rechargeons la page. Comme vous pouvez le voir maintenant, nous ne pouvons pas accéder à nos sports de boue et avons été redirigés vers la page d'accueil. Ce qui signifie que r peut s' activer, fonctionne correctement. Et maintenant, avec une seule ligne ici, nous pouvons définir quelles pages sont autorisées que pour les utilisateurs connectés. Nous avons donc créé avec succès notre module de cartes, et maintenant je souhaite créer une interface de port. Et nous pourrions le créer à l'intérieur du module boards. Mais en fait, je veux créer ici un nouveau dossier AB et l' appeler partagé. Parce qu'en fait, je veux mettre tous les types que nous utilisons partout dans ce dossier partagé. Par exemple, tableau de colonnes de tâches. Ce sont toutes des entités partagées que nous pouvons utiliser dans différents modules. va de même les services ou services qui sont partagés, comme le service de tableau, le service de tableau unique, le service colonne, le service de tâches. Nous pourrions le mettre dans un module spécifique, mais je veux vraiment mettre tout cela dans lequel nous allons simplement chercher des données dans le service partagé. C'est pourquoi nous avons partagé ici AB. Et ici tout d'abord, je veux créer de nouveaux types de dossiers. Et maintenant, dans nos types de prises de vue d' application, nous pouvons définir un nouveau type et c'est l'interface point tableau. Ts. Exportons ici notre nouvelle interface. Et ce sera une interface de notre carte et nous devons la nommer interface de port. Et à l'intérieur, nous devons définir exactement les mêmes champs que ceux que nous avons créés sur le backend. Et tout d'abord, voici NAD, c'est une chaîne. Deuxièmement, c'est le titre, c'est aussi une chaîne. Nous avons également créé ici que cela est tendu et que le dernier est mis à jour. C'est aussi une ficelle. Et en fait, ici, nous obtenions l'ID utilisateur, juste pour vous rappeler ici à l'intérieur nos modèles de source de serveur et ici nous avons notre tableau. Nous avons UserID, ce qui signifie en fait que nous obtiendrons également l' ID utilisateur et c'est une chaîne. Notre interface pour Boyd unique est complètement prête et nous pouvons l'utiliser dans n'importe quel composant. Maintenant, je veux créer le service pour travailler avec les tableaux. Et en fait, toutes les demandes comme créer un tableau, s'ennuyer, obtenir des tableaux, supprimer un tableau iront dans le service. C'est là qu' à l'intérieur du partage, je veux créer un nouveau dossier et le nommer services. Et puis nous avons dit que nous allons créer un nouveau service qui s' appelle Boards service point ds. Nous allons maintenant définir notre nouvelle classe. Nous avons donc ici un service de classe Boards, et nous devons écrire dessus injectable pour pouvoir l'utiliser partout. La première méthode que nous voulons définir ici est get boards. C'est exactement ce que nous avons déjà préparé sur le back-end. Voici donc nos tableaux get et nous n'avons pas besoin de fournir d'argument ici. Et nous retrouverons un observable avec un rayon de nos planches. C'est pourquoi nous pouvons écrire ici un tableau d'interface de port. C'est exactement ce que nous venons de définir. Maintenant, à l'intérieur de ce tableau, nous voulons nous assurer que la demande HTP. C'est pourquoi nous devons essayer de construire et d'injecter. Voici les clients HTTP et HTTP. Maintenant, à l'intérieur de nos tableaux, nous voulons obtenir une URL exactement comme nous l'avons fait précédemment pour le service utilisateur. Nous avons donc ici notre URL et c'est l'environnement. Ne nous envoyez pas d'URL API. Et voici la barre oblique. C'est exactement notre enfant. Maintenant, nous pouvons renvoyer ce point http.get, et nous voulons obtenir notre URL sans aucune option. Et comme vous pouvez le voir ici, nous obtenons évidemment une erreur. objet observable n'est pas assignable à l'interface du tableau observable. C'est là qu'ici, comme précédemment, nous devons spécifier que nous allons revenir dans une gamme de tableaux, donc nos services sont complètement prêts et ils veulent juste le tester. C'est pourquoi je veux revenir ici à l'intérieur de notre module boards boards et nous devons tout d'abord injecter le service ici chez les fournisseurs. Ici, nous pouvons écrire que nous avons ici le service Boards, et il est disponible rapidement. Nous sommes maintenant autorisés à sauter à l'intérieur de notre composant injecté. Donc tout d'abord, je veux définir notre constructeur et nous savons qu'ici nous avons le service Boards et c'est notre service Boards. Maintenant, en plus, je veux écrire ici des outils dessus. Et maintenant non initialisés, ils veulent récupérer cette liste de nos cartes. Nous avons donc notre énergie là-dedans et l'intérieur, ils peuvent simplement écrire ce service de tableau, obtenir des tableaux, s'abonner pour que nous obtenions le résultat. Voici quelques résultats. En fait, il s'agit de forums et ils veulent juste enregistrer sur console ce que nous récupérons. Nous avons donc nos planches, des planches de coma. Allons voir si ça fonctionne. Mais il n'y a pas de flèches ici à l'intérieur du serveur Web frontal. Et reconnectons-nous maintenant car nous sommes bloqués. Je vais donc vous fournir notre nourriture sur gmail.com. Maintenant, comme vous pouvez le voir après vous être connecté, mais je me retrouve dans les tableaux slash. Et ici à l'intérieur de la console, nous pouvons voir des tableaux Et il s'agit d'un tableau unique pendant que nous l'obtenons parce que dans la vidéo précédente, ils ont été créés dans la console pour tester le graphique ce point et essentiellement ces sous-tableaux pour notre utilisateur actuel. Pourquoi est-ce que c'est ? Parce qu'ils sont en fait ici notre demande back-end. Nous trouvons ici nos tableaux par ID utilisateur, ce qui signifie que nous trouvons tous les tableaux avec cette demande d'ID utilisateur à partir desquels nous obtenons cet identifiant utilisateur à partir de notre demande réseau. Voici la demande de notre conseil, et voici nos en-têtes. Et comme vous pouvez le voir ici dans les en-têtes en bas, nous avons cette autorisation et voici notre jeton. Ce sont exactement les informations dont notre backend a besoin pour fournir rapidement des données correctes à l'utilisateur actuel. Donc, comme vous pouvez le voir, l'obtention des cartes à l'intérieur du module fonctionne correctement. Et nous avons préparé avec succès notre service pour obtenir une liste de tableaux sur le client. 22. Formulaire en ligne: Dans cette vidéo, je veux parler d'un module supplémentaire que l'on souhaite généralement créer en direct pour notre application. Et je parle ici d'un formulaire en ligne. Jetons un coup d'œil au projet complètement terminé que nous mettons en œuvre. Comme vous pouvez le voir ici, je suis sur la page des sports slash et je viens de créer un utilisateur. Nous n'avons donc aucun conseil d'administration. Et ici, nous avons créé un tableau. Comme vous pouvez le voir, il ne s'agit que d'un carré avec quelques textes. Mais quand je clique dessus, vous pouvez voir ici une entrée sans espace réservé, nous pouvons taper ici, par exemple, foo board, et nous appuyons sur Entrée. Et après cela, notre tableau est directement créé. Ici. Nous revoyons cette carte, et il s'agit essentiellement d'un exemple de formulaire en ligne. Nous avons donc ici un carré avec le texte. Ensuite, nous cliquons ici et activons un mode d'édition où il suffit de taper quelque chose et nous appuyons sur Entrée. La solution la plus simple serait donc de simplement créer ce composant et de le jeter à l'intérieur de nos planches. Mais ensuite, nous allons sauter dans un seul tableau. Ici, sur la gauche, nous avons exactement la même chose. Vous pouvez voir ici le titre de notre tableau que je suis en train de cliquer ici et que nous passons en mode édition. Ici, nous voyons le titre de notre tableau, mais maintenant nous pouvons le modifier pour pouvoir le mettre à jour et appuyer sur Entrée et date Web, le titre de notre tableau, exactement le même que nous avons ici avec la liste. Ce ne sont que quelques textes cachés ici et nous obtenons ici non seulement une entrée, mais aussi un bouton, au moins. Comme vous pouvez le constater, les styles sont différents dans chaque cas, mais cela n'a pas beaucoup de sens de créer un composant supplémentaire pour chaque cas, comme créer un composant intégré, mettre à jour nom du tableau, puis création d'une tâche, création d'une colonne, etc. Parce que nous pouvons également ajouter la tâche dans notre colonne et il s'agit également d'une entreprise en ligne. C'est pourquoi j'ai vraiment une approche judicieuse qui serait de créer un composant unique qui puisse couvrir tous nos besoins. Quels cas avons-nous donc ? Tout d'abord, dans tous les cas, nous avons un balisage. Ensuite, nous avons un état d'édition lorsque nous cliquons simplement sur l'élément. Mais comme vous pouvez le constater, le balisage peut être complètement différent. Mais ce qui est différent, ce n'est pas le balisage, c'est juste le style en fait, si nous allons vérifier ici, comme vous pouvez le voir, il si nous allons vérifier ici, s'agit d'une police en ligne que j'ai créée et nous joignons simplement ici le formulaire Créer une tâche. L'idée principale est que toutes ces classes sont disponibles globalement et que nous pouvons simplement les modifier avec CSS. L'intérieur était fourni dans différentes choses. Par exemple, nous pouvons tout d'abord taper du texte qui sera affiché ici, comme par exemple au niveau actuel. Mais nous pouvons également afficher ici ce texte comme le nom de notre tableau. Maintenant, nous sommes masqués ici, Modifier et nous pouvons vouloir propager ce texte dans le formulaire d'édition. Mais ici, avec une tâche, nous n'avons pas besoin de le faire. Mais ici aussi, nous avons un cas où nous avons au bouton Panier et pas seulement une entrée. Tous ces boîtiers doivent donc se trouver à l'intérieur ce composant unique pour fonctionner correctement. Essayons maintenant de créer ce composant. Et ce composant est super partageable. C'est pourquoi je veux l' emballer dans AB srand. Et ici, nous voulons créer les modules de dossiers. Ici, vous pouvez demander, d'accord, mais nous parlons de composant. Oui, vous avez parfaitement raison, mais vous ne pouvez pas utiliser de composants sans module. Vous pouvez soit enregistrer un composant à l'intérieur d' un module, soit injecter module et le module d'injection est bien meilleur car vous pouvez définir quels composants vous voulez autoriser à l'extérieur et quels n'est pas. C'est là que c'est généralement lorsque nous voulons partager un composant, je vous recommande vivement de créer un module pour cela. C'est là que nous avons un module et nous pouvons créer un nouveau dossier qui sera intégré au formulaire. Et c'est exactement le formulaire pour tous ces cas. Passons maintenant à l'intérieur et créons ici formulaire en ligne point module.js. Et à l'intérieur, nous devons exporter notre classe, qui est un module de formulaire en ligne. Maintenant en haut d'un pour injecter notre module NG comme nous l'avons fait précédemment. Et ici, nous voulons des entrées internes pour ajouter notre module commun. L'étape suivante consiste à créer nos composants. Nous aurons donc ici un dossier de composants, et ici à l'intérieur nous aurons notre formulaire en ligne avec deux fichiers. Tout d'abord, dans le composant point en direct, point ts, et deuxièmement, le composant point HTML en ligne. Essayons-le à l'intérieur de certains textes, par exemple sous forme de ligne. Et passons à notre intérieur des terres à partir d'ici, expert, notre composant de formulaire en ligne de classe. Maintenant, en haut, nous devons définir notre composant. À l'intérieur, nous pouvons fournir un sélecteur, et ce sélecteur sera juste en ligne. Et ici, nous devrons également fournir un modèle de TRL. Il s'agit d' un composant de formulaire HTML intégré. Notre composant de base est donc prêt lorsque masse est maintenant enregistrée à l'intérieur du module. Voici donc tout d'abord, nos déclarations, nous aurons ici un composant de formulaire en ligne. Et deuxièmement, et c'est super important, ce sont les experts car ici nous voulons autoriser l'utilisation de ce composant à l'extérieur. C'est ainsi que nous ajoutons composant de formulaire en ligne dans le tableau des experts. Revenons maintenant à notre composant et définissons certaines entrées comme précédemment dans cet ensemble. Tout d'abord, nous voulons donner un titre à notre formulaire en ligne. C'est pourquoi nous avons ici un titre d'entrée et c'est une chaîne, et par défaut c' est une chaîne vide. Mais il est important de faire distinction entre le titre du formulaire. C'est ce que nous voulons changer et uniquement les textes que nous montrons parce que nous avons besoin choses différentes dans différents cas. Par exemple, vous souhaitez exécuter le texte par défaut, mais lorsque vous êtes masqué sur notre téléphone, vous souhaitez afficher un autre texte. Et c'est essentiellement le titre, mais nous avons également besoin ici du texte par défaut, c'est ce que nous affichons lorsque nous ne sommes pas activés notre cabinet. Ici, créons un texte par défaut, est une chaîne. Et ici, je veux faire une belle tournure. Je veux écrire ici, pas le définir. Et c'est essentiellement ce que je vous recommande de faire beaucoup si vous venez de commencer à implémenter quelque chose ou même pour la production, lorsque vous n'êtes pas sûr d'avoir des données, il est préférable de ne pas l' a défini plutôt que de simplement l'indéfinir ou simplement une chaîne vide. Dans ce cas, les gens peuvent directement voir que la valeur n'est pas là et qu'elle n'est pas cassée. Il y a aussi un cas où nous voulons afficher un bouton, c'est là que nous devons créer une entrée supplémentaire, a un bouton et c'est booléen. Et par défaut, il sera faux, ce qui signifie mais ne pas afficher le bouton. Si nous avons un bouton, nous voulons modifier le texte de ce bouton. C'est ici que sera notre entrée avec le texte du bouton et c'est une chaîne. Et par défaut, ils veulent le définir pour envoyer car c'est le type de texte le plus populaire. Après cela, nous voudrons parfois fournir un espace réservé pour notre entrée. C'est ici que vous entrez avec l'espace réservé en entrée, et il s'agit d'une chaîne, et par défaut, il s' agira d'une chaîne vide. Et la dernière chose dont nous avons besoin est un type d'entrée parce que nous avons un cas où nous sommes une tendance de masse et non pas une entrée mais une zone de texte. C'est là que je veux écrire une entrée avec un type d'entrée, et ce n'est qu'une chaîne. Nous pourrions créer une énumération ici, mais je la laisserai comme une chaîne. Par défaut, nous pouvons écrire qu'il ne s' agit que d'une entrée de chaîne. Et au moment où nous voulons écrire la zone de texte, nous fournirons ici une zone de texte de chaîne. Maintenant, nous devons également définir une sortie. Il s'agit des valeurs que nous voulons propager après avoir soumis un formulaire. C'est par ici, définissons un nom sans fin de sortie qu'il gère submit. Et c'est un nouvel émetteur d'événements. Et là, il y a un point important. Nous devons l'entrer à partir du noyau angulaire et non du nœud, puis dire ajouter un nouvel émetteur d'événement. Nous voulons fournir le type de données que nous voulons récupérer. Et ce sera une chaîne parce que la forme nominale, nous n'avons qu'une seule chaîne que nous voulons rendre. Ici aussi, nous avons besoin que la propriété locale à gérer soit éditée par défaut, nous avons besoin que l'édition soit définie sur false, puis nous activons l'édition, nous la définissons sur true. C'est ici que l'édition sera booléenne et par défaut elle sera fausse. Enfin et surtout, nous voulons créer un formulaire réactif. C'est là que je veux fournir un constructeur d'informations privé si b et c'est un groupe de formulaires et nous avons déjà créé un formulaire réactif précédemment pour notre inscription. C'est ici que nous utiliserons exactement la même chose, mais nous allons simplement créer ici un formulaire. Et ici nous pouvons écrire ce groupe de points FB point. Nous devons fournir à l'intérieur de nos champs. Et dans notre cas, nous n'avons qu'un titre. Et ici, nous pouvons dire qu'il s'agit d'une chaîne vide. Et en fait, j'ai fait une erreur. Si b n'est pas un groupe ferme, il s'agit en fait d'un générateur de formulaires. Nous avons donc besoin d'une autre contribution. Écrivons maintenant un peu de marché afin que vous compreniez la logique Bêta. Donc, ici, je veux sauter à l'intérieur du HTML et nous n'avons pas besoin de ce texte. Maintenant, voici tout d'abord, je veux créer une div, et cette div sera notre div par défaut avec un certain balisage. C'est pourquoi nous avons besoin d'une classe que nous pouvons utiliser globalement et au-delà, pour nos besoins. Ici, nous pouvons écrire un conteneur de formulaire en ligne. Encore une fois, nous n'écrivons aucun style pour notre conteneur de formulaires en ligne. Chaque cas d'utilisation doit créer ses propres styles. Ici aussi, je veux créer une autre classe également pour le style si en mode édition, c'est là que je vais créer en classe G. Et là, je fournis un objet, un verre à whisky dans un tableau de bord, un récipient à tableau de bord. Donc le même nom, l'édition de tableau de bord. Ici, nous fournissons la valeur l'édition que nous venons de créer. L'idée principale est que nous disposons de suffisamment de classes pour que les autres développeurs puissent utiliser ce composant et le styliser correctement pour chaque état. Et la dernière chose à faire ici est, bien sûr, un clic. Nous voulons activer notre édition. Créons donc ici une nouvelle fonction, activons l'édition et n'avons rien à fournir ici. Définissons maintenant cette fonction. Donc, à l'intérieur de notre fichier ici en bas, nous pouvons créer activer l'édition et ce que cela l'a activé et fait. Tout d'abord, définissez ce point sur true, mais ce n'est pas tout. Nous avons un cas où nous voulons voir la valeur que nous voulons changer. Par exemple, nous avons un formulaire d'édition comme le nom amusant du tableau. Et pour cela, nous avons fourni dans ce titre d'entrée. Mais comme vous pouvez le voir dans le titre de notre entreprise est vide, ce qui est correct. Mais dans notre cas, lorsque nous passons au montage, nous voulons définir notre titre. C'est pourquoi nous pouvons écrire ici si nous avons un titre. Donc, si nous avons this.title, nous voulons le mettre dans notre formulaire. Et pour cela, nous pouvons écrire cette valeur de pas de point sous forme de point. Et à l'intérieur, nous avons un objet avec un titre, ce titre. Donc, ce que fait cette ligne, si nous l'activons dans édition et que nous lui fournissons un titre à l'intérieur, nous mettrons à jour notre valeur de la forme avec la valeur de hauteur de la fonction. Revenons maintenant à notre code HTML. Donc à l'intérieur d'une div avec Festival one pour créer une div que nous montrerons quand nous ne serons pas en phase de montage. Et ce n'est qu'un texte avec certaine classe que nous pouvons styliser. C'est ici, classe de div. Ici, nous allons avoir un texte de formulaire en ligne. Et ici, nous voulons n'en montrer qu'un seul. Nous ne sommes pas dans l' éditeur et disons que c'est le cas, le NADH est en train d'éditer. Ensuite, nous montrons ce div et à l'intérieur d'un pour afficher notre texte par défaut que nous obtenons dans l'entrée. Ensuite, nous créons notre formulaire, comme nous l'avons fait lors de l'enregistrement interne. C'est donc une forme réactive et notre groupe de formulaires bien défini. Nous pouvons donc fournir ici notre groupe de formulaires. Ceci est notre formulaire et nous aurons également ici NG Submit. Et nous devons créer la fonction onsubmit. Mais finissons-en avec ce formulaire ici. Tout d'abord, nous voulons rendre ce formulaire d'une seule mesure lors de la phase d'édition. C'est pourquoi dans GE est en train d'éditer. Et nous voulons également fournir une classe pour style et nous la nommons simplement formulaire en ligne. Revenons maintenant à l'intérieur de ce fichier et créons ici notre fonction onsubmit. Et voici la partie la plus délicate. Nous pourrions ouvrir un formulaire, ne pas fournir de valeur, puis simplement appuyer sur Entrée. Et ce n'est pas ce que nous voulons émettre. Cela n'a aucun sens de rencontrer une chaîne vide. Nous voulons donc le vérifier ici. Si nous avons cette forme de point, cette valeur de point, ce titre , uniquement, alors nous voulons l'émettre. Et pour une viande, nous avons ce point handle submit a mid, et à l'intérieur nous fournissons ce titre de point de valeur ferme, qui signifie en fait que si nous soumettons ce formulaire et que nous avons une entrée vide, nous voulons immédiatement ce que nous voulons faire après avoir fermé nos oreilles en état d'édition, c'est pourquoi l' édition est égale à faux. Et nous voulons également remettre notre entreprise à l'état initial. C'est pourquoi cette réinitialisation de point en forme de point et cette fonctionnalité que nous obtenons de l'Angular prêt à l'emploi. Revenons maintenant à notre code HTML. Nous avons ici un formulaire. Nous devons maintenant définir une entrée. Nous allons donc créer une entrée avec un texte de type. Et nous arrivons ici dans le nom du contrôle de formulaire. Et quand dans cette forme réactive de fleur, nous avons ici notre titre de nom voudra également créer ici une classe de style. Voici donc l'entrée du formulaire d'entrée de classe. Nous voulons également fournir ici notre espace réservé et nous l'obtenons à partir de l'entrée. Il s'agit donc d'un espace réservé en entrée et nous voulons rendre cette entrée. Un seul qui a fourni le bon type à l'intérieur. Voici NG IV avec le type d'entrée, où notre type d'entrée est égal à l'entrée. Et maintenant, nous voulons faire exactement la même largeur textarea. Nous avons donc ici à l'extérieur et nous voulons fermer directement notre zone de texte. Et maintenant, à l'intérieur, nous voulons vérifier ce NG IV. Donc ici notre type d'entrée est égal à textarea, puis nous allons Randy. Mais nous devons également fournir ici un nom de contrôle de formulaire, et ce sera également un titre. Et nous devons également fournir ici un cours. Et dans ce cas, la classe sera la même entrée de formulaire d'entrée et après la façon dont elle s'étend sur le masque, créez un bouton pour soumettre. C'est là qu'ici, dans le bouton et à l'intérieur, nous aurons notre texte, le texte du bouton que nous obtenons à partir de l'entrée. Et nous voulons afficher ce bouton uniquement si nous avons une entrée correcte. Donc, si nous avons une entrée a un bouton, nous allons le rendre. Ensuite, nous voulons taper submit, et ici nous voulons le désactiver s' il est invalide, c'est là qu'il est désactivé et nous pouvons utiliser le formulaire point invalide. Et après cela, nous voudrons également ajouter une classe pour le styliser. Et voici le bouton de formulaire en ligne. Et en fait, avec ceux-ci formulaire d'entrée est complètement prêt. Donc, ce que nous faisons ici, nous avons une div, nous avons ici activer l'édition. Nous avons ici différentes classes pour chaque élément qui ont été affichées dans notre texte par défaut et voici notre formulaire avec entrée ou zone de texte et bouton si nous en avons besoin. Dans la vidéo suivante, nous allons essayer d'utiliser notre entreprise intérieure sur le cas d'utilisation de la création du tableau. 23. Implémenter la création d'un tableau: Dans la vidéo précédente, nous avons préparé avec succès notre formulaire intérieur, mais nous ne savons pas comment nous allons l'utiliser avec juste créé avec toutes les valeurs possibles à l'intérieur. Dans cette vidéo, nous allons vouloir l'utiliser, mais nous n'avons rien à l'intérieur de notre page de tableaux. C'est la façon de mettre à l'intérieur de notre formulaire intérieur. Nous devons également générer notre page de tableaux. Et ici, nous avons principalement du balisage en ligne parce que nous avons déjà accès à nos tableaux, parce que nous avons déjà créé la méthode get board et que nous y souscrivons pour obtenir nos tableaux. Commençons donc par notre balisage nous pouvons supprimer le monde du sport. Et tout d'abord, en haut, je veux écrire top parce qu' en fait dans cette vidéo, nous n'allons pas implémenter notre barre du haut, mais nous ne devons pas oublier que nous devons l'implémenter plus tard. Et c'est ici que nous pouvons commencer notre balisage. Donc tout d'abord, nous avons ici des tableaux, un conteneur de pages. Maintenant fermons cette div et à l'intérieur, nous aurons une autre div avec la barre latérale gauche de la classe home. Ici, nous fermons notre division. Et en fait, nous sommes en train de créer notre barre latérale sur la gauche et à l'intérieur, nous aurons des liens vers nos différentes pages. C'est pourquoi nous avons ici une liaison routeur et nous voulons fournir ici un lien sur les tableaux slash. Après cela, nous devrons également ajouter une classe ici, option de menu latéral des tableaux. Ici aussi, nous voulons halite le lien quand il est inactif route et un Angular pour cela, nous avons un attribut spécial qui est appelé lien de routeur actif. En fait, il s'agit d'une directive. Et puis dit, nous pouvons fournir la classe que vous voulez obtenir. Dans notre cas, nous voulons sélectionner une option de menu latéral du tableau de classe. Fermons notre A ici et à l'intérieur. Essayons les textos. C'est aussi des planches. Définissons ici un autre lien qui sera à la maison. C'est pourquoi je vais copier-coller complètement ce lien de routeur ici sera coupé. Liaison de routeur de même classe active. Ici, nous pouvons écrire non pas des tableaux mais à la maison, mais aussi ici nous voulons écrire options actives de lien de routeur, car en fait, ici, nous avons routé une barre oblique de lien et nous avons coupé dans chaque lien de routeur. C'est pourquoi cette liaison de routeur active mettra toujours en évidence cet élément que nous voulons éviter cela. C'est pourquoi nous devons fournir des options actives de liaison de routeur. Et ici, à l'intérieur, nous fournissons un objet avec un champ exact vrai. Dans ce cas, nous allons mettre en évidence cette boucle lean on et nous avons un maillage complet sur slash. Et en fait, de notre point de vue, cela n'a pas beaucoup de sens de créer ces deux liens différents. Parce que lorsque nous sommes bloqués mais que nous ne pouvons pas accéder à notre page d'accueil, cela signifie que nous serons directement redirigés vers notre page de tableaux. Mais c'est le balisage que nous obtenons du projet. Nous implémentons donc simplement ce que nous avons après notre barre latérale. Nous devons créer une pièce principale avec notre conteneur pour les planches, c'est là que se trouvera la classe div Boards section container. Maintenant fermons ici div et à l'intérieur nous voulons créer un autre div. Ici, nous aurons div class my boards. Fermons cette div et à l'intérieur , nous voulons créer une classe supplémentaire avec un en-tête. C'est ici, la classe div, l'en-tête de la section My Boards et à l'intérieur, en-tête de la section My Boards nous devons créer une classe de plus. Et ce sera l'en-tête de la page des planches de verre, le nom, et à l'intérieur nous allons l'essayer. Mes planches. Après notre en-tête, nous voulons afficher notre liste. C'est par ici. Nous aurons une liste de tuiles de tableau div car nous aurons ici chaque tableau sous forme de tuile. Ici, nous pouvons fermer notre div et à l'intérieur de cette div, nous voulons afficher notre formulaire en ligne. Je vais terminer dans une seconde parce que pour instant je veux juste terminer notre balisage. Et après nous avons intégré le groupe de formulaire un pour rendre toutes nos tuiles, qui sont des planches. Et pour cela, nous allons écrire notre graphique ici, donc un lien routeur. Et ici, nous voulons fournir un lien vers chaque tableau. C'est ici que nous avons un paramètre dynamique. Ici, nous pouvons fournir un tableau avec des tableaux slash. Et le deuxième paramètre que nous avons mis ici, ID du point du tableau virgule. Dans ce cas, nous générerons un lien de routeur correct pour chaque carte. Mais pour avoir accès au tableau ici, nous devons écrire et G pour boucle. C'est ici dans G4 et nous parcourons nos planches en boucle . Alors laissez le conseil d'administration, et ici nous allons également manquer notre classe. Donc, ici, nous devrions avoir une tuile de tableau et fermons ceci a. Maintenant, dans notre lien a, nous voulons fournir une div avec nom des détails de la tuile du tableau de classe. Fermons cette div et affichons simplement le nom. Ce sera la tuile ennuyée et le balisage sera entièrement prêt. Allons voir si ça fonctionne. J'ai en fait ici une flèche parce qu'ils n'ont pas utilisé correctement la propriété. Ici, nous devrions mettre des crochets doubles et non des crochets simples. Vérifions-le encore une fois. Nous avons un récit selon lequel nous n'avons pas de tableaux de propriétés, et cela est tout à fait valide dans notre script de type. Nous recevons nos cartes, mais nous avons simplement ici le journal de console avec Dan, sauvegardez-les. Et en fait, nous devons le faire de cette façon ici en haut, nous pouvons créer des propriétés de tableaux. Ce sera notre interface de tableau que nous avons déjà. Il s'agit d'un tableau et par défaut nous aurons une liste vide de nos tableaux. Maintenant, au lieu de notre journal de console, nous pouvons simplement attribuer à ce tableau, les tableaux que nous recevons de notre service. Vérifions-le encore une fois. Comme vous pouvez le voir maintenant, nous n'avons pas d'erreur, mais nous avons un tableau d'erreur. La vignette n'existe pas. C'est pourquoi j'aime tant TypeScript. C'était simplement une faute de frappe, mais nous ne la déboguons pas en cours d'exécution. Nous avons simplement une validation de TypeScript. Voici donc le titre, et maintenant nous n'avons plus d' erreur. Tu ne devrais pas être valide. Allons voir ça. Je recharge la page et en fait elle semble d'une manière ou d'une autre. Nous avons ici notre application à la barre. Nous ne l'avons pas encore implémenté. Ici, sur la gauche, nous avons un lien Boards et un lien d'accueil. Les liens sont donc là. Et voici notre contenu principal avec mes planches dans les reliefs que nous allons créer un deuxième et notre premier tableau avec le bon lien. Et comme vous pouvez le voir ici en bas, il s'agit de slash port, slash id, ce qui signifie que notre URL fonctionne également. Mais j'ai une petite faute de frappe dans le balisage. Comme vous pouvez le voir, notre barre latérale n'a pas l'air très bien parce qu'ici, à l'intérieur d'une barre latérale gauche de la classe div, j'ai manqué le conteneur de mots, donc il devrait être côté gauche, mais conteneur, comme vous pouvez le voir maintenant, notre barre latérale est beaucoup plus grande et elle est plus belle. Comme vous pouvez le voir, nous avons réussi à récupérer nos cartes avec ce code dans notre composant avec notre service. Nous enregistrons ces informations dans la propriété de nos tableaux et notre liste de tableaux a été affichée. Et en fait, dans notre réseau, nous pouvons voir que nous avons une demande sur l'hôte local pour 1001 cartes sans chemin slushy. Et nous obtenons notre pension unique que nous avons. Et maintenant, il est temps de parler de la ferme intérieure. Alors, comment nous allons l'utiliser ici dans notre code HTML. Et pour cela, je veux ouvrir notre formulaire intérieur ici droite afin que nous puissions comprendre ce que nous avons à l'intérieur de notre composant. Nous avons donc ici de nombreuses contributions. Donc, ce que nous devrions fournir pour cet usage spécifique, nous sommes en fait en ce sens que nous avons notre formulaire de tiret en ligne. Fermons-le ici. Et maintenant, tout d'abord, à l'intérieur, je veux donner un cours. Et l'idée principale est que c'est la classe parente que nous pouvons styliser parce que nous voulons appliquer styles uniques à notre composant. Et juste pour vous rappeler que nous avons des cours comme inland from container, inland from text and song. L'idée est que cette classe et cette classe remplaceront n'importe quel CSS. Et c'est exactement l'idée. C'est là que nous donnons de la classe, par exemple, créer un formulaire de tableau. Maintenant, tous ces clusters à l'intérieur seront plus simples imbriqués dans notre CSS. La deuxième chose dont nous avons besoin ici est le texte par défaut. Et ce sont les textes que nous verrons sur la carte à l'avance. Et voici nos textes par défaut, créez un nouveau tableau. Et la dernière chose que nous devons fournir ici est la gestion de la soumission. C'est ce que nous obtenons de notre formulaire. Ici. Nous pouvons écrire, par exemple, créer un tableau et nous obtenons ici un événement. Alors qu'est-ce que cet événement, juste pour vous le rappeler ici, nous avons un handle submit et c'est une chaîne. C'est notre titre et nous n'avons pas besoin ici d'un titre de bouton, texte de bouton, d'un espace réservé, d'un type de saisie, simplement parce que c'est la principale entreprise intérieure par défaut. Maintenant, nous allons vérifier si cela fonctionne là où sauter ici à l'intérieur de la console et mourir directement ont une erreur. Nous n'avons pas de méthode create board, donc créons-la maintenant ici. Il s'agit d'une méthode où nous obtenons une chaîne. Nous pouvons donc dire que nous obtenons ici un titre, c'est une chaîne et que nous renverrons void, ce qui ne veut rien dire. Et il liste ici je veux consulter notre titre, qui a été créé à l'intérieur de notre formulaire intérieur. Maintenant, nous arrivons ici et l'argument étroit de type event n'est pas assignable pour autoriser une chaîne de caractères. Et en fait, cela peut être très difficile pour vous de déboguer parce que vous pourriez penser, accord, je fournis ici quelque chose de différent. Mais le problème n'est pas là. Le problème est qu' à l'intérieur de ce module, nous n'avons pas injecté dans notre module de formulaire intérieur. C'est ici qu' à l'intérieur du module boards, nous devons importer notre module partagé et il sera en ligne pour module. Et l'idée principale est que nous sommes inversés ici sur un module, mais à l'intérieur nous avons un composant expert id. C'est pourquoi nous pouvons maintenant utiliser ce composant exploité sous forme intérieure ici à l'intérieur de notre composant. Allons voir ça. Comme vous pouvez le constater, nous n' avons plus cette erreur. Nous avons quelque chose de différent et nous ne pouvons pas nous lier à groupe de formulaire car ce n'est pas une propriété connue de la forme, c'est pourquoi nous devons faire ce que nous devons faire. Nous devons intégrer des formulaires réactifs dans notre module de formulaire en ligne. C'est pourquoi je veux sauter dans le module de formulaire en ligne. Et ici, dans les entrées, je veux écrire un module de formulaires réactifs. Maintenant, nous ne devrions pas avoir une telle erreur. Allons voir ça. Comme vous pouvez le constater, tout est vert et nous sommes prêts à partir. Vérifions-les dans un navigateur où recharger la page et voilà, c'est notre élément. Et il peut être très difficile pour vous de comprendre ce qui se passe ici parce que nous n'avons pas écrit CSS et que le CSS a déjà été préparé rapidement. Examinons donc cet élément. Qu'est-ce que nous avons ici ? Comme vous pouvez le voir, il s'agit d'un formulaire intérieur et c' est notre formulaire de création de tableau de classe. Allons voir ça. Ce que nous avons à l'intérieur de notre projet et de nos styles. Nous n'avons pas parlé des styles Source et ici de nombreux styles et nous sommes intéressés maintenant par la création d'un formulaire de tableau. Ouvrons-le, et voici notre CSS. C'est exactement ce que nous voyons ici. Il s'agit de créer un formulaire de tableau. Voici notre parent. Plus important encore, à l'intérieur de la forme intérieure, nous avons des styles différents. Par exemple, voici le conteneur de formulaire en ligne de la classe div et comment nous le stylons, nous utilisons ici notre classe parente que nous avons juste ici. Il s'agit de créer un formulaire de tableau puis un conteneur de formulaire en ligne. Et c'est ce que vous pouvez voir ici. Préfixez toujours ici, toutes les classes intérieures avec create board form, qui est notre formulaire parent, juste pour cet usage spécifique. C'est ainsi que nous rendons notre arrière-pays super flexible. Il contient 0 CSS à l'intérieur et nous définissons simplement tous nos CSS extérieurs pour chaque cas. C'est pourquoi nous avons défini ici, accord, nous avons l'intérieur des terres à partir du conteneur, vous devriez avoir display flex, aligner les éléments et justifier le contenu. Ensuite, si nous avons besoin de styliser en ligne à partir de textes, par exemple, dans ce cas, nous n'avons pas stylisé, mais nous pouvons également créer un formulaire de tableau, un formulaire en ligne, du texte et un style pour cet élément. C'est ainsi que nous avons créé notre superbe formulaire intérieur, qui est super partageable pour chaque cas. Maintenant, vérifions-nous si cela fonctionne vraiment. Nous avons donc ici notre texte par défaut créer un nouveau tableau. Nous pouvons cliquer dessus, et maintenant nous avons notre contribution et nous pouvons écrire quelque chose ici. Et ils voient déjà ici une erreur. Comme vous pouvez le voir ici, nous avons une entrée avec une entrée de formulaire de saisie de classe, mais c'est ce que nous stylons et où styler la saisie de formulaire en ligne, ce qui signifie en fait que nous avons fait une faute de frappe. Revenons à l'intérieur notre composant, le composant de formulaire intérieur. Et ici, nous avons notre entrée et ici nous devons changer notre entrée de formulaire de saisie en entrée de formulaire en entrée de formulaire en ligne. Et comme vous pouvez le voir, nous rencontrons exactement le même problème ici dans textarea. Il doit s'agir d'une entrée de formulaire intégrée. Vérifions-le encore une fois. Je suis en train de recharger la page masquée sur le bouton, et maintenant nous avons une entrée correctement stylisée. Maintenant, je peux payer quelque chose comme foo, puis appuyer sur Entrée et notre formulaire est fermé avec succès. Nous voyons de nouveau créer de nouveaux tableaux. Et à l'intérieur de la console, nous voyons que notre titre est exactement notre composant de sortie à l'intérieur de la carte. Mais ce qui nous manque complètement ici, c'est créer un tableau sur le client et sur le serveur. Et maintenant je veux faire l'inverse. Je veux commencer par le front-end et terminer avec le Pi. Ensuite, vous pouvez voir comment nous procédons dans l'ordre inverse. Alors Festival ici, nous avons notre composant Create board inside. L'idée est donc que nous utiliserons ici notre service de conseil d'administration. C'est mon service interne à notre conseil d'administration, nous devons créer une nouvelle méthode. Par exemple, appelons-le point de création. Donc, ce que nous obtenons ici, nous arrivons simplement ici au titre et c'est une chaîne et arrière, nous obtiendrons un observable avec Board créé, ce qui signifie que l'interface sera ennuyée. Et maintenant, ce que nous aurons à l'intérieur, tout d'abord, nous pouvons copier-coller l'URL car ce sera exactement la même chose. Il s'agit de tableaux slash et nous faisons une demande de publication. C'est là que nous pouvons dire que nous renvoyons ce HTTP et que nous ne l'obtenons pas, mais que nous publions. Et à l'intérieur. Tout d'abord, nous devons fournir une URL. Et deuxièmement, nous allons fournir ici un objet avec un titre de champ. Et en fait, c'est notre corps. Et pour notre conseil d'administration, il suffit de fournir le titre. Parce que sur le backend avec deux choses. Il s'agit du titre et de l'ID utilisateur. Et l'ID utilisateur, notre backend doit comprendre par lui-même, car nous fournissons un jeton avec notre demande et nous sommes authentifiés. Le principal problème est ici que nous sommes en train de contourner la saisie. Nous devons fournir un aperçu ou un post. Nous récupérons l'interface de notre tableau. Et dans ce cas, nous avons créé avec succès la méthode Create Board. Et comme vous pouvez voir toutes nos méthodes d'API, je vais regarder exactement de la même manière. s'agit simplement d'une URL, puis un message HTTP dont nous avons besoin. Utilisons maintenant la méthode de service dans notre composant. Alors revenons en arrière. Et voici notre tableau Create. Et ici, nous voulons l'appeler ce mot point de service. Et ici Create Point. Et à l'intérieur, nous fournissons exactement le titre que nous avons obtenu ici à partir de notre formulaire intérieur. Et après cela, nous écrivons dot subscribe et ici nous récupérons le tableau créé. Que voulons-nous faire de ce point ? Nous voulons simplement changer notre, le taux de ces conseils. C'est ainsi que je vais écrire ce tableau à points égal. Et ici, nous étalons nos tableaux à points , puis ils veulent mettre notre tableau créé. Donc, essentiellement, nous créons ici dans votre tableau, où nous mettons tous nos champs de l'ancien tableau, puis nous créons un tableau. Donc, notre front et cela entièrement préparé. Maintenant, nous devons passer au backend et tout y créer. Sur le backend. Ce n'est pas si difficile car nous avons tous créé un modèle pour le tableau et nous pouvons l'utiliser. Nous avons juste besoin de sauter et de dire sororité S. Et voici la création de votre demande API. Ici, nous pouvons copier, coller , obtenir complètement, et ce sera affiché sur des tableaux slash. Ici, nous devons utiliser middleware du système d' exploitation car il s' agit d'une requête authentifiée. Et ici, nous utilisons le point contrôleur de la carte, par exemple, create board. Et maintenant, nous devons créer cette méthode dans notre contrôleur. Revenons donc à l'intérieur du contrôleur de notre carte. Et ici, nous voulons créer exactement la même chose, mais ce sera une demande de publication pour créer un enregistrement. C'est pourquoi je vais le copier-coller complètement et le renommer. Nous avons donc ici notre tableau Créer et nous obtenons ici notre réponse à la demande. Et ensuite, et nous avons à l'intérieur essayer de l'attraper ici. Tout d'abord, à l'intérieur où le poulet est utilisé sur demande , c' est tout à fait bien. Ensuite, nous voulons créer un nouveau tableau. C'est ici que je vais supprimer cette ligne. Donc, ici, je vais écrire que nous créons notre nouveau tableau et pour cela, nous utilisons votre modèle ennuyé , puis nous avons dit Nous devons fournir un objet valide. Ici. Tout d'abord, nous fournissons un titre du tableau de demande, le titre point. Et le second est l'utilisateur AD et utilise réellement par rapport à la prise de masse de notre demande, de notre middleware. Nous aurons donc ici la demande point USA, point underscore ID. Et en fait, nous pouvons utiliser à la fois identifiant de soulignement ou un D, peu importe. Nous les avons tous les deux disponibles. Cette ligne n'enregistrera donc rien dans la base de données. Nous créons simplement ici une instance de notre modèle. Ensuite, nous voulons enregistrer cet enregistrement dans la base de données. C'est pourquoi ici nous pouvons essayer le tableau sauvegardé et nous utilisons ici un poids ici, et vous avez acheté dot save. Dans ce cas, nous sauvegardons cet enregistrement et nous récupérons notre tableau enregistré. Comme vous pouvez le voir, il s' agit d'un document Word. Après cela, nous pouvons répondre avec notre tableau enregistré. Encore une fois, nous avons une demande de publication, nous avons une action Créer un tableau ici. Nous sommes en train de vérifier que nous sommes enfermés. Ensuite, nous utiliserons notre modèle de tableau pour créer un nouveau tableau avec le titre que nous avons fourni et utiliser une 3D que nous n'avons pas fournie. Mais bon sang, de la part de notre utilisateur bloqué et nous avons enregistré ce nouveau point dans la base de données. Nous avons récupéré notre tableau enregistré et nous répondons avec cette API. Allons voir si ça fonctionne. Je n'ai aucune erreur ici dans le back-end. Alors allons dans le client ici, je veux cliquer sur créer un nouveau tableau et je tape quelque chose et j'appuie sur Entrée. Et comme vous pouvez le voir directement ici, nous avons notre nouveau tableau. Allons voir notre réseau. Et en fait, au sein du réseau, nous avons la demande de notre conseil d'administration. Et ceci est un article sur les points de barre oblique. Et ce qui est le plus important ici, c'est notre réponse. Il s'agit d'un nom d'utilisateur de titre. C'est exactement ce qui a été enregistré dans la base de données, ce qui signifie que si je recharge la page ici, nous obtenons deux tableaux maintenant parce que toutes ces informations sont enregistrées dans la base de données. Et ici, au sein de notre réseau, nous recevons nos tableaux. Et comme vous pouvez le voir dans l'aperçu, nous avons déjà deux tableaux et non un, ce qui signifie que nous avons complètement terminé notre page de tableaux. Tout d'abord, soyez rendu ici la barre latérale, mais nous n'en avons rien fait. Nous sommes également utilisés ici notre formulaire intérieur, qui est super partageable. Et nous avons créé notre service, qui s'adresse à notre API, pour créer un nouveau tableau à partir de cette page. 24. Ajout de la barre supérieure et de la déconnexion: Dans la vidéo précédente, nous avons terminé notre page de tableaux, mais nous avons oublié d' implémenter notre barre supérieure. Et en fait, il s'agit du TBA sur chaque page pour un utilisateur connecté, ce qui signifie en fait non seulement ma page de tableaux, mais également une page de tableau unique, c'est pourquoi nous devons le créer en tant que module partageable. Je veux donc passer à notre application source client partagée. Et ici, nous avons nos modules et notre entreprise intérieure. Et en fait, ici, je veux copier-coller complètement ce formulaire en ligne et le renommer en notre langue. Mais maintenant, à l'intérieur de la masse, tout change. Tout d'abord, commençons par notre module. Donc, ici, nous avons un module de barre supérieure et à l'intérieur avec aucun module de formulaire réactif, nous aurons simplement un balisage et le bouton de déconnexion. Ici, nous pouvons supprimer cette entrée et nous devons également modifier notre composant. Mais avant tout, changeons le nom de la classe. Ce devrait être notre module de barre supérieure. Passons maintenant à l'intérieur de nos composants. Et ici, nous n' avons pas de société intérieure, nous avons notre barre supérieure et nous avons deux fichiers à l'intérieur. Tout d'abord, il s'agira du composant de point de barre supérieur HTML. Et voici notre composant de point de barre supérieur. Changeons maintenant le balisage. Je veux tout supprimer dans la barre supérieure droite plus simple. Passons maintenant à notre fichier ts et supprimons tout de notre composant. Maintenant, je veux renommer notre sélecteur dans la barre du haut juste pour indiquer clairement à quoi il appartient. En fait, nous n'avons qu'un seul Toba dans notre application. Nous pourrions simplement écrire ici Tampa, mais comme il est partageable pour nous, je vais écrire ici en haut, mais juste à cet endroit, nous avons notre modèle d'URL. C'est la barre supérieure et nom de notre composant est composant de la couchette supérieure. Maintenant, je peux supprimer les symboles et vivre ici notre entrée de composant. Revenons maintenant à l'intérieur d'un module. Nous n'avons pas ce composant de formulaire intégré, mais nous voulons déclarer ici notre composant de barre supérieure et notre composant TBA expert parce que nous voulons l'utiliser en dehors. Notre module est donc entièrement prêt. Oui, nous n'avons pas implémenté de logique à l'intérieur, mais nous ne pouvons toujours pas vraiment la lier. Et nous voulons sauter et dire module de cartes et l'intérieur de nos entrées, nous pouvons ajouter ici le module de barre supérieure. Maintenant, ici à l'intérieur de nos tableaux de composants, tableaux, HTML en haut. Au lieu de ce texte, nous pouvons simplement écrire la barre supérieure AP et nous pouvons la fermer ici. Allons voir si ça fonctionne. Nous n'avons aucune erreur ici. Je vais recharger la page. Et ici, en haut, vous pouvez voir la barre supérieure des textes, ce qui signifie que nous avons réussi à lier notre module et notre composant à notre page de tableaux. Essayons maintenant de commercialiser notre barre d'outils. C'est ici que je vais revenir à l'intérieur du code HTML de notre composant Tombow. Ici, écrirons-le. Donc tout d'abord, nous avons ici div avec des tableaux de navigation de classe. Fermons cette div à l'intérieur. Nous aurons encore un div, div, navbar, côté gauche. Fermons cette div et à l'intérieur tout d'abord, nous aurons un lien vers notre maison. C'est pourquoi une liaison routeur. Voici notre barre oblique, et voici l'icône de la barre de navigation de classe. Fermons notre A et à l'intérieur nous devons fournir une nouvelle image. Donc, voici la source imagée slash assets slash home point SVG. Après cela, nous aurons un autre lien de routeur. C'est pourquoi je vais le copier-coller complètement et il va sur des tableaux slash. Et ce sera Naropa eigenspace, icône des tableaux de navigation. Et à l'intérieur, nous avons un autre fichier SVG. Ce sont des tableaux slash assets, comme vous pouvez le voir maintenant, lorsque je recharge la page, nous avons deux belles icônes, nous avons deux belles icônes, une sur le lien de la page d'accueil et l'autre sur nos tableaux. Mais comme vous pouvez le voir ici, les rails ne sont pas valides. Nous ne les avons pas du tout parce qu' en fait nous devons sauter à l'intérieur de notre module de barre supérieure. Et ici, importez le module d'itinéraire. Sauvegardons cela et rechargeons la page. Et comme vous pouvez le voir maintenant, cela lie vraiment, tout d'abord, page d'accueil et ici les tableaux slash. Poursuivons maintenant notre balisage. Après notre côté gauche, nous avons notre côté droit. Ici. Nous voulons fournir notre image avec des acides slash source, logo Trello, un point blanc SVG. Et voici notre barre de navigation de classe. Plus longtemps après une image, nous avons une div avec la classe navbar à droite. Appelons cela t. Et à l'intérieur, nous voulons créer un lien suivre la robe, c'est y. Voici la classe div, l'icône de la barre de navigation, la barre de navigation , l'icône de déconnexion. Et ici, à l'intérieur, je veux simplement écrire le texte de la goutte. Allons voir si ça fonctionne. Ici, nous avons nos liens sur la gauche, nous avons l'image de la bande-annonce au centre et nous avons un bouton comme lien de déconnexion à droite. Mais nous n'avons attaché aucune logique ici. Notre barre supérieure est donc entièrement prête. Nous avons tout implémenté, mais nous devons maintenant implémenter notre déconnexion. L'implémentation de la déconnexion est très simple. Nous avons juste besoin de supprimer notre token du stockage local, de nettoyer CurrentUser dans notre mémoire et de le rediriger ou de l' utiliser vers la page d'accueil. C'est ce que nous voulons faire ici. Nous voulons joindre un événement click. Alors ici cliquons droit. Et ce que nous faisons, c'est notre méthode de déconnexion. Et le numéro doit créer cette déconnexion dans notre composant. Que voulons-nous faire à l'intérieur ? En fait, je souhaite stocker logique de nos logos dans notre service car cela est lié à l'authentification et ils ne veulent pas écrire cette logique directement ici. C'est y. Ce que nous devons faire, nous devons injecter notre service horaire, qui est notre fournisseur de services à l'intérieur de ce composant. Et maintenant, nous pouvons utiliser notre déconnexion point point. Et en fait, nous n' avons pas une telle méthode. Nous devons le créer, mais ce n'est pas tout, mais aussi après celui-ci pour rediriger l'utilisateur vers la page d'accueil car nous ne sommes plus connectés. Et pour cela, nous devons injecter ici routeur. Donc je peux adhérer au routeur et ce sera notre sécheresse. Après le côlon sont notre service. Nous pouvons écrire ici ce routeur point de navigation par URL, et nous voulons simplement rediriger l'utilisateur vers notre page d'accueil. Nous sommes donc presque prêts. Nous devons simplement implémenter notre méthode de déconnexion ici dans notre classe de service. Donc ici en bas, je vais écrire log out with don't need here anything. Nous voulons simplement supprimer notre token. Donc ici, nous pouvons écrire l'élément de suppression de point de stockage local et ont été fournis à l'intérieur de la cible. Cela suffit, mais nous n'avons pas nettoyé notre mémoire. Et en fait, cet utilisateur actuel a toujours un utilisateur actuel valide. Ce n'est pas bon. Nous devons le régler maintenant. C'est pourquoi ce point utilisateur actuel point. Ensuite, nous sommes maintenant à l'intérieur et avec ce revêtement unique, tous nos composants seront avertis que nous ne sommes plus bloqués. Allons voir si ça fonctionne. Je n'ai aucune erreur ici. Nous n'avons pas besoin d'implémenter quoi que ce soit sur le backend. Maintenant, cliquons simplement ici pour vous déconnecter. Et comme vous pouvez le voir, boum, je suis directement sur la page d'accueil et nous pouvons vérifier que nous ne sommes pas bloqués. En fait, il a été nommé sauter ici dans le stockage local de l'application. Je n'ai pas mon jeton. C'est pourquoi, lorsque je recharge la page, je reçois 401 Unauthorized, ce qui signifie que nous avons implémenté avec succès notre barre supérieure et notre fonctionnalité de déconnexion. 25. Créer un module de carte: Dans la vidéo précédente, nous avons terminé la mise en œuvre de notre page de tableaux. Dans cette vidéo, nous commençons à implémenter notre page de tableau unique. Nous nous concentrons ici uniquement sur la création de notre module et de notre composant de base. C'est pourquoi je veux sauter dans le jeu de sources. Et ici je veux créer un nouveau dossier avec un nouveau module. Et en fait, vous pourriez dire, OK, mais pourquoi nous n'emballons pas notre carte de composants dans le module de cartes et oui, vous pouvez le faire, mais je veux le scinder parce que la logique à l'intérieur de ces deux modules est assez différent. Nous devons encore payer beaucoup à l'intérieur de notre module de carte. C'est y. Créons ici un nouveau dossier qui s'appelle board. Et à l'intérieur, nous voulons créer notre tableau point module.js. Aussi, créons directement ici notre dossier de composants et notre dossier mu à l'intérieur duquel s'appelle board. Et ici, nous avons besoin de deux nouveaux fichiers. Tout d'abord, board dot component point ts, et deuxièmement board dot component point HTML. Maintenant, faisons des tendances à l'intérieur du HTML, mot bouilli, et créons notre composant. Ici, nous pouvons exporter notre nouvelle classe, appelée composant de carte. Et sur le dessus remasterisé un décorateur de composants. À l'intérieur, nous voulons fournir notre sélecteur et nous pouvons simplement dire ici que nous avons sélectionné board et nous devons également fournir ici une URL de modèle qui est coulé composant HTML, notre composant de tableau est entièrement préparé. Nous devons savoir créer notre module. Nous voulons donc exporter une nouvelle classe, appelée molécule de carte. Et nous voulons ajouter au sommet du décorateur et du module GI et fournir un aperçu, au moins la liste des entrées. Et ici, nous aurons tout d'abord module commun également maintenant nous pouvons créer nos déclarations et fournir des informations, les composants de notre carte que nous venons de créer. Nous voulons donc vous inscrire ici dans votre parcours. C'est ici qu' en haut, nous pouvons créer une nouvelle propriété appelée routes. Et ce sont nos cris, qui sont un tableau. Et à l'intérieur, nous devons fournir un nouvel objet avec un chemin de champ. Et ici, nous aurons la barre oblique des tableaux d'URL, et ici nous aurons l'ID du tableau deux-points. Que signifie cet identifiant de forum ? Cela signifie que nous avons un paramètre dynamique, ce qui signifie que nous avons ici un ID de tableau et qu'il est différent pour chaque tableau. Après cela, nous devons fournir ici un composant, et dans notre cas, il s' agira de notre composant de carte. Ici aussi, je veux utiliser le mot service. C'est pourquoi ici nous pouvons écrire, activer. Il s'agit d'une baie, et voici notre service requis. Pourquoi faisons-nous ça ? Parce que cette URL est réservée aux utilisateurs connectés. Si nous ne sommes pas connectés, nous ne voulons absolument pas accéder à cette URL. Et maintenant, nous devons enregistrer ces routes dans nos entrées. Ici, nous pouvons mettre un point de module d'itinéraire pour enfant, et ici nous donnons un aperçu de nos itinéraires. Enfin, nous devons enregistrer ce module dans notre module d'application. Donc ici, dans nos entrées, nous pouvons simplement écrire le module du tableau, et c'est notre nouveau module, qui est entré ici en haut. Allons voir si ça fonctionne. Nous pouvons maintenant accéder à notre navigateur, ouvrir nos outils de développement. Ici, nous pouvons cliquer sur notre premier tableau. Et comme vous pouvez le voir, nous n'avons pas d'erreur. Nous voyons ici sur le panneau de mots supérieur puis l'URL, nous voyons les tableaux slash, les barres obliques et les D de ce tableau spécifique. Ce que nous devons faire maintenant, c'est créer un seul tableau pour cette page spécifique. Pourquoi est-ce que c'est ? Parce qu'en fait, nous ne sautons pas toujours de la page des tableaux à notre tableau unique. Et vous pourriez dire, OK, eh bien, sur la page des tableaux, nous avons tous nos tableaux. Mais encore une fois, lorsque nous sommes sur cette seule page et que nous rechargeons la page, nous n'avons aucune information importante, qui signifie que nous devons obtenir cette annonce à partir de notre URL et obtenir cette carte spécifique avec le CD. Vous trouverez également des informations supplémentaires ultérieurement, telles que des colonnes ou des tâches. C'est pourquoi je souhaite ouvrir notre application, services partagés, nos tableaux, nos niveaux de service, et la vente sera définie précédemment ici nous écrivons toutes nos demandes au colorant, qui sont liées à nos tableaux. C'est pourquoi nous pouvons créer ici une nouvelle méthode qui s'appelle get bored. Et puis côté pour obtenir un tableau, nous devons fournir un ID de tableau, qui est une chaîne, et retour nous obtiendrons un observable avec notre interface de tableau. Maintenant, à l'intérieur, nous devons préparer notre URL. Nous allons donc utiliser l'environnement Doherty Pi URL plus, et ici nous voulons concaténer nos tableaux plus AD. C'est pourquoi il est très logique d' utiliser des chaînes ECMO ScriptSIG ici et d'injecter dans cet environnement une URL DPI. Ensuite, nous avons ici barre oblique, tableaux , barre oblique, et voici un AD comme argument. Et en fait ce n'est pas une AD, elle est née et AD. Il s'agit donc de l'URL que nous voulons récupérer depuis le backend. Et maintenant, nous devons renvoyer notre requête à partir de ce point http.get. Et nous fournissons à l'initié notre royaume d'urine que nous voulons récupérer. Mais là encore, nous récupérons des objets observables et nous devons spécifier que nous récupérons notre interface de tableau. Essayons maintenant de récupérer cette URL. C'est pourquoi nous devons revenir à l'intérieur notre module de carte, composants, composant de carte. Et ici, à l'intérieur, je veux créer une nouvelle méthode fetch data, et cette méthode renverra void. Et à l'intérieur, nous voulons utiliser cette méthode que nous venons de créer pour récupérer notre tableau par AD. C'est là que nous devons fournir un constructeur et voici le service de tableaux privés que nous service de tableaux privés que avons mis fin à ce service Boards. Et à l'intérieur de nos données de récupération, nous pouvons écrire ce point de service de tableau de points, s'ennuyer. Nous fournissons un identifiant de tableau d'informations, mais nous n'avons encore qu'un D dans ce composant. Et en fait, nous devons stocker cet identifiant de forum à partir de l'URL, car nous l'utiliserons beaucoup dans ce composant. Mais si nous écrivons ici board ID equals string, alors nous obtiendrons ici un tableau étroit qu'ils creusent n'a pas d'initialiseur et ne l'est pas défini dans le constructeur. Et en fait, nous ne voulons pas arriver ici sans le définir parce que ce ne sera pas confortable de travailler plus tard. Board AD est obligatoire pour notre composant. Et pour obtenir le périmètre à partir de notre URL, nous devons injecter ici route. Voici donc un linceul privé. Ici, nous voulons utiliser la route activée. Maintenant, à l'intérieur, nous voulons essayer de lire cette sécheresse activée. Donc, ici, je veux obtenir l'ID du tableau en tant que paramètre et nous utilisons ici ce linceul de points, points, instantané, point params map get here sera l'ID du tableau. Et c'est ainsi que vous obtenez généralement paramètres à partir de l' URL dans Angular. Mais comme vous pouvez le voir, c'est ce que nous récupérons. Nous sommes en train de nous fatiguer, c'est tout à fait raisonnable car Angular peut être sûr que ce paramètre est toujours là. C'est pourquoi nous pouvons écrire ici, parce que nous voulons vraiment enregistrer juste une chaîne de caractères. Nous pouvons vérifier et lancer une erreur si elle n'est pas là. C'est pourquoi nous pouvons écrire ici. Si nous n'avons pas notre carte AD, alors nous lancerons une flèche. Voici une nouvelle erreur, par exemple, ne peut pas s'ennuyer AD à partir de l'URL. Et après cela, nous écrivons simplement que cet ID de tableau est égal à l'ID du tableau. Et comme vous pouvez le voir dans ce cas où vous vous connectez à l'intérieur de la chaîne, parce que nous avons vérifié ici pour TypeScript que ce n'est pas le cas maintenant. Et si c'est le cas maintenant, alors nous lançons une erreur. C'est en fait le mieux que nous puissions faire pour obtenir une chaîne dans ce composant. Parce qu'il ne sera pas confortable de vérifier chaque endroit où nous obtenons ce paramètre. Et maintenant, à l'intérieur de Good Board, nous pouvons vous donner un aperçu. Ce tableau à points AD. Après cela, nous pouvons écrire point subscribe et nous récupérons notre tableau et nous pouvons l' attribuer et enregistrer quelque part. Mais au moins pour l' instant, je veux juste enregistrer la console de notre tableau Comma board, mais nous n'avons pas du tout appelé «  fetch data » quelque part. C'est pourquoi nous devons y écrire des outils. Et maintenant, après notre constructeur, nous pouvons en juin dedans et l'intérieur nous pouvons appeler cela fetch data. Et en fait, chaque fois que je dois récupérer des données dans chaque composant, je préfère créer une méthode supplémentaire pour cela, appelée fetch data. Et ne vous contentez pas de jeter cette logique à l'intérieur et de vous y joindre juste pour la rendre plus propre. Comme vous pouvez le voir lorsque nous passons au navigateur, nous faisons maintenant une demande sur notre slash api slash, forward slash et cet identifiant spécifique du paramètre momma, qui signifie en fait que nous avons réussi implémenté sur le client ou lorsque vous avez acheté le module et que vous avez même récupéré notre tableau depuis le backend. Évidemment, nous n'avons pas implémenté de partie back-end, et nous le ferons dans la vidéo suivante. 26. Obtenir une seule carte: Dans la vidéo précédente, nous avons implémenté avec succès la partie frontale de notre composant de carte et de notre module de port. Mais maintenant, sur le backend, nous voulons implémenter l'obtention d'un seul tableau. C'est exactement la demande qui est cassée ici. Et je pense que nous avons mis en œuvre beaucoup de choses ensemble et que vous ne saviez déjà pas comment faire. C'est pourquoi je vous recommande vivement de l'implémenter vous-même. Comme toujours, ayez trois niveaux différents pour le niveau numéro un de l'UE, vous suffit de mettre la vidéo en pause ici et de le faire vous-même. À la fin, vous devez obtenir notre tableau depuis le backend, niveau numéro deux, parlons-en. Alors, que devons-nous mettre en œuvre ? Tout d'abord, je veux ouvrir ici notre serveur source. Et ici, nous devons fournir dans votre demande et cela sera sur slash, api slash boards et puis Boyd AD, et ce doit être un paramètre dynamique. Il faut protéger la sécheresse. À l'intérieur de notre contrôleur de carte, nous devons créer une nouvelle action. Maintenant, nous sautons ici à l'intérieur des contrôleurs bouillis, et nous faisons exactement la même chose comme si nous avions oublié les cartes. Mais voici Groupon pour trouver un seul tableau avec le d de ce tableau à partir de l'URL. Donc, si vous voulez faire un niveau pour simplement mettre la vidéo en pause ici, et si vous voulez simplement le faire ensemble, commençons. Tout d'abord, nous devons revenir à l'intérieur nos niveaux de serveurs ici et créer une nouvelle URL d'API. Donc, ici, nous aurons des tableaux slash apt-get slushy pie et ici l'identifiant du tableau deux-points. Nous voulons maintenant créer une nouvelle méthode. C'est pourquoi je vais sauter à l'intérieur des ports des contrôleurs et là on s'ennuie. Ils veulent les copier complètement parce qu'ils seront super similaires. Alors ici, je copie-collé, je m'ennuie, et ils veulent nommer cette méthode, s'ennuyer. Et ici, nous recevons une réponse à la demande et ensuite, nous vérifions si nous sommes bloqués. Maintenant, au lieu de rechercher, tous les tableaux voudront utiliser find one pour trouver un seul tableau. Et en fait encore mieux, nous pouvons utiliser ici find by ID. C'est aussi une méthode qui est possible et à l'intérieur du vermis, il suffit de fournir une identification de ce sport. C'est pourquoi nous pouvons supprimer un objet et plus simplement ici, demander point params dot board Id. Et là, nous recevons notre carte et nous envoyons simplement ce sac de carte dans notre API. Maintenant, vérifions si nous utilisons notre méthode correctement ici, et voici le point get boards du contrôleur de la carte. Cela n'est pas correct. Il faut s'ennuyer. Nous n'avons aucune erreur ici dans notre API et nous avons réussi à implémenter la mise en place de la mise en place. Allons voir ça. Je recharge la page, mais il n'y a pas d'erreur. Ici. Nous recevons notre tableau par D, et voici les informations de la base de données. Nous avons un titre D et un nom d'utilisateur. 27. Ajout de flux de cartes: Dans la vidéo précédente, nous avons implémenté avec succès calibrage de notre carte unique à partir de l'API. Dans cette vidéo, je souhaite partager mon idée façon dont nous allons utiliser ce tableau et l'enregistrer. Et en fait, c'est peut-être un peu délicat. Pourquoi est-ce que c'est ? Parce qu'en fait, ici, à l'intérieur du client, nous avons notre composant de carte et nous pouvons simplement le stocker dans une propriété ici. C'est très bien. ce que nous pouvons faire. Mais plus tard, nous aurons un modèle et c'est là que les choses seront différentes. Juste pour mentionner, nous avons ici une page avec le tableau et puis nous avons cliqué sur une tâche pour ouvrir cette tâche dans le modèle, le principal problème est lorsque nous rechargeons la page, nous voulons revenir à cette tâche spécifique, ce qui signifie que nous voulons avoir dans notre tableau barre oblique URL slash board ID slash tâches slash ID de tâche. Ensuite, nous rechargeons la page et nous récupérons d'abord notre tableau, puis peut-être toutes les colonnes, toutes les tâches. Et nous voulons résoudre cette tâche à l'intérieur du modèle, mais cela a-t-il un moyen ? Nous enregistrons, par exemple, notre tableau ici dans le composant board, mais nous ne pouvons pas vraiment utiliser ces informations dans notre composant de tâche. Pourquoi est-ce que c'est ? Parce que plus tard, nous enregistrerons notre composant de tâche ici en tant que composant enfant de ce chemin. Et nous ne pouvons pas vraiment accéder à certaines données qui ont été stockées dans ce composant de carte à partir de l'enfant. Quelle est la solution à ce problème ? Nous devons utiliser un service. Comment pouvons-nous y parvenir ? Tout d'abord, à l'intérieur d'un tableau, je veux créer un nouveau dossier appelé services. Et ici, nous pouvons créer un service de point de carte, point ds. Ici. Nous ne devrions pas mélanger notre service de conseil ici avec notre service de conseils d'administration, qui a des tableaux à services partagés. Ce service sert simplement à récupérer des données depuis le backend. Si nous voulons obtenir nos tableaux, nous utilisons de bons tableaux, nous nous ennuyons, nous créons des tableaux et ainsi de suite. Mais ce que nous faisons dans le tableau, c'est une sorte d'état pour cette page spécifique, qui signifie en fait que nous allons stocker nos colonnes de tableau, nos tâches, tout ce que nous avons sur cette page, puis tous les composants de cette page peuvent utiliser le service pour obtenir ces informations via des flux. C'est pourquoi ici nous voulons créer notre classe et il sera ennuyé de service. Et ici, en haut, nous ne devons pas oublier d'utiliser un injectable. Ce que je veux faire maintenant ici, exactement comme nous l'avons fait avec notre utilisateur actuel. Juste pour te rappeler que nous avions là, notre service. En haut de la page, nous avons créé ce flux d'utilisateurs actuel que nous pouvons utiliser dans l'ensemble de notre application. Nous voulons faire exactement la même chose. Maintenant ici, nous voulons créer ici Board était plus grand et c'est un flux et ceci est dans votre sujet de comportement. Et nous arrivons ici à l'une ou l'autre interface du tableau maintenant. Et ici, à l'intérieur, nous mettons maintenant juste parce que par défaut nous n'aurons pas de tableau. Nous ne l'avons pas encore récupéré. Ensuite, après avoir récupéré ce tableau, nous pouvons le configurer et mettre à jour le flux. C'est ainsi que nous devons créer une nouvelle méthode, a déclaré le conseil. Et à l'intérieur de l'utérus doit fournir notre tableau, qui est notre interface de tableau, et c'est nul. Et voici ce que nous voulons faire, c'est bien d'appeler ce jeu de fléchettes Stoller point ensuite parce que nous voulons mettre à jour un flux et le retirer de notre tableau. Nous ne devons pas oublier d'enregistrer notre service de conseil à l'intérieur d'un module. Ici, nous devons créer nos fournisseurs et nous écrivons notre service de conseil d'administration à l'intérieur. Et maintenant, nous pouvons l'utiliser directement dans notre carte de composants. Nous ne voulons donc pas créer ici le tableau des propriétés. Nous voulons en fait injecter ici l'intérieur de notre constructeur une nouvelle propriété. Et il sera ennuyé du service du conseil d'administration. Et comme vous pouvez le voir, c'est la différence que nous avons ici, fois les services, le service des conseils et le service du conseil. Et c'est là une énorme différence. Tout d'abord, il s'agit d' un service pour travailler avec eBay. Le second service ressemble plus à un État. Et ce que nous pouvons faire maintenant avec les données de récupération après l'abonnement, nous pouvons écrire et dire ce service de tableau, tableau de points. Et nous sommes fournis à l'intérieur de notre tableau. Dans ce cas, nous le stockons dans le flux. Et maintenant, nous pouvons utiliser ces informations non seulement dans notre composant de tableau, mais aussi plus tard dans notre composant de tâche. Et c'est extrêmement flexible et c'est la meilleure solution que je puisse imaginer pour partager des données entre deux tours. Et juste pour vérifier que cela fonctionne, je veux créer ici le flux supérieur pour le tableau. Donc, en fait, nous avons ici un flux de tableau et nous savons qu'il s'agit d'une interface observable de la carte. Nous montrons donc ici que nous devons obtenir un tableau. n'y a pas d'autre possibilité. Et pour éviter cette erreur de script de type sans initialiseur, nous allons écrire ce code directement dans le constructeur. C'est très bien. Ici, nous pouvons écrire ce tableau à points avec dollar égal, et ici nous voulons utiliser le point de service stocké. Et voici notre chaîne, qui est le dollar du conseil. Et vous pourriez dire, pourquoi ne pas l'utiliser directement ? Parce qu'ici, à l'intérieur du flux de tableaux, nous pouvons maintenant entrer dans notre composant sans avoir besoin de null du tout. Nous voulons simplement travailler avec notre composant lorsque board ne l'est pas maintenant, c'est pourquoi ce que nous pouvons écrire ici, nous pouvons écrire pipe puis filtrer le résultat. Donc, ici, il suffit de filtrer Boolean pour éliminer. À partir de là, nous n'obtiendrons rien si c'est le cas maintenant, nous allons simplement mettre à jour notre tableau. Si nous obtenons un tableau, et maintenant nous pouvons sauter dans notre fichier HTML et afficher ici notre flux de tableau juste pour le tester, c'est pourquoi board dollar. Et ici, nous utilisons un seul tube pour afficher ces informations. Allons voir ça. Je recharge la page et nous obtenons objet, objet parce que nous sommes adjacents et nous devons le passer avec Jason pipe. Regardons ça encore une fois. Nous arrivons ici à notre tableau, et comme vous pouvez le voir, ce sont les informations de notre tableau qui ont été préchargées. Il s'agit du titre, de l'utilisateur, de l'ID utilisateur L'idée est donc que ce service contient des informations, mais nous n'avons pas besoin de les stocker d' une manière ou d'une autre dans notre composant de carte. Nous utilisons simplement les flux du service et les utilisons dans chaque composant où nous en avons besoin, par exemple, nous écrirons exactement le même code dans notre composant de tâche si nous avons besoin l'accès pour notre oiseau, par exemple. Plus important encore, nous pouvons cartographier des données de ce type, ce qui est vraiment pratique. 28. Créer un service de socket: Dans cette vidéo, nous commençons une partie intéressante de notre application qui consiste à configurer la connexion de la couche socket. Et juste pour vous rappeler que nous l'avons déjà configuré. Quetta, tu es sur le back-end. Donc, dans notre code, nous pouvons ouvrir le test du serveur source de service. Et ici, en haut, nous avons un nouveau serveur IR, puis ici nous avons IR sur la connexion. Et voici notre connexion au journal de la console, ce qui signifie que nous l'avons configuré avec succès. Donc, passez au back-end, et maintenant nous devons l' implémenter sur le client. Et pour cela, nous utiliserons exactement la même bibliothèque que celle que nous utilisons en back-end. Juste pour vous rappeler que nous avons utilisé socket. C'est ici dans la console, je veux sauter dans notre dossier client. Et ici, je veux installer un nouveau paquet qui s'appelle socket Datta your dash client. Et c'est exactement le même package de la même équipe, mais c'est pour la configuration de notre client. Et ce package n'a rien à voir avec Angular. Il s'agit simplement d'un simple JavaScript. Alors, que voulons-nous faire maintenant ? Tout d'abord, dans l' application source de nos clients , les services Insight partagés, je souhaite créer un nouveau service et ce sera notre service de travailler avec socket. C'est par ici. Nommons son socket, DOD service dot ts. Et maintenant, à l'intérieur, nous devons créer notre classe appelée service de socket. Et évidemment, il ne faut pas oublier injectables ici sur le dessus. Donc, ce que nous voulons créer ici, nous voulons créer une fonction qui générera pour nous une nouvelle connexion. C'est pourquoi nous pouvons écrire ici une connexion socket SetTab. Et ici, nous obtenons notre utilisateur actuel. Pourquoi l'utiliser actuellement parce qu' ils veulent réellement envoyer des données privées via la connexion socket. Pourquoi est-ce que c'est ? Parce qu'en fait, nous allons utiliser socket. Vous êtes sur la page du forum, ce qui signifie que notre utilisateur est inscrit. Mais à l'intérieur, plongez dans les yogis, nous n'avons pas de système comme GET, comme nous l'avons utilisé pour l'authentification. Nous n'avons pas d' en-têtes HTTP et nous ne pouvons pas attacher notre jeton à notre socket. Mais il existe un moyen de transmettre notre jeton en utilisant socket. C'est une façon de rendre cela possible. Nous voulons configurer cette connexion pour notre utilisateur actuel. Et nous pouvons ensuite lancer le jeton depuis CurrentUser à l'intérieur de notre connexion socket à chaque requête. Donc, comme je l'ai dit ici, nous obtenons comme argument l'utilisateur actuel et cette interface utilisateur actuelle. Et de retour, nous sommes annulés. À l'intérieur, nous voulons utiliser notre ion. Et en fait, je dois entrer ici sur le dessus de votre batterie. Et voici notre client d'E/S socket. Maintenant, à l'intérieur des urgences, je peux fournir une URL où nous voulons nous connecter. Et en fait, nous pouvons simplement essayer HTTP et notre port du serveur. Nous ne voulons pas utiliser cela parce que pour cela, nous avons des variables d' environnement, qui signifie en fait que nous voulons sauter dans l'environnement source des clients, oui, et ici comme nous avons notre API Euro, nous voulons créer une URL socket. C'est ici que nous pouvons créer l'URL des sockets, et c'est le localhost http. Ici, nous avons 4 001 et nous n'avons pas besoin de mettre ici une barre oblique huit pi car nous avons configuré notre connexion socket layer directement sur notre serveur. Et vous pouvez dire, d'accord, mais nous pourrions réutiliser cette API comme une propriété unique pour l'URL de l' API et les E/S de socket. Oui, nous le pouvons, mais je vous recommande vivement de le diviser en deux propriétés différentes. Dans ce cas, il est plus facile de la scinder ultérieurement si vous souhaitez déplacer votre couche socket vers un autre serveur Web. Maintenant, dans notre service de socket, nous pouvons utiliser notre environnement. C'est ici, point d' environnement, nous avons des sockets, une URL. C'est exactement ce que nous devons donner l'envers ou à votre connexion. Et excellent. Maintenant, en outre, je veux fournir le jeton de notre utilisateur actuel, car en fait, nous configurons connexion de la couche socket uniquement pour l'utilisateur connecté, qui signifie que nous n' avons jamais ce jeton. C'est ainsi que nous pouvons écrire heures de terrain et ensuite nous fournissons des discussions, qui est le jeton de point utilisateur actuel. Et en fait, comme deuxième argument, nous fournissons un objet avec notre champ et ce champ extérieur à l'intérieur du socket IO sert exactement à authentifier un utilisateur. Et ce que nous obtenons, c'est que le résultat de notre RA est cette connexion socket. C'est là que je veux écrire cette socket égale IR. Et ici, nous devons créer cette propriété, à l'intérieur du socket. Comme vous pouvez le voir, il s'agit de nos deux contributions. Cela n'est pas correct. Nous voulons importer le socket depuis le client Socket Layer, ou il n'est pas défini car par défaut nous n'avons pas de socket. Et puis, à un moment donné, nous l'avons configuré en utilisant la connexion socket d'installation. En plus de notre fonction de configuration, je souhaite créer une fonction de déconnexion, ce qui signifie qu'à un moment donné, notre utilisateur sera verrouillé et que nous voulons le déconnecter de notre connexion par prise. C'est ici que nous allons créer une fonction de déconnexion supplémentaire. Et c'est très simple. Ce que nous voulons appeler ici, nous voulons écrire ce point socket. Et ici, nous avons une méthode qui s'appelle disconnect. Et comme vous pouvez le voir ici, je n' obtiens pas de saisie semi-automatique car en fait, ce socket peut éventuellement être indéfini. Et il y a deux variantes possibles de la façon dont nous pouvons le corriger. Tout d'abord, ici je peux juste mettre un point d'interrogation et c'est fini. Mais je ne veux pas écrire le code comme ça. Je tiens vraiment à informer un développeur que si nous n'avons pas de socket, nous avons un problème. Nous ne pouvons pas vraiment utiliser la déconnexion avant de configurer notre connexion. Si nous n'avons pas ce point socket, alors nous voulons lancer et rétrécir. Donc, voici une nouvelle erreur. Et par exemple, la connexion socket n'est pas établie. Notre service de sockets de base est donc créé avec succès. Maintenant, nous devons à un moment donné implémenter la configuration de connexion socket et ils veulent vraiment le faire dans notre module d'application. Pourquoi est-ce que c'est ? Parce que chaque fois que nous sommes authentifiés et que Berlin, maintenant que nous avons CurrentUser, voudrait établir une connexion. C'est ici que nous pouvons accéder à notre composant d'application. Et voici un prochain. Et juste pour vous rappeler, nous obtenons ici l'utilisateur actuel chaque fois que nous lançons notre application. Et ici, nous définissons l'utilisateur actuel et nous pouvons, avant cela, établir une connexion. C'est ici que nous pouvons écrire privé et nous avons un service de socket, et c'est notre service de socket. Maintenant, avant de pouvoir écrire, nous avons ici ces points, service de socket, point, connexion socket d'installation. Et en fait, nous obtenons notre utilisateur actuel et nous pouvons le donner à l'intérieur. Sauvegardons ceci et vérifions si cela fonctionne, comme vous pouvez le voir ici sans aucune erreur, puis sautez dans le navigateur. Et ici, c'est rouge, nous obtenons une erreur. Aucun fournisseur de service de socket a mis fin à cela parce que nous avons créé notre service de socket, mais nous n'avons pas injecté à l'intérieur d'un module. Et ici, nous utilisons le service socket dans notre composant d'application, ce qui signifie qu'il est logique d'injecter ce module chez nos fournisseurs. C'est pourquoi ici nous pouvons écrire un service de socket et nous sommes prêts à partir. Allons voir ça. Je recharge la page et une autre erreur s'affiche. Donc peu importe ce que nous obtenons, nous faisons cette demande sur socket a yarn. Vous pouvez le voir ici, mais nous obtenons une erreur. Nous avons un cours, ce qui implique une politique d'origine croisée. Parce qu'ici avec ne pas avoir de contrôle d'accès, autorisez en-tête d'origine sur la ressource demandée. Et c'est en fait tout à fait correct et nous devons déterminer à l'intérieur de Serum pourquoi cela se produit, parce que notre serveur n'autorise pas les connexions depuis autre hôte et utilisera certainement ici un autre hôte, il s'agit d'un hôte local pour 1200. C'est pourquoi nous devons aller à l'intérieur d'une source serveur. Et ici, nous avons nos niveaux de serveurs, et nous devons configurer notre serveur IIS un peu différemment. Donc, comme deuxième paramètre, nous pouvons fournir quelques options et nous recherchons l'option qui s'appelle cores. Et à l'intérieur, nous pouvons définir l'étoile d'origine et démarrer signifie que nous autorisons les connexions depuis n'importe quel hôte. Et en ce qui concerne le projet ferroviaire, vous pouvez écrire ici juste une liste de votre domaine. Mais pour nos besoins, étoile d'origine est tout à fait valide. Allons voir si ça fonctionne. Je suis ravi maintenant de la page et nous n'avons aucune erreur. Maintenant, nous pouvons sauter à l'intérieur du réseau, et ici, comme vous pouvez le voir, nous avons des connexions WebSocket. en sommes donc à des centaines. Et si vous pouvez voir dans votre navigateur quelque chose comme ça, cela signifie que votre demande de connexion socket est cela. Et en fait, nous pouvons maintenant accéder à notre console principale. Et ici, nous pouvons voir connect trois fois parce que chaque fois que je recharge la page, une nouvelle connexion est établie, ce qui signifie que nous avons réussi créer une connexion socket sur le client. Maintenant, la seule question est : est-il de la déconnexion ? Nous avons créé une déconnexion mais nous n'avons pas pu l'utiliser où nous voulions l'utiliser. En fait, je voudrais l' utiliser dans la déconnexion. C'est ici que nous pouvons accéder à notre application, aux services de santé et au service de résultats ici. Et voici notre déconnexion. Et ici, nous supprimons d' abord notre conversation, puis quand nul et notre utilisateur actuel. Et ici, nous pouvons utiliser socket pour déconnecter notre connexion car nous savons comment nous l'utilisons n'est plus verrouillée. Nous n'avons pas besoin de cette prise de courant. C'est ici à l'intérieur du constructeur, nous pouvons injecter notre nouveau service de socket, et c'est notre service de socket. Maintenant, en bas de notre déconnexion, nous pouvons écrire ce point de service de socket, et nous allons déconnecter notre utilisateur actuel et fermer notre connexion socket. 29. Rejoindre et quitter le tableau: Dans cette vidéo, je veux vous montrer comment utiliser les sockets sur l'exemple de la connexion à notre carte et de les déconnecter à la carte. Qu'est-ce que ça veut dire ? Insérez réellement le socket IO. Nous avons un tel thin qui est appelé rooms, ce qui signifie en fait que lorsque vous ne notifiez pas simplement notre backend avec un message de socket ou un autre client lorsqu'ils définissent tous les clients connectés à des chambre. Et en fait, quand nous parlons de planches à l'intérieur de la remorque, cela a beaucoup de sens. Nous voulons vraiment avertir uniquement les utilisateurs qui ont rejoint ce forum spécifique. Ce qui signifie, par exemple, que nous avons deux utilisateurs différents. Un utilisateur a ouvert le tableau, plein. Formulaire de tableau ouvert pour le deuxième utilisateur. Maintenant, le premier utilisateur a créé une tâche et nous devons informer un deuxième utilisateur création de cette tâche parce qu'il est connecté à cette salle ou à ce tableau. C'est ici que, dans cette vidéo, nous expliquerons comment nous pouvons rejoindre notre conseil d'administration et le quitter. Et pour cela, nous devons créer une nouvelle méthode dans notre service de socket. C'est pourquoi je veux ouvrir nos niveaux de service de circuit ici, créer une nouvelle méthode appelée emmet. Pourquoi nous avons besoin de cette méthode, en fait Insights Socket lui-même. Nous avons ces points, socket, point et meet, et nous pouvons fournir juste une chaîne comme foo. Ce sera notre message d'émission. Et ici, nous pouvons fournir quelques informations, par exemple, la chaîne Ambar. C'est ainsi que nous pouvons généralement utiliser sockets dans notre application, mais je souhaite l'encapsuler dans méthode supplémentaire pour deux raisons. Tout d'abord, nous voulons isoler une bibliothèque et créer un wrapper. Dans ce cas, nous pouvons toujours abandonner cette utilisation, par exemple, socket à votre client et utiliser une autre bibliothèque. Deuxièmement, ici je veux valider que nous sommes connectés pour socket un fil. C'est ainsi, voici notre image et nous y arrivons, tout d' abord, le nom de notre événement, c'est juste une chaîne. Et si vous ne connaissez pas l'intérieur des E/S de socket, nous émettons toujours uniquement avec des chaînes uniques, que nous écoutons sur d'autres clients ou dans notre backend. Et le second ici sera un message ici, j'écrirai tout gaspillage, tout, parce que c'est un message que nous pouvons fournir une chaîne et aucun objet ou aucune donnée que nous aimons. Et là, nous avons un vide, mais nous voulons le faire à l'intérieur. Tout d'abord, je vais copier-coller cette ligne pour vérifier la connexion du socket. Parce que si nous n'avons pas de prise de courant, nous ne pouvons pas utiliser de viande. Après ça. Nous pouvons simplement utiliser ce socket dot commit et ont été fournis dans la virgule de notre nom d'événement. Voici notre message. Notre fonction image est prête et nous pouvons maintenant l'utiliser. Et en fait, je veux l'utiliser directement dans nos composants de carte d'application, composant de carte, composant ts. Et nous avons ici en juin la méthode init. Et en fait, c'est un bon endroit pour mettre juste ici la jointure de l'utilisateur, qui signifie en fait que chaque fois que ce composant est chargé, cela signifie que les utilisateurs sautent à ce route et nous devons rejoindre l'utilisateur s'il a changé d'itinéraire et que nous voulons quitter cette salle ou ce tableau. Donc avec déconnecter un utilisateur de cette pièce spécifique. C'est pourquoi nous pouvons écrire ici. Tout d'abord, nous devons injecter ici notre service socket. C'est y, voici le service socket, et c'est notre service socket. Maintenant, nous pouvons utiliser cette méthode et écrire ce point de service point socket. Et là, nous avons notre image et nous devons d' abord donner un aperçu du nom de notre événement et ensuite des données. Donc, essentiellement, ce que nous voulons écrire ici, quelque chose comme les tableaux se joignent. Et ici, notre message sera, par exemple, un objet avec un ID de tableau. Et ici, nous fournissons l' ID du forum de cette URL spécifique. Il s'agit de cet identifiant de tableau. Nous disposons déjà de ces informations. Pourquoi j'ai mis ces informations dans l'objet. Parce que dégonfler, si pour une raison quelconque nous voulons mettre ici plus d' informations avec l'objet, nous pouvons le faire directement. Si nous avons ici, une chaîne doit refléter tous ces endroits, de la chaîne à l'objet. Comme vous pouvez le voir ici, nous pouvons émettre n'importe quelle tension. Nous pouvons écrire ici pour. C'est très bien, mais nous aurons beaucoup d'événements de socket différents et nous voulons les organiser d'une manière ou d'une autre. C'est pourquoi je préfère utiliser des tableaux, qui est un pluriel d'une entité, comme des tableaux ou peut-être des colonnes ou des tâches. Et voici ce qui s'est passé ? Par exemple, nous l'avons rejoint, ce n'est qu'un début. Nous pouvons ensuite faire quelque chose comme succès commun si c'est dans un processus synchrone, ce qui signifie en fait que pour l'instant, les oiseaux se joignent bien. Ce qui ne va pas, c'est que nous écrivons ici une chaîne où c'est juste en TypeScript et que nous devons utiliser d'innombrables. Et en fait, il n' que quelques constantes dans une seule propriété. C'est pourquoi ici à droite, je veux ouvrir notre dossier partagé, et ici nous avons des types dans. Ici. Je veux créer des événements de socket point dans m point ts. Ici. Maintenant, nous pouvons exporter notre enum, qui est l'ENM de socket UN, et c'est juste un objet ici nous pouvons écrire des tableaux de champs join equals, et ici nous écrivons boards join. Tout d'abord, nous avons ici un style de code. Deuxième Luba non dessiné ici, une ficelle. Juste ici, les événements de socket dans la chaîne de m tableaux à points, dans ce cas, à chaque endroit où l'on utilise la même chaîne, mais nous ne l'écrirons jamais de manière incorrecte parce que nous utilisons ici Justin unum, qui est une variable et non une chaîne simple. Donc, ce que fait cette ligne, elle émet pour notre back-end dans un nouveau message d'E/S de socket. Voici quelques chaînes de caractères et quelques données. Pourquoi nous fournissons exactement ces données, parce que nous voulons rejoindre notre utilisateur actuel sur le backend. Donc, notre connexion de prise actuelle à la carte spécifique. Et c'est suffisant pour que notre backend réagisse. Maintenant, il est temps de l'implémenter côté back-end, c' est là que nous devons ouvrir la source de nos serveurs. Et voici notre test de serveur. Et ici, en bas, nous avons notre propre connexion. C'est très bien. Maintenant, à l'intérieur, nous pouvons supprimer ce journal de console et nous voulons réagir avec notre point de socket activé, sur certains événements et entendre ce que nous attendons. On attend le joint du conseil d'administration. Mais ici, nous avons exactement le même problème à l'intérieur backend et nous ne voulons pas écrire uniquement des chaînes simples. Nous voulons également les organiser dans l'enum. Et en fait, nous allons dupliquer exactement le fichier complet de nos événements de socket dans le client et dans le sirop. Et vous pourriez dire, d' accord, c'est inutile. Nous ne pouvons créer qu' un seul fichier. possible, mais vous pouvez éventuellement diviser votre client et votre serveur en différents référentiels , puis partager n'importe quoi entre eux. C'est pourquoi je souhaite vraiment isoler notre client et notre back-end. Donc, ce que nous voulons faire ici à l'intérieur de nos types, nous pouvons créer exactement la même chose. Ce seront nos événements de socket qui n'énumèrent pas de points. Et maintenant, à l'intérieur, ils pourront être placés exactement le même code que celui que nous avons sur le client. Ce que je veux faire maintenant ici, au lieu que les oiseaux se joignent, je peux écrire des événements socket dans m dot boards churn. Et comme vous pouvez le voir, cette entrée provient des événements de type socket. C'est ainsi que nous nous abonnons à notre événement depuis le client avec socket, the tongue, mais d'où nous obtenons notre socket, c'est notre premier paramètre ici. Comme vous pouvez le voir, c'est socket et ici nous avons socket point on, mais ici nous devons fournir deux arguments. Tout d'abord, c'est notre événement, et ensuite c'est notre Kohlberg. Donc, ce que nous obtenons ici contient généralement certaines données, et ce sont exactement les données que nous avons fournies par le client. Nous pourrions écrire ici un peu de logique, mais nous ne voulons pas, car en fait, nous avons écrit tout ce qui est lié à nos tableaux à l'intérieur du contrôle. Et il est très logique d'écrire tout le code d'E/S de notre socket également dans le contrôleur. Peu importe qu'il s'agisse de Socket Layer ou de justice GTP. Nous pouvons isoler tout ce code à l'intérieur de nos contrôleurs. C'est ici que nous pouvons utiliser le point contrôleur de notre carte, par exemple, join board. C'est ce que nous voulons mettre en œuvre. Et maintenant à l'intérieur tout d'abord, je veux donner plus que socket et ensuite données. Et nous le ferons dans chaque cas lorsque nous travaillerons avec Socket Layer et donnerons ces informations à l'intérieur. C'est très similaire à ce que nous faisons avec notre Express. Ici. Nous utilisons le contrôle des naissances ou créons un tableau. Et en fait, c' est ainsi que nous donnons directement une réponse à la demande interne. Et ensuite, pourquoi nous faisons cela. En fait, lorsque nous fournissons tout ce qu'il y a à l'intérieur, nous pouvons utiliser ce que nous voulons. Si nous avons besoin d'un y'all, nous pouvons utiliser un fil quand il fait du vélo. Nous pouvons utiliser ces informations si nous avons besoin de certaines données de l'événement, nous pouvons également les utiliser. Et maintenant, il ne nous reste plus qu'à mettre en œuvre notre joint. C'est pourquoi je souhaite me lancer dans nos sports de manette. Et ici, en bas, nous devons créer une nouvelle fonction. Ici, nous avons des cônes experts, Joan board, et nous arrivons ici, tout d'abord, Iowa, qui est un serveur. En fait, nous avons ici beaucoup de choses inverses. C'est pourquoi vous devez être prudent, mais nous devons entrer notre serveur à partir du socket IO. C'est important. C'est là que nous obtenons un fil et c'est notre serveur en tant que type. Après cela, nous avons notre socket. Et le socket provient également du socket IO. Enfin et surtout, voici nos données. Et en fait, nous savons qu' à l'intérieur, nous fournissons l'identifiant du tableau, qui est une chaîne, et c'est assez d'informations pour nous. Voici donc à quoi ressemble une fonction typique à l'intérieur du contrôleur lorsque nous travaillons avec Socket Layer. Et maintenant, ce que nous voulons faire à l'intérieur, nous voulons simplement écrire socket point join. Ici, nous fournissons l'ID du tableau de points de données. Et ça y est, il ne s' agit que d'une seule ligne. Donc, ce que fait ce code, donc Wed montré dans cette connexion socket actuelle. Donc notre utilisateur actuel de ce forum ID, et ce n'est qu'une chaîne, rien de plus. Mais en fait, lorsque nous écrivons join et foo, nous disons simplement à socket de joindre socket actuel à cette salle avec ce nom, mais nous n'avons pas de salles dans notre application, nous avons des tableaux, mais l' idée est exactement la même chose, lorsque nous rejoignons nos utilisateurs au forum, puis ils recevront nos messages à ce forum spécifique. Certains veulent maintenant tester le bon fonctionnement de notre code. C'est pourquoi je veux juste écrire le serveur de journaux de console, socket join. Et ici, je vais écrire un tableau de points de virgule AD dans ce cas. Mais maintenant, lorsque nous voyons ce journal de console, cela signifie que le message a été émis avec succès depuis le client ou le backend. Et notre backend a réagi au message et a rejoint notre utilisateur dans cette salle. C'est ici que nous allons sauter dans notre backend et recharger la page. Et comme vous pouvez le constater, nous n'avons aucune erreur. Et en fait, notre code avec ce composant de carte et cette image sera déclenché parce que notre composant a été rendu. Et maintenant, nous pouvons sauter dans la console et vous pouvez voir le circuit de service ou votre jointure. Et voici le D de notre tableau. C'est ici que nous rejoignons notre socket actuel. Et comme vous pouvez le voir dans le navigateur, c'est exactement le d de notre tableau. Et maintenant, nous voulons faire exactement la même chose avec la vie et la pension. Et en fait, ce qu'ils voulaient faire, je veux créer ici une méthode supplémentaire, initialiser les auditeurs et en fait tous mes auditeurs comme les abonnements, par exemple, j'emballe toujours dans ce méthode supplémentaire. C'est le même nom que dans, par exemple, fetch data. Dans ce cas, ils ne contiennent pas beaucoup d' informations en juin. C'est là que je veux écrire, initialiser les auditeurs et m'abonner ici pour vivre dans une page. Et en fait, nous pouvons le faire si nous utilisons une application de lutte contre la sécheresse et que nous avons ici une sécheresse, mais pas un routeur. C'est ainsi que nous devons utiliser le routeur et c'est notre travail. Et maintenant, nous pouvons écrire un abonnement pour vivre dans une page. Et ici, nous pouvons écrire ces événements point routeur point. Et voici que nous nous sommes inscrits. Et en fait, nous nous abonnons, nous aurons ici accès à chaque événement déclenché par un routeur. Et ce que nous voulons écrire ici, si événement, exemple d'ici, nous avons le début de la navigation. Et le début de la navigation est le début d'un changement dans notre itinéraire. Et en fait, si cela se produit, alors je veux me connecter à la console en laissant une page. Encore une fois, nous utilisons événements de sécheresse pour nous abonner à tous les événements de sécheresse. Et nous obtenons avec Subscribe l'accès à chaque événement maintenant ici pour vérifier l'événement spécifique où l'utilisation de l'instance de et nous fournissons ici la pile de navigation. Et voici notre journal de console où nous voulons émettre un message de socket et ce message sera en direct sur un forum. Ensuite, nous devons déconnecter un utilisateur de ce forum spécifique. Allons voir ça. Je recharge la page et nous avons un étroit j'ai oublié de mettre une virgule ici en haut. Mettons-le maintenant et rechargeons la page. Et comme vous pouvez le voir, nous n'avons pas d'erreurs, mais nous ne pouvons pas vraiment passer à une autre page où ils peuvent essayer de le faire ici. Je peux juste revenir en arrière et nous quittons la page parce que nous sommes maintenant sur la page des tableaux slash. Et voici ce journal de console, qui signifie en fait que ce journal de console se déclenchera chaque fois que nous vivrons une page. Mais en fait, ici, je ne veux pas utiliser le sommet du service des sockets. Au lieu de cela, je veux écrire ici ce tableau à feuilles de points de service. Et en fait, vous pourriez demander, mais pourquoi, pourquoi ne pas simplement écrire ici socket au milieu de la réponse ici, ce n'est pas sur LinkedIn que nous voulons faire à l'intérieur d'un service de forum lorsque nous quittons la page. Et en fait, ici , à l'intérieur du service la mer, nous avons le flux de la planche et nous devons également le régler maintenant quand nous avons quitté le tableau, c'est ici. Créons notre méthode de planche à feuilles et nous avons juste ici un vide à l'intérieur. Tout d'abord, whoop, je veux installer ce tableau maintenant, qui signifie en fait que nous n'avons plus de tableau. Et après cela, nous voulons répondre à ce message qui quittera le conseil d'administration. C'est pourquoi nous devons ouvrir nos types partagés. Et voici les événements de socket. Ici, nous avons le churn Boards. Maintenant, nous pouvons copier-coller ce message et le nommer en direct. Et c'est juste ennuyeux. Partir. Maintenant, je vais copier-coller cette ligne. Et maintenant, nous pouvons utiliser notre service de socket. Mais pour cette machine virtuelle doit l' injecter ici dans le constructeur. Nous avons donc ici notre service de socket, et c'est un service de socket et nous l'utilisons exactement comme nous le faisions auparavant. Ce que je veux écrire ici, c'est ce service de socket dot m it et a été fourni à l'intérieur de notre nom d'événement. Et dans ce cas, ce seront nos événements socket E et M dot boards live. Et en fait, ici, nous devons fournir ce que nous devons vivre au conseil d'administration. C'est là qu'il nous manque un identifiant de tableau, qui doit être une chaîne, et que nous devons fournir à partir de notre composant. Ici, je veux mettre l'identifiant du tableau. Nous devons maintenant mettre à jour notre composant. Nous avons donc ici notre composant board, et ici à l'intérieur du live board, je vais écrire cet ID de port point. Maintenant, nous devons simplement implémenter exactement la même chose sur le serveur que nous avons fait pour la jointure, mais nous devons utiliser live. C'est là que nous allons revenir en arrière dans les silos, les serveurs, la source, le serveur, oui. Et voici notre géant des connexions et des ports. Ce que je dois faire maintenant, je veux mettre à jour les événements de socket qu'ils contiennent sur le backend, et ce seront également les ports qui quitteront. Et ici, je suis en direct. Maintenant, ici, nous pouvons copier-coller ces lignes complètement et enregistrer une prise de plus, pas pour les tableaux barattés, mais pour les tableaux à points en direct en devinant qu'il a des données. Et ici, nous voulons utiliser le contrôleur de ports, pas rejoindre le tableau, mais le quitter. Et nous devons maintenant créer ce module live à l'intérieur de notre manette. Et en fait, ce sera exactement la même chose. C'est pourquoi je vais copier-coller complètement cette méthode et la nommer en direct Ici , nous obtenons notre IR comme précédemment socket car auparavant, les données internes se terminent, nous avons notre ID de carte. Maintenant, dans le journal de la console, nous pouvons écrire notre cour pour partir. Et voici la carte de données AD et au lieu de socket joint, où juste ici, socket dark leaf, et avec cette seule ligne où nous déplaçons notre socket actuelle de cette pièce spécifique, qui signifie que nous n'obtiendra aucun événement de ce forum. Allons voir si ça fonctionne. Je recharge la page et on y est. Maintenant, je suis un sac caché et nous devons envoyer la section pour notre back-end. Voyons ça comme vous pouvez le voir ici. Tout d'abord, nous avions ici socket je jouxte et rejoignez cette pièce spécifique. Et quand je réponds, nous avons une feuille de cette pièce. Et c'est exactement comme ça qu'un client et la mendicité fonctionnent ensemble lorsque nous utilisons le socket IO. 30. Authentification dans socket.io: Dans cette vidéo, nous devons terminer le travail sur l'authentification maintenant un socket User Insights. Mais tout d'abord, nous voulons régler un gros problème. Comme vous pouvez le voir ici, je suis connecté et je suis sur la page du forum. Mais que se passera-t-il si je me déconnecte ? Je veux donc simplement sauter dans l'application, supprimer notre jeton et recharger la page. Je suis maintenant directement sur la page d'accueil. Cela est tout à fait valable. Mais à un moment donné, je veux m'authentifier à nouveau. Je clique ici pour me connecter, puis coller ici f2 à gmail.com. Et notre mot de passe, je frappe ici même. Et comme vous pouvez le voir, nous n'avons pas d'erreur, mais après le même saut dans premier-né et nous obtenons une erreur, connexion socket n'est pas établie pourquoi cela se produit. En fait, nous avons notre connexion socket d' initialisation dans notre application source, composant d' application ts, ce code. Donc, après la page Lord, nous allons chercher l'utilisateur actuel et ici nous configurons la connexion socket, mais nous ne sommes pas bloqués au début. C'est pourquoi nous sommes venus ici et nous avons défini notre utilisateur actuel maintenant, puis nous nous sommes bloqués avec succès. Et juste pour vous rappeler, c'est ce qui se passe, où à l'intérieur de nos composants se connectent. Voici notre onsubmit ici où vous vous abonnez à la connexion et nous sommes assis ici à parler et à l'utilisateur actuel, c'est tout à fait correct, mais nous n'avons pas mis à jour notre socket. Ainsi, notre connexion de couche socket n'existe pas après enregistrement ou après la connexion et ne vit pas lorsque nous rechargerons la page, cette connexion socket sera établie. Encore une fois, ce n'est évidemment pas correct et nous devons établir cette connexion après connexion ou après l'enregistrement. Et c'est extrêmement facile à faire. Ce que nous devons faire ici, nous pouvons simplement injecter à l'intérieur de notre constructeur une nouvelle propriété, et ce sera notre service de socket, qui est notre service de socket. Nous pouvons maintenant utiliser cette méthode. Ainsi, par exemple, après un certain jeton, nous pouvons écrire ces points point de service de socket. Et ici, nous avons une connexion socket SetTab ici bien qu'ils ont accès à un utilisateur actuel et nous la jetons simplement dans notre connexion socket d'installation. Et nous devons faire exactement la même chose lors de notre inscription. Donc, tout d'abord, nous injectons notre service de socket. service de socket privé est donc un service de socket. Et maintenant, après cela, nous pouvons utiliser cette méthode dans notre succès. Donc, après avoir défini le jeton, c'est le service de socket de points, la connexion de socket de configuration de point avec l'utilisateur actuel. Dans ce cas, cela fonctionnera correctement. Je veux supprimer la page de discussion, sauter ou me connecter et maintenant essayer de me connecter. Voici donc le plein sur gmail.com et notre mot de passe, je suis en train de dire méchant, puis je passe à la première partie. Et nous n'avons pas d'erreur pour le moment, car nous avons réussi à configurer notre connexion socket juste après le verrouillage. Mais nous ne faisons rien avec notre authentification dans les E/S du socket, et c'est exactement ce que nous voulons faire. Que se passe-t-il à l'intérieur de notre connexion socket d'installation ? Ici, nous sommes renvoyés à l'intérieur de notre jeton utilisateur actuel. C'est très bien. De face et de côté, nous avons fait tout ce dont nous avions besoin. Mais maintenant, nous devons sauter à l'intérieur d' un serveur et l'analyser en conséquence. Pour cela, Boom doit sauter à l'intérieur de nos niveaux de serveurs. Et voici votre propre lien. Et en fait, avant notre propre connexion, passez à écrire ici, utilisez le point. Ici, nous aurons notre fonction et ce sera notre middleware. Et après cela, nous avons notre propre connexion, qui signifie qu'elle est exactement la même, comme la façon dont notre intergiciel ici passe à authentifier notre demande et à savoir que nous sommes bloqués parce que notre connexion socket n'est disponible que pour les utilisateurs connectés. C'est ici que nous écrivons IOU et à l'intérieur nous devons fournir la fonction. Et ici, il s'agira d'une fonction asynchrone simplement parce que nous voulons récupérer notre CurrentUser dans la base de données. Et ici, nous obtenons d' abord notre socket, qui est socket, et nous obtenons, et la fonction suivante, parce que c'est une fonction synchrone que nous voulons écrire ici, essayez et attrapez. Donc tout d'abord, nous devons essayer directement et où, cuisine et erreur et ce que nous allons arriver à l'intérieur de la capture. Nous voulons simplement écrire ici et lancer une nouvelle ère avec, par exemple, notre erreur d'authentification. Et voici une chose très importante dont vous devez vous souvenir. Nous n'avons aucune erreur dans le socket. Ils n'y sont pas du tout. Nous ne propageons aucune erreur au client, ce qui signifie que si nous obtenons une erreur, par exemple sur le backend, nous voulons simplement envoyer un message au client spécifique. Nous pouvons envoyer un étroit que nous venons de jeter à l'intérieur d'un objet peut être un message d'erreur avec un code d'erreur ou tout ce que vous préférez. Et il est important de s'en souvenir. Socket Layer ne fonctionne donc pas exactement de la même manière, comment devrait-il s'agir d'erreurs ? Et maintenant, la première chose que nous voulons faire dans notre tentative est de nous faire parler de la demande. Et ici, nous pouvons écrire point, poignée de main, point, maison, jeton de point. Et ce sera exactement ce que nous avons vécu. Et en fait, ici, nous obtenons le jeton, c'est n'importe lequel, et ils ne veulent pas ça, parce qu'en fait, ici je veux obtenir une chaîne. C'est pourquoi je peux écrire ici crochets ronds et simplement écrire la souche S. Et si nous n'obtenons pas ce jeton, je veux utiliser ici une chaîne vide. Pourquoi est-ce que je fais ça ? Parce qu'ici, nous voulons utiliser Jason verify, pour vérifier notre jeton. Et dans ce cas, nous ne voulons pas qu'elle soit indéfinie. C'est. Nous pouvons le vérifier lorsqu'il s'agit d'une chaîne. C'est par ici. Nous pouvons maintenant essayer d'analyser les conversations en utilisant le jeton Web JSON. Donc, en haut, nous pouvons importer le GPS à partir de notre package JSON Web Token. Maintenant, nous pouvons revenir à notre code ici, l'utiliser. Nous aurons donc ici JWT point, et ici nous avons vérifié. Et maintenant, à l'intérieur, nous devons d' abord passer notre cible. Mais juste pour vous rappeler, l'intérieur d'un jeton, nous avons l'espace au porteur, puis notre jeton, c'est là que je veux le diviser par espace et prendre le deuxième argument. Et après cela, nous devons fournir ici un secret. Et juste pour vous rappeler quel est le secret qui vient de notre config. C'est ce que nous utilisons pour analyser notre jeton JSON. Et c'est ce que nous récupérons. Nous obtenons ici un lot de cordes ou de TVP. Mais ici, nous voulons vraiment dire ce que nous récupérons. Ici. Comme toujours, nous obtenons notre objet, nous disons D, qui est une chaîne. Et deuxièmement, nous recevons un e-mail qui est également une chaîne. Dans ce cas, nous obtenons des données correctes ici et nous pouvons maintenant obtenir un utilisateur comme nous l'avons fait dans notre middleware Auth. Et pour cela, nous devons saisir un utilisateur ici en haut. Nous utilisons donc maintenant un modèle utilisateur exactement comme nous le faisions auparavant. Nous utilisons donc simplement des modèles de barre oblique utilisateur de barre oblique. Et maintenant, nous pouvons faire une demande. Nous voulons donc récupérer notre utilisateur, et ici nous voulons faire une demande à la base de données avec l'utilisateur point. Et voici notre beau Bye. Ici, nous pouvons effectuer une recherche par ID car nous avons point de données NAD Insight. Et si nous n'avons pas notre utilisable, voulons lancer une erreur. Donc ici, si nous n'avons pas trouvé d'utilisateur, cela signifie que nous ne sommes pas bloqués ici. Nous lançons simplement return next et nous sommes jetés dans une erreur d'authentification new era, tout comme nous l'avons fait dans notre catch. Et après cela, nous voulons écrire cet utilisateur dans notre socket. En fait, socket est notre instance, et nous pouvons écrire dans les informations supplémentaires comme nous l'avons fait précédemment avec request. Dans ce cas, plus tard dans chaque contrôleur, nous pouvons accéder à cet utilisateur actuel. C'est ainsi que l'utilisateur point socket égal à l'utilisateur que nous avons trouvé. Et comme vous pouvez le voir ici, nous obtenons directement une propriété d'erreur que l'utilisateur n'existe pas sur le type socket et nous devons faire exactement la même chose que nous avons fait avec la requête SAML. Juste pour vous rappeler, nous avons créé une demande expresse dans laquelle nous avons étendu notre demande pour mettre l'utilisateur à l'intérieur. Et maintenant, nous voulons faire exactement la même chose, mais avec notre socket. C'est par ici. Créons une interface point point ds pour socket. Et ici, à l'intérieur, nous voulons créer une nouvelle interface, qui s'appelle socket. Et ici nous voulons utiliser extends from socket, socket. En fait, j'ai ici un nom assez étrange car ce n'est pas une entrée valide de la socket. C'est par ici. Je veux importer un socket en tant que socket ou votre socket. Et je fais ça depuis socket ou simplement parce que nous ne pouvons pas avoir exactement le même nom. Donc voici le Gabon pour exporter notre socket et voici un socket important, ce n'est pas valide. C'est là que nous voulons renommer notre entrée à partir de socket IO et ensuite étendre à partir de notre socket, socket. Et nous voulons ajouter ici notre utilisateur. Et ce n'est pas toujours fait cette façon ici il y a un point d'interrogation, et c'est un document utilisateur que nous devons également importer ici en haut depuis notre interface utilisateur, nos interfaces socket là-bas. Nous pouvons maintenant revenir à l'intérieur de notre serveur et l'utiliser au lieu du simple. Donc juste pour vous rappeler, nous avons ici un socket d'entrée de socket IO. Cela n'est plus valide. Voici Woburn pour inverser notre socket, et voici nos types de socket slash. Allons voir si ça fonctionne. Je fais défiler ici vers le bas, et nous n'avons plus d'erreur ici. L'utilisateur du socket est complètement valide et il s'agit d'un document utilisateur ou d'un document non défini. Voyons maintenant si notre code fonctionne. Donc je saute ici à l'intérieur de la console et nous n'avons aucune erreur, donc ça marche. Maintenant, ce que je veux faire, c'est sauter à l'intérieur de nos cartes contrôleurs. Ici, nous faisons partie du conseil d'administration. Donc ici au lieu de la carte de données AT, je peux connecter ici un utilisateur de maman, un socket. Et en fait, ici, l'utilisateur socket dot est évidemment invalide car ici nous n'avons pas utilisé l'interface correcte. C'est par ici en haut. Nous n'avons pas besoin d'utiliser socket from socket IO, mais nous devons importer notre interface socket que nous venons de créer à partir de notre interface de socket type slash. Ici, nous n'avons pas d'erreur. Allons dans la console et vérifions si elle fonctionne. Et pour cela, il suffit de recharger cette page et nous n'avons aucune erreur. Regardons maintenant à l'intérieur de la console. Vous pouvez voir qu'il n' y a pas de message ici, ce qui signifie que nous avons oublié quelque chose. Et ce que nous avons oublié, c'est à l'intérieur du sayo use to write next, qui signifie qu' après cette ligne, notre code ne va nulle part. C'est y ici, mais il faut écrire ensuite, et dans ce cas cela doit fonctionner. Allons vérifier à nouveau. Je suis en train de recharger la page. Nous allons sauter dans notre backend et comme vous pouvez le voir, voici nos informations. Donc Socket Layer pour rejoindre et nous obtenons ici notre utilisateur, et ici nous obtenons deux journaux de console parce que chaque fois que vous mettez à jour la page, nous obtenons cette E/S de socket à joindre parce que des abus se produisent. Nous vérifions notre utilisateur, nous l'obtenons à partir de la base de données. Il est maintenant disponible pour nous à l'intérieur de notre contrôleur. Donc, avec ce code, nous avons réussi à obtenir notre utilisateur à partir de la requête. Et maintenant, dans chaque action à l'intérieur du contrôleur via un circuit, un fil, nous avons cet utilisateur disponible rapidement. 31. Obtenir des colonnes: Dans cette vidéo, nous commençons par implémenter nos colonnes. Et je pense que c'est une bonne tâche que vous essayiez de la mettre en œuvre vous-même. Que voulons-nous mettre en œuvre ? Un top ? Nous avons notre conseil d'administration et nous sommes déjà cotés sur notre client et nous l'avons implémenté sur le backend et sur le client. Nous devons maintenant implémenter des colonnes. Pourquoi avons-nous besoin de colonnes ? Cela place vraiment à l'intérieur d' un tableau où nous stockerons les tâches et nos utilisateurs peuvent créer des colonnes à l'intérieur du tableau, ce qui signifie en fait que la colonne doit appartenir aux utilisateurs. Nous devons donc utiliser à l'intérieur la 3D mais aussi la carte AT, car notre colonne ne peut pas exister sans tableau et c'est y. Voici trois niveaux de difficultés pour vous. Tout d'abord, si vous voulez le niveau le plus difficile, mettez simplement la vidéo en pause maintenant et implémentez sur le festival backend un modèle pour la colonne, puis tapez pour la colonne, puis une méthode get pour obtenir une liste de les colonnes de notre tableau si vous voulez l'essayer au deuxième niveau. Avec mes conseils, voici quelques conseils car l'ensemble nos types de services doit créer, comme nous l'avons fait avec board. Nous devons créer ici la colonne et nous avons besoin ici d'une interface pour la colonne et également d'une interface pour le document de colonne. Ce sera donc super similaire à notre tableau. Ensuite, dans notre serveur, nous voulons créer une nouvelle route. Et ici, nous aurons des tableaux API apt-get, board AT comme ici, des colonnes slash. Et il s'agira d'une requête GET pour obtenir toutes les colonnes de ce port spécifique. Et nous avons vraiment besoin de cette quantité sur notre parcours. Dans d'autres cas, nous ne savons pas pour quel tableau nous devons obtenir nos colonnes. Pour cela, nous devons implémenter dans votre contrôleur, qui est le contrôleur de colonnes, et nous devons implémenter à l'intérieur de la méthode, get columns, comme nous l'avons ici à l'intérieur. Je m'ennuie. Et ils l'ont fait, c'est que nous voulons obtenir toutes nos colonnes ce stade AD de la base de données. Donc, si vous voulez essayer vous-même, mettez la vidéo en pause maintenant. Et maintenant, la variante la plus simple, nous allons l'implémenter ensemble. Et nous commençons ici. Tout d'abord, de nos types. Ici, nous voulons créer un nouveau type, qui sera column dot interface ab.js. Et en fait, je veux copier-coller complètement notre tableau car il sera super similaire. Nous avons donc ici notre interface et notre colonne de données. Et de quoi avons-nous besoin dans notre colonne ? Tout d'abord, nous avons besoin d'un nom, ce qui signifie que le titre est complètement valide, aura également ici créé et mis à jour à. Et nous avons ici UserID parce que c'est l'ensemble. Nous pouvons avoir besoin d'informations sur la personne qui a créé cette colonne spécifique. Ensuite, nous voulons avoir une référence à notre conseil d'administration. C'est là que nous avons un tableau AT. Et il s'agit du même type de schéma ID d'objet, tout comme nous l'avons ici en haut pour notre utilisateur. Et maintenant, au lieu de notre document de tableau, nous voulons créer notre document de colonne et nous sommes étendus ici document et notre interface de colonne que nous venons de créer. Et maintenant, il est temps de créer notre modèle. Nous avons donc ici le modèle de Bohr, maintenant nous avons besoin d'un modèle de colonne. Nous avons donc ici une planche qui déchire. Maintenant, nous devons créer ici la colonne Ts. Et en fait, je vais copier-coller tout ce qui se trouve notre tableau parce que c' est super similaire. Donc, ce que nous avons ici, nous construisons ici un schéma de colonne, et ici nous utilisons un document de tableau NADH, mais à la place un document de colonne que nous venons de créer ici, document de tableau en haut que nous pouvons supprimer. Ici, nous savons que nous avons notre titre, nous avons notre utilisation 3D, c'est obligatoire. Et le dernier ici sera notre ID de tableau, qui est un ID d'objet de type, et il est également requis, et c'est notre modèle de document de colonne de type et le nom est column. Et voici notre schéma de colonnes. Comme vous pouvez le voir, il est très similaire à notre tableau. Et en fait, de nombreux modèles que vous créerez dans vos futures applications ressembleront vraiment à ceci. Nous avons donc réussi à créer notre type et notre modèle. Maintenant, nous devons générer et utiliser à l'intérieur de nos niveaux de service. Et ici, je veux copier-coller cette ligne avec un ID de carte Pi. Et ici, nous avons une barre oblique get on exactement cette route parce que comme je l'ai dit, nous voulons obtenir nos colonnes pour ce point spécifique. Et ici, nous devons utiliser notre middleware car cette requête ne concerne que les utilisateurs connectés. Et ici, nous n'avons pas besoin d'utiliser contrôleur de notre carte qui voudrait un nouveau contrôleur ici, contrôleur de colonnes, et ici nous pouvons le nommer, par exemple, obtenir des colonnes, mais ne pas avoir de contrôleur de colonnes haut. Donc, ici, je veux copier coller le contrôleur de la carte ici en haut et le nommer contrôleur à deux colonnes De contrôleurs slash colonnes. Et notre dernière étape ici sera de créer un nouveau contrôleur, appelé colonnes. Et c'est le contrôleur qui gère toutes nos actions pour les colonnes. Nous sommes donc en train de créer nos colonnes points ts. Et ici, je veux juste copier-coller une méthode de nos tableaux car elle est super similaire et ce sont de bons tableaux. Revenons donc à l'intérieur escaliers de nos colonnes et collons cette méthode ici. Tout d'abord, ce n'est pas s'ennuyer, mais obtenir des colonnes. Et nous avons besoin ici d' une interface de demande exprimée car nous voulons vérifier l'utilisateur actuel. Et là, nous avons besoin de notre prochaine fonction. Et nous devons également entrer ici sur la réponse de l'express. Et ici, comme toujours, nous recherchons CurrentUser. Nous lançons pour 01 si ce n'est pas le cas. Mais maintenant, nous devons utiliser le modèle non ennuyé, mais plutôt la colonne du modèle. Nous allons donc entrer ici sur le modèle de colonne supérieure à partir duquel nous venons de créer. Et ici, nous écrivons des modèles slash column. Et maintenant, nous attendons de faire une demande de recherche de modèle de colonne. Mais au lieu de trouver nos colonnes, nous obtiendrons ici un tableau par ID utilisateur. Nous voulons les trouver auprès de notre conseil d'administration AD. Dans ce cas, nous obtiendrons colonnes malchanceuses pour ce tableau spécifique. Et nous obtenons ces informations à partir de request point, params point, et ici nous avons l'ID de la carte. Donc, ici, nous obtenons un tableau de nos colonnes et nous voulons simplement répondre au client avec ce tableau. Et en fait, c'est fini. Allons voir si ça fonctionne. Je passe au back-end. n'y a aucune erreur. Donc maintenant je veux faire une requête get, et ici j'ai notre API, mais au lieu de slash api slash boards, je veux avoir ici slash puis NAD. C'est pourquoi, depuis notre application, je souhaite copier le d de notre tableau pour le coller ici dans Postman. Nous faisons une requête GET et appuyons sur Envoyer. Comme vous pouvez le voir, où je reçois un message non autorisé, ce qui signifie tout d'abord, je dois me connecter. C'est mon utilisateur, je suis connecté et je reçois un jeton. Copiez-collez ce harcèlement et réessayez. Voici une requête GET pour un point sans base slushy. Voici AD et ils ont manqué ici des colonnes slash. Il s'agit d'une requête get, et voici notre en-tête. C'est de la bière. Et puis je mettrai mon jeton que je suis taper maintenant envoyer et nous recevons notre réponse, qui est un tableau vide. Et en fait, c'est tout à fait correct car nous n'avons créé aucune colonne dans notre base de données. Mais pour le rendre sûr et propre, créons-les à partir de la console afin que nous puissions vérifier si cela fonctionne vraiment pour les désactivés, sautez dans la console et essayez docker exec moins 18 MongoDB, Mongo , comme nous l'avons fait précédemment pour notre conseil d'administration. Nous devons maintenant utiliser notre base de données L Trello. Bande-annonce tellement utile et maintenant je veux insérer un enregistrement dans notre collection de colonnes. C'est pourquoi ici nous pouvons écrire des colonnes de points db, des insertions de points, et ici à l'intérieur nous voulons lancer tout d'abord au titre, par exemple, la première colonne. Donc ici, nous devons fournir un ID utilisateur, et ici nous devons écrire la date est un objet contenant une chaîne que nous devons prendre à partir de la requête. Et enfin, il y aura notre tableau AT, et c'est aussi un identifiant d'objet et à l'intérieur de la chaîne. Donc ennuyeux le D. Nous le savons déjà, nous pouvons simplement le prendre ici auprès du facteur et ils le mettront ici. Mais notre utilisateur AT, nous pouvons vérifier à l'intérieur de notre backend. Comme vous pouvez le voir ici, j'ai toujours ce journal de console avec notre utilisateur. Et voici le D de mon utilisateur avec lequel je suis enfermé. Ici, dans notre identifiant utilisateur, je vais coller le hachage de mon utilisateur. Appuyons sur Entrée. Et comme vous pouvez le voir où en est inséré un. Nous pouvons maintenant vérifier si c'est correct. Donc, db dot columns, dot find et juste des crochets ronds. Comme vous pouvez le constater, voici notre réponse. Voyons maintenant dans Postman, si cela fonctionne, je clique ici envoyer à nouveau, et nous entrons dans le tableau, un seul objet. Voici notre nom d'utilisateur et notre titre AD Boyd AD, ce qui signifie que nous avons créé avec succès notre modèle de colonne et la première demande pour obtenir toutes les colonnes pour cette liaison spécifique. 32. Créer une colonne avec des websockets: Dans la vidéo précédente, nous avons créé avec succès une méthode pour obtenir une liste de nos colonnes pour le tableau. Dans cette vidéo, nous allons nous concentrer sur la partie back-end de la création de notre chronique. Et nous ne le ferons pas de la manière habituelle car nous n'utiliserons pas ici HTTP. Nous allons le créer avec socket en devons-nous créer des colonnes avec socket ? Parce qu'en fait c'est le cas où Woburn avertit toutes les personnes qui consultent notre forum actuel de la création de la nouvelle colonne. Dans ce cas, tous les utilisateurs avec ce tableau ouvert unique verront directement notre partie nucléée. Alors, comment devons-nous faire cela ? Et nous commençons ici à l'intérieur d'un serveur source. En fait, ils savaient déjà comment nous faisons les choses. Nous avons ici votre propre connexion et voici notre prise. Ici, nous devons réfléchir dans votre prise. Pourquoi est-ce que c'est ? Parce qu'en fait, nous allons déclencher, créer suffisamment de colonne sur l'un des clients, ce qui signifie en fait à l'intérieur de l'application Angular. Dans la vidéo suivante, nous allons créer un pod frontal avec le formulaire pour créer une colonne. Ensuite, nous émettrons un événement pour notre socket IO. C'est pourquoi nous devons souscrire à cela au milieu. Notre première étape sera de créer ici un nouvel événement. Et en fait, ici, je veux créer trois événements pendant ce temps, parce que nous avons une opération asynchrone, nous commençons à créer une colonne, puis nous avons du succès et de l'échec. Et ils ont dit que nous ne pouvions pas vraiment obtenir d'erreurs à partir de l'E/S du socket. C'est pourquoi il est tout à fait logique d'organiser tous nos événements comme Start success and failure. Et dans le cas d'une adhésion au conseil d'administration, nous n'en avons pas besoin. Nous avons juste besoin d'un seul événement parce que ce n'est pas une opération synchrone avec succès ici, mais nous l'avons avec créer une autre colonne. C'est ici, appelons-le grade des colonnes. Et c'est une chaîne, et nous pouvons la nommer colonnes deux-points, puis la créer. Vous pouvez voir que j'utilise la même notation que ici en haut, nous avons une entité et elle est au pluriel, et puis notre verbe, ce que nous faisons maintenant ici nous pouvons copier-coller cette ligne deux fois parce que nous devons créer ici, les colonnes créent le succès et les colonnes créent l'échec. Ici sur la droite, nous aurons les colonnes créer un succès avec CamelCase et ici la colonne créer un échec. Nos événements sont donc prêts et nous pouvons maintenant ouvrir le sac de nos niveaux de serveurs. Et ici, nous voulons écrire un socket de plus. Donc ici, nous voulons réagir sur les événements de socket maintenant qu'ils ne le font pas. Et ici, nous avons la note des colonnes, et il y a un deuxième paramètre avec lequel nous obtenons des données avec lesquelles nous ne nous soucions même pas de ces données. Maintenant, à l'intérieur, nous voulons utiliser nos colonnes de contrôle et nous l'avons également créé, mais nous n'avions aucune information sur les sockets à l'intérieur. C'est ici que nous voulons créer une nouvelle méthode appelée Create column. Et nous passons exactement la même chose que nous avons fait ici à l'intérieur du live board, par exemple, c'est une donnée commune de votre socket coma, dans ce cas, dans tous les endroits où le code et tous les paramètres sont écrits dans de la même façon. C'est pourquoi il est plus facile de comprendre notre application. Il est maintenant temps de créer cette section dans le contrôleur. C'est ici que nous allons revenir dans les colonnes de nos contrôleurs. Ici, nous avons des colonnes. Et en fait, écrivons ici à partir de zéro notre nouvelle méthode. Nous avons donc ici notre constante et c'est créer une colonne. Et c'est une fonction asynchrone et à l'intérieur de laquelle obtient exactement tout ce que nous avions précédemment. Donc tout d'abord, c'est un fil et c'est du sérum. Deuxièmement, nous avons ici notre socket, le socket, et le dernier est data. La question est donc quelles données obtiendrons-nous pour créer une colonne ? Nous avons besoin de deux choses. Tout d'abord et le nom de la colonne. Et deuxièmement, notre carte d'identité. Ce sont les informations que nous avons déjà écrites dans notre modèle. C'est pourquoi nous avons ici le corps D et c'est une chaîne. Et deuxièmement, nous avons ici le titre. C'est également une chaîne. Et juste pour vous rappeler au moment où vous êtes nos deux entrées ici, socket, vous devez savoir comment l'entrer depuis l' interface de type socket, pas depuis le socket IO car nous devons utiliser une propriété utilisateur dans cette interface. Et maintenant, à l'intérieur, nous avons try-catch, comme toujours, parce que nous faisons ici une opération asynchrone et à l'intérieur de la cage, ce que nous voulons faire n'a pas accès au suivant, mais nous pouvons émettre quelque chose que vous, par exemple, ici je veux écrire socket Datta meet et nous sommes lancés à l'intérieur de nos événements de socket E et M point, et voici l'échec, donc les colonnes créent un échec. Et deuxièmement, je veux donner un message en retour. Mais le problème principal est que cette Sarah est inconnue et c'est tout à fait normal parce que nous sommes à l'intérieur, nous ne pouvons pas savoir ce qu'est Sarah. C'est pourquoi si nous avons besoin de lire un message d'erreur, nous devons essayer quelque chose comme ça. Nous voulons donc lire notre message d'erreur et vérifier que notre flèche doit être une instance d'une ère. Dans ce cas, nous pouvons lire ici le message d'erreur. Et dans un autre cas, nous voulons simplement stringifier notre erreur ici en tant que deuxième paramètre, nous pouvons fournir un aperçu de notre message d'erreur, qui sera une chaîne. Dans ce cas, il s'agit du meilleur parent possible et dites TypeScript. Vous pouvez travailler avec une erreur inconnue dans catch. Mais voici le problème. Nous écrirons cette seule ligne dans chaque action lorsque nous recevrons une erreur et que nous voulons lire un message et nous l'utiliserons dans chaque image à l'intérieur de catch. C'est pourquoi je souhaite déplacer ce code pour l'aider. Et nous n'avons pas encore nos assistants. C'est pourquoi Insights Source. Créons des helpers point ds et sauvegardons cette méthode à l'intérieur. Ici, je peux créer une nouvelle méthode qui est d'obtenir un message d'erreur. Et nous obtenons ici notre erreur et elle est inconnue. C'est exactement ce que nous obtenons dans le catch butt back. Nous voulons obtenir une ficelle. Maintenant, je peux copier-coller complètement cette ligne et la coller ici. Vous n'avez pas besoin d'un message constant ici. Nous pouvons simplement renvoyer cette seule ligne. Comme vous pouvez le voir, c'est comme ça que ça ressemble. Nous obtenons ici une erreur inconnue, où une instance d'erreur de poulet et un message d'erreur bien écrit ou une chaîne de caractères. Et maintenant, à l'intérieur de notre escalier à colonnes, nous pouvons importer cette méthode. C'est pourquoi nous pouvons ici déstructurer, obtenir un message d'erreur et cela provient de nos assistants. Et maintenant, au lieu de cette ligne, nous pouvons écrire ici, obtenir un message d'erreur et ont été fournis à l'intérieur de notre ère. Et maintenant, cet assistant est super utilisable rapidement. Maintenant, nous devons écrire notre code dans Tribe. Donc tout d'abord, nous devons vérifier si Burlington ou non. Nous le faisons uniquement pour TypeScript parce qu'ils étaient bloqués ici à cause des IOU et notre intergiciel que nous avons construit précédemment. Mais ici, nous devons vérifier si put n'a pas d'utilisateur point socket. Et juste pour vous rappeler que cette interface de socket doit être notre interface et non pas de socket ion. Ici, à l'intérieur, nous pouvons émettre exactement la même chose. Voici donc la prise et la viande et ont été fournis à l'intérieur d'une prise. colonnes ENM d'événements créent un échec. Ici, à l'intérieur, nous pouvons simplement écrire la chaîne que l'utilisateur n'est pas autorisé. Donc, ce que fait cette ligne, nous envoyons un message à notre socket, ce qui signifie que nous avons un client et que ce client envoie un message, veuillez créer une colonne. Et puis soit ici à l'intérieur de la cage, ici à l'intérieur du CIF n' émettra qu'à un seul client qui nous envoie un message, ce message en retour. Et ce client peut écouter ce message et faire quelque chose en conséquence. Et après notre rencontre, nous pouvons simplement appeler ici un retour sans vouloir faire quoi que ce soit. Mais si nous avons un utilisateur socket, nous pouvons créer notre colonne. Essayons donc d'avoir une nouvelle colonne et pour la créer, nous devons utiliser un nouveau modèle de colonne. En fait, le monde du modèle de colonne avec l'inverse ici en haut. Nous pouvons donc l'utiliser ici. Donc pour créer une colonne, le modèle, nous devons fournir un aperçu, tout d' abord, un titre et c'est le titre du point de données. Deuxièmement, nous voulons fournir ici ID du tableau et c'est le tableau à points thêta AT. Voici toutes les informations de notre événement. Enfin et surtout, notre nom d'utilisateur. Il s'agit d'une inflammation due à l'ID de point utilisateur socket point. Nous avons donc créé avec succès un nouveau numéro de colonne, nous devons l'enregistrer dans la base de données. C'est par ici. Revenons à notre chronique sauvegardée car nous voulons également arriver ici NAD. Et nous attendons notre nouvelle colonne qui a été créée dot save. Nous attendons de l'enregistrer dans la base de données. Et après cela, nous voulons envoyer ces informations non seulement à notre socket. Nous voulons informer toutes les personnes, tous nos clients qui sont abonnés à notre forum. qui signifie en fait que nous envoyons ce message, pas seulement une socket vectorielle, nous envoyons ce message à un grand nombre de personnes. Et nous pouvons écrire ce code avec socket ici comme ceci. Donc, ce n'est pas le point deux et k à l'intérieur, nous fournissons le point de données AD. Et juste pour vous rappeler ici avant l'intérieur des forums où nous avons écrit du code de jointure avec John Boyd, écrit ici, socket join, data, port ID. Ici. Nous avons maintenant une chambre avec un D de notre pension. Et maintenant, nous pouvons rencontrer quelques données pour tous les utilisateurs qui se trouvent dans cette pièce avec I2. Voici notre tableau de données AT point m meet et ont été fournis à l'intérieur de nos événements socket ENM, et dans ce cas, ce sera un succès. C'est la colonne y qui crée le succès. Ici, nous voulons également fournir toutes les informations de notre colonne enregistrée. Et en fait, c'est la même chose que l'utilisation de HTTP, mais ces informations seront propagées simultanément à tous nos utilisateurs s' ils sont abonnés à ce forum spécifique. Maintenant, ici, sans aucune logique client difficile, je veux tester que cela fonctionne. C'est ici, par exemple, après notre i2, je veux écrire une colonne enregistrée dans le journal de la console afin que nous puissions vérifier si nous venons ici. Maintenant, après cela, je veux sauter dans source de nos clients, l'application, le tableau, composants, le HTML du tableau ici, je veux juste pour tester pour créer un bouton a été cliqué. Nous allons donc cliquer sur le bouton, et nous avons ici une fonction de test. Maintenant, lorsque nous cliquons sur le bouton, je veux participer à cet événement. C'est ainsi que nous avons notre fonction de test et à l'intérieur je veux écrire ce point de service de socket et de viande et ont été fournis à l'intérieur de notre événement. Et dans notre cas, il s'agit de columns create et il y a un second paramètre que nous devons fournir ici un objet avec pour le thé, qui sera cet identifiant de tableau. Et deuxièmement, le titre, par exemple, pour cette seule ligne, doit indiquer à notre backend que nous voulons créer cette colonne spécifique pour cette partie. Nous pouvons maintenant passer au backend et vérifier s'il fonctionne. Comme vous pouvez le constater, nous n' avons aucune erreur dans l'API. Ouvrons maintenant un navigateur et rechargeons la page. Et nous sommes ici sur notre page de tableau unique. Ici, il y a un bouton. En fait, j'ai oublié d' écrire le texte à l'intérieur du bouton. Alors écrivons ici un test afin que nous puissions au moins voir un bouton puis cliquer une fois sur le bouton. Maintenant, sautons à l'intérieur, nous a fait signe. Et en fait, nous recevons la colonne du dernier message enregistré, ce qui signifie que notre backend a reçu notre requête. Et cela se produit dans nos niveaux de service avec ce code où nous sommes abonnés à la note de colonne. Et puis du côté où Colin, notre contrôleur de colonnes crée une colonne et à l'intérieur de cette fonction, nous vérifions d' abord que nous sommes verrouillés. Ensuite, nous générons une nouvelle colonne avec les données que nous avons obtenues lors de l'événement. Ensuite, nous avons enregistré cette colonne et nous envoyons le message à tous nos utilisateurs abonnés à ce stade. Nous allons tester ce code en profondeur dans la prochaine vidéo. Mais comme vous pouvez le voir, voici ma colonne enregistrée constamment verrouillée. Et c'est exactement ce que nous voyons ici dans le journal de la console, ce qui signifie en fait que nous avons implémenté avec succès notre travail entre le socket sur le client et le socket sur le backend. Et en ce qui concerne la création de nos colonnes. 33. Obtenir des colonnes: Dans la vidéo précédente, nous avons réussi à préparer le backend substantif, créer un hors de notre colonne. Mais avant d'implémenter formulaire en ligne pour créer une colonne sur le client, nous devons au moins créer notre page de tableaux car pour instant elle est complètement vide et affiche également nos colonnes. C'est pourquoi la première chose que je souhaite faire est créer sur notre client l' interface pour le cône, car nous ne l'avons pas encore. C'est pourquoi nous devons défendre les ensembles, sources et les types partagés d'applications. Et ici nous devons créer une interface de colonne Ts. Et parlons de notre nouvelle interface, qui est une interface en colonne. Et à l'intérieur, tout d'abord, nous obtenons NAD, qui est une chaîne. Deuxièmement, au titre, qui est une chaîne. Et enfin je l'ai créé, qui est une chaîne. Et en fait, nous obtenons ici une tête mise à jour, qui est aussi une chaîne. L'étape suivante consiste à créer un service avec la méthode permettant d'obtenir toutes les colonnes de ce tableau spécifique. Et en fait, nous n'avons pas un tel service ici. Nous avons juste le service Boards, qui est un service sans état avec une méthode comme obtenir des tableaux, s'ennuyer, créer un tableau et ainsi de suite. Nous devons faire exactement la même chose. Mais pour les colonnes, c' est pourquoi je veux créer ici des colonnes, des points de service. Et comme vous pouvez le voir où dans AP partagé et non dans le tableau. Maintenant voici, tout d'abord, trait de biomasse injectable et une deuxième boucle pour exporter notre classe, qui sera notre service de colonnes. Maintenant à l'intérieur, nous devons vous présenter le client car nous ferons des demandes pour obtenir une liste de nos colonnes. C'est par ici. Tout d'abord, nous devons écrire un constructeur. Et voici un HTTP, qui est un client HTTP. Cela suffit. Nobu doit créer la méthode get columns, qui nous livrera sous la forme de colonnes depuis le backend et sur le backend nous avons déjà créé cette méthode. C'est ici que, tout d' abord, nous devons obtenir ici un identifiant de tableau. Il s'agit d'un identifiant unique permettant d'obtenir une liste de colonnes pour ce tableau spécifique. Et de retour, nous obtenons un tableau de nos colonnes, évidemment en tant qu'observable, parce que c'est toujours à partir de HTTP où se trouvent les observables, c'est là que l'interface des colonnes est observable et n' oubliez pas qu'il s'agit d'un tableau. Maintenant, à l'intérieur, nous faisons exactement la même chose que nous l'avons fait à bord. Donc, si vous ne voulez pas tout retaper, vous pouvez simplement copier-coller, par exemple, vous ennuyer, et vous êtes prêt à partir. Le code est très similaire. Donc ici tout d'abord, nous voulons créer une URL, et ici nous voulons fusionner tout d'abord, notre barre oblique URL de l'API DOD de notre environnement. Ici, nous avons nos tableaux slash n. Ici, nous voulons injecter des colonnes slash ID de tableau. Et après cela, il suffit de faire une requête HTTP GET. C'est pourquoi je veux renvoyer ce http.get et nous devons le fournir là où obtenir notre tableau d' interface de colonne. Et ici, nous fournissons notre URL. Et avec ce code, nous obtiendrons nos colonnes pour un tableau spécifique. Il est maintenant temps d'utiliser le service intégré à notre composant. Mais pour cela, nous devons sauter à l'intérieur notre app board, board molecule. Et l'entrée ici à l'intérieur des fournisseurs se trouve dans votre service et ce sera notre service de colonnes. Maintenant, nous pouvons sauter à l'intérieur des composants, de la carte, du composant de la carte et récupérer ces données ici. Maintenant, dans nos données de récupération, nous voulons récupérer nos colonnes. Mais pour ce constructeur interne, nous devons injecter ce service. Et c'était le service de colonnes, qui est le service de colonnes que nous venons de créer. Maintenant, nous pouvons sauter dans nos données de récupération et utiliser ici les colonnes get du service this.com. C'est exactement la méthode que nous venons de créer. Et ici, à l'intérieur, nous fournissons maintenant, à ce stade, nous avons déjà cette information. Mais ici, nous voulons faire exactement la même chose, mais nous ne voulons pas enregistrer ces colonnes directement ici dans le composant. Nous avons déjà créé notre service de conseil d'administration pour cela. À l'intérieur, nous pouvons enregistrer toutes ces informations. C'est pourquoi nous pouvons écrire ici, Abonnez-vous et nous récupérons nos chroniques. Et ce que nous voulons faire avec les colonnes dont nous avons besoin ici dans votre méthode, ce service de carte, le DOD, par exemple, définit des colonnes. Et à l'intérieur, nous allons lancer notre liste de colonnes. Et maintenant, nous avons juste besoin d' implémenter cette méthode ensemble de colonnes. C'est ici que nous allons ouvrir Boards Services, notre service conseil d'administration. Et nous faisons exactement la même chose que nous l'avons fait ici. Nous avons dit « bord ». Voici donc des colonnes définies. Nous obtenons notre tableau de colonnes, qui est un tableau d' interface de colonnes. Ici, nous avons un grand vide et nous avons besoin d'un nouveau flux de données. C'est ici que je peux copier, coller notre flux de boss et le nommer flux de colonnes. Dans ce cas, chaque endroit de notre application, si nous utilisons ce forum, peut s'abonner et obtenir la liste des colonnes que nous avons actuellement. Et en fait, ce sera un sujet de comportement du tableau d' interface de colonne. Et nous n'avons pas besoin de fournir ici maintenant car par défaut, nous pouvons simplement fournir ici un tableau vide. Et maintenant, dans notre méthode set columns, nous pouvons simplement appeler ce point columns point suivant. Et nous fournissons des informations sur les colonnes qui ont été préchargées. Revenons maintenant à notre composant et arrêtons ce flux. C'est pourquoi ici, en haut, nous avons déjà ce tableau, dollar, qui est un flux. Et maintenant nous devons créer des colonnes. Dollar, qui est une chaîne pour nos colonnes, et c'est un observable pour le tableau d'interface de colonne. Et maintenant, nous pouvons écrire directement après ce point, ces colonnes de points. Et ici, nous utilisons ce point de service de carte. Et voici nos chroniques. Nous n'avons pas besoin ici d'un filtre booléen car il s' agit simplement d'un tableau. Il est vide ou plus ancien, le champ avec nos colonnes, l'idée principale est que nous n'avons pas de flux et que nous pouvons les utiliser directement dans le code HTML. Mais ici, je veux vous montrer une variante encore meilleure, car en fait, nous avons déjà deux flux plus tard. Nous en aurons une de plus pour les tâches, ce qui signifie que nous avons trois sources de données différentes et que nous voulons afficher notre page lorsque toutes les sources de données seront remplies. C'est pourquoi nous pouvons réécrire ce code un peu différemment. Nous pouvons écrire ici ces données par points avec plus grand. Et c'est une notation spéciale que j'utilise. Il s'agit d'une variante très populaire, vous permet de gérer vos données pour votre composant. En général, vous avez une page contenant de nombreuses sources de données et vous souhaitez les combiner en un seul flux. Ensuite, vous ne pouvez exécuter la page entière que lorsque vous remplissez tous les flux. Et nous remplirons le flux avec les données lorsque nous vous intégrerons dans vos données. C'est là que je veux écrire les derniers combinés et ont été fournis dans un tableau de streams et de festivals ici nous pouvons copier cette ligne avec le flux de planches et simplement la coller ici. Et après cela, nous prenons les colonnes de ce service de port et nous les collons également ici. Évidemment, nous devons directement ici virgule, car il s'agit de deux flux différents. L'idée principale est de combiner les flux. Et ici, nous voulons faire cela avec pipe et map, parce qu'en fait nous obtenons ceci sous forme tableau et nous voulons un objet ici, c'est y. Ici, à l'intérieur de map, nous pouvons directement la structure, tout d' abord, un tableau et ici l'ordre est important. Deuxièmement, nous avons ici des colonnes. Ensuite, nous voulons renvoyer les données dans un autre format en tant qu'objet. Et voilà que nous revenons tout d'abord à bord et ensuite, nos colonnes. Alors, qu'est-ce que ce truc fait pour nous ? Nous obtenons donc ici des données, ce qui signifie que nous n'avons pas besoin de deux flux ici. Nous pouvons maintenant créer ici et utiliser des données de flux. Et voici les données complètes de notre carte de composants. Nous disons ici qu'il s'agit d'un observable de l'objet. Et tout d'abord, nous avons ici un tableau, qui est une interface de tableau. Et deuxièmement, nous obtenons ici nos colonnes, qui sont un tableau d' interface de colonnes. Et maintenant nous pouvons supprimer le dollar du tableau et le dollar des colonnes, nous n'en avons plus besoin. Le point principal est que notre logique était de récupérer des données et ces données étaient définies à l'intérieur du service de mots. s'agit simplement d'une combinaison de deux flux pour cartographier ces données pour notre composant. La question est donc de savoir comment nous allons utiliser ces données dans notre code HTML. C'est là que je veux tout supprimer et supprimer également ici le test en bas. Nous n'en avons pas besoin du tout. Maintenant, je veux écrire un marqueur pour notre page. Tout d'abord, nous voulons afficher la barre supérieure de notre application. Il y est déjà. Après ça, dirigeons le tableau. Nous aurons donc ici un tableau de classe div, et voici une astuce que nous utilisons ici dans GE, mais nous fournissons des informations sur le dollar des données, c'est notre dernière synchronisation combinée en tant que données, et c'est tout. L'idée principale est que nous ne travaillons plus avec les flux internes. Nous utilisons les données en tant que propriété locale. Et cela créera pour nous une propriété locale juste à l'intérieur de cette div. Maintenant, tout d'abord, nous voulons créer notre conteneur d'en-tête de tableau. C'est là que se trouve le conteneur d'en-tête de tableau de classe div. Et fermons cette division. Mais nous allons lancer le dernier Insight est un formulaire en ligne pour mettre à jour notre tableau. C'est ici que je vais simplement écrire un lien de formulaire en ligne, afin que nous ne l'oubliions pas. Après cela, nous allons rendre notre div avec les colonnes de classe et à l'intérieur je veux faire et G pour la boucle pour chaque colonne. C'est y ici, class column puis G4. Et ici, nous pouvons écrire la colonne principale des colonnes de points de données. Comme vous pouvez le voir ici , nous n'avons pas besoin canaux asynchrones car nous résolvons notre propriété data et nous récupérons ces données à l'intérieur, et ces données seront automatiquement mises à jour si le Le flux de colonnes est également mis à jour. Ici, fermons notre colonne et ensuite nous voulons afficher le titre de la colonne de notre classe div. Maintenant, à l'intérieur, nous allons encore nous amuser. C'est ici sous forme de ligne pour la mise à jour de la colonne. Et après cette colonne, nous en aurons une autre sous forme de ligne. Nous aurons donc ici un formulaire en ligne pour créer une colonne. Il s'agit donc de notre balisage de base. En fait, nous n'avons pas beaucoup rendu ici, mais au moins nous affichons ici en colonnes, ce que nous obtenons à partir de nos données. Allons voir si ça fonctionne. Je vais accéder à la console et une erreur s'affiche. Epitope n'est pas disponible pour nous, nous devons donc l'importer dans notre module de carte. Donc, ici, dans les entrées, nous pouvons simplement ajouter un module de barre supérieure. Comme vous pouvez le voir maintenant, je n'ai pas d'erreur, alors rechargeons la page. En fait, elle est déjà là. Nous pouvons voir notre belle barre supérieure. Voici quelques espaces réservés et ce sont déjà nos colonnes. Et oui, nous n'avons pas fait de tendance au titre juste pour les tests, nous pouvons le faire très rapidement. Revenons à l'intérieur de notre tableau, et voici le titre de notre chronique. Donc au lieu d'un formulaire en ligne pour mettre à jour la colonne, nous pouvons simplement afficher ici le titre du point de la colonne. Je recharge la page ici, nous obtenons la première colonne et le formulaire. Il s'agit exactement de ces deux colonnes qui ont déjà été créées. Tout d'abord, dans la console de MongoDB. Et deuxièmement, dans la dernière conférence où nous avons créé avec l' événement, notre nouvelle chronique. Et ils vous recommandent vivement d'utiliser les dernières données combinées pour combiner de telles données dans toutes vos applications. Cela est extrêmement efficace et évolutif. 34. Créer un formulaire de colonne: Dans les vidéos précédentes, nous avons réussi les colonnes d'ID d'événement pour notre tableau et nous pouvons maintenant continuer avec Créer un formulaire pour notre colonne. Et juste pour vous rappeler, sur le back-end, nous avons déjà implémenté toute la logique pour créer une colonne en utilisant socket a yarn, et maintenant nous n'avons plus qu'à l' implémenter sur le client. Et tout d'abord, je voudrais commencer par un peu de HTML. Et en fait, nous sommes déjà préparés formulaire en ligne pour créer une colonne. C'est exactement là que nous voulons utiliser notre entreprise intérieure et nous l'avons déjà. Nous avons juste besoin de fournir des informations correctes. Fermons ici notre formulaire intérieur au lieu du message. Et maintenant, que devons-nous donner ici ? Tout d'abord, nous devons définir une classe. Et juste pour vous rappeler il s'agit d'une classe parente avec des styles que nous remplaçons pour notre formulaire en ligne Dans ce cas précis, notre classe sera un formulaire de création de colonne. Ensuite, nous voulons définir un texte par défaut. C'est ce que nous verrons par défaut, et c'est le texte, au moins ici, nous devons rendre un bouton pour soumettre ce formulaire. C'est pourquoi nous pouvons écrire ici que nous voulons sa propriété button. Et il est vrai qu'après cela, nous voulons fournir notre texte de bouton, et ce texte sera au moins. Nous voulons donc modifier notre espace réservé par défaut. C'est pourquoi nous pouvons écrire ici un espace réservé en entrée, et ici nous pouvons écrire un nom de colonne d' ajout. Et last but not least est bien sûr ici gérer submit. Et il s'agit d'un rappel où nous obtiendrons le titre de notre colonne que nous voulons créer. Donc, ici, je veux ajouter une nouvelle méthode qui s'appelle Créer une colonne, puis un site où obtenir notre titre via un événement. Et la dernière chose que nous devons faire, nous devons créer cette fonction de colonne de notes dans notre tableau. Ici, nous obtiendrons un titre en tant que souche de notre forum intérieur. Et voici vide à l'intérieur et ils veulent juste se connecter à la console ici, créer une colonne et voir un titre. Rechargeons la page et voyons comment elle fonctionne. Et en fait, nous recevons un message. Le formulaire en ligne n'est pas un élément connu de notre module. C'est là que nous devons revenir à l'intérieur de notre module de carte. Et ici, dans les entrées, nous voulons entrer notre module de formulaire en ligne. Comme vous pouvez le voir dans le navigateur , nous avons maintenant un nouveau bouton. Nous pouvons au moins cliquer sur ce bouton. Et nous voyons maintenant notre entrée qui est stylisée et notre bouton au moins. Et en fait, si vous vous demandez où viennent tous les styles, comme il vous l'a dit précédemment, nous stylons tous les éléments de formulaire en ligne avec notre cas parent et dynamique ici il a été créé sous forme de colonne. C'est ici que vous pouvez voir les styles créer un formulaire de colonne, puis la modification du conteneur de formulaire en ligne. C'est pourquoi notre formulaire est si partageable. Et maintenant vérifions-nous que nous pouvons ajouter une nouvelle colonne. Ici, je tape quelque chose, je frappe au moins. Et à l'intérieur de la console, nous pouvons voir notre colonne de crédit et notre titre de la colonne, ce qui signifie que maintenant nous pouvons émettre un événement pour notre socket, pour notre back-end, mais je veux vraiment le faire mieux. Je souhaite préciser notre contribution. C'est pourquoi ici, dans de tels types partagés, nous avons tableau et colonne, mais je veux créer une entrée. Qu'est-ce que cela signifie ? Tout comme nous avions à l'intérieur de nos types de hiboux, nous avions ici une demande de connexion et une demande enregistrée, qui est essentiellement un corps de notre demande. En général, nous voulons soit la nommer demande, soit vous voulez une entrée de mot. C'est ainsi que dans les types partagés, nous pouvons créer notre entrée de colonne ou vous pouvez également la nommer demande de colonne. Disons donc qu'il s' agit de l'interface d'entrée de colonne Ts, et que ce sont les données que nous devons fournir pour le back-end afin d'envoyer notre événement. Et ici nous voulons le spécifier dans une interface. Donc, dans l'ensemble de l'application, nous saurons comment nous créons votre colonne. C'est ici, appelons-le Interface d'entrée de colonne et les principales différences, ce n'est pas calmement l'interface, c'est une entrée. C'est pourquoi c'est un corps. Et voici notre titre, qui est une chaîne. C'est ce que nous devons fournir pour notre back-end. Et deuxièmement, un ID de tableau, qui est également une chaîne. Et maintenant, nous pouvons utiliser cette interface d'entrée dans notre composant de carte. Donc ici, au lieu du journal de la console, nous pouvons créer notre entrée de colonne et nous savons que le type est ici, entrée de colonne et ici nous devons maintenant fournir toutes les valeurs possibles. Dans notre cas, il ne s'agit que d'un titre. Et deuxièmement, le conseil, l'AD et le corps. Avons-nous à l'intérieur de ces ID de port de point ? Et comme vous pouvez le voir ici, nous avons un type correct, et maintenant nous devons le lancer dans notre socket IO. C'est ainsi que cette colonne service point crée une colonne. Et en fait, nous n' avons pas de méthode create column. C'est pourquoi nous devons le créer. Je souhaite accéder à nos colonnes sur les services partagés. Et ici, nous avons juste reçu la colonne. Ici, nous voulons créer un cône. Mais cette méthode ne fera rien avec ce GTP. Il utilisera notre socket IO, et c'est tout à fait normal, alors que le dernier, toutes ces méthodes dans nos services et nous appelons simplement nos services. C'est ici, créons une méthode de création de colonne et nous obtenons ici notre entrée de colonne. C'est vraiment sympa qu'on ait créé une interface ici. C'est là que nous pouvons le réutiliser et ce sera notre interface de saisie de colonne et nous serons annulés. Et juste pour vous le rappeler ici avec HTTP, récupérez toujours un observable. Mais en couche socket, cela ne fonctionnera pas comme ça. Avec socket, vous disposez d'un flux de données unique. C'est ici que la seule chose que nous voulons faire est de déclencher notre émission. Mais pour cela, nous devons injecter ici notre service de socket, et c'est notre service de socket que nous avons créé et nous pouvons maintenant l' utiliser dans cette méthode. Donc ce point, point de service socket et rencontre, et nous devons fournir ici un nom. Voyons d'abord si nous avons un tel nom dans nos types partagés, nous avons des événements de socket, et ici nous n'avons rien. Et en fait, nous pouvons ouvrir à l'intérieur du back-end cette énumération parce que les types internes ont également des événements de socket. Et ici, nous avons la création de colonne, succès et l'échec, et c'est exactement la même chose. C'est pourquoi je vais le copier-coller complètement. Et maintenant nous pouvons l'utiliser ici au lieu du nom de l'événement, nous pouvons écrire ici les événements de socket ENM ne se terminent pas ici. Nous voulons déclencher la notation de colonne, puis l'enregistrer en tant que paramètre. Nous voulons donner notre entrée dans notre colonne. Cela nous donne un avantage supplémentaire d'écrire notre code avec socket dans le service. Nous isolons ce code à l'intérieur d'un service. C'est pourquoi notre composant ne sait pas que nous utilisons ici socket layer par exemple, nous appelons simplement ici column service dot grade column, et nous sommes donnés dans notre entrée de colonne. Vérifions si cela fonctionne ici, nous pouvons essayer de créer une nouvelle colonne. Je clique sur Ajouter. Et maintenant, à l'intérieur de notre colonne appelée, nous pouvons voir la colonne sauvegardée. Et après avoir rechargé la page, vous pouvez voir ici que le cône est créé, ce qui signifie essentiellement qu'il fonctionne, mais nous ne mettons pas à jour notre page à la volée. Et évidemment, nous voulons mettre à jour cette page, d' abord pour notre utilisateur actuel, ensuite pour tous les autres utilisateurs également. Mais pour cela, nous devons améliorer notre service de socket. Pourquoi est-ce que c'est ? Parce qu'en fait, ce que nous devons faire à l'intérieur, nous devons souscrire de manière confortable à notre succès. Et juste pour vous rappeler, à l'intérieur de notre backend, ici, dans les colonnes du contrôleur, nous avons une rencontre et en fait sont vos deux amis qui enverront ce message à tous les utilisateurs abonnés dans cette pièce spécifique. C'est pourquoi nous devons agir. Nous voulons souscrire à cet événement spécifique, qui sera un succès de création de colonne, mais nous voulons le faire de manière inefficace. Et puis ladite couche de socket, elle n'est pas efficace. Nous voulons le faire de manière angulaire. C'est pourquoi nous devons ouvrir à l'intérieur notre service partagé, le service socket. Et ici, je veux créer après avoir rencontré une autre méthode et elle s' appelle Listen here. Tout d'abord, je veux l'écrire dedans. Et si vous ne savez pas comment utiliser les génériques, l'idée principale ici est que nous pouvons fournir importe quel type de données pour la liaison à l'intérieur de l'écoute, et ce sera ce que nous obtiendrons de la socket IO. Ici, nous fournissons t et ici le nom de l'événement sera une chaîne. Et de retour, je veux être observable. Et c'est essentiellement l'idée. Cette méthode nous redonnera un observable. Il n'est pas confortable de travailler avec Socket Layer à l'intérieur angulaire. C'est pourquoi nous voulons le convertir en observable ici. Tout d'abord, une bonne pour vérifier si nous avons des E/S de socket ou non. C'est pourquoi je peux copier cette condition ici, car si nous n'avons pas de socket et que vous êtes connecté, nous ne devrions rien faire. Après ça. Je veux retourner un nouvel observable. Et ici, à l'intérieur, nous devons fournir une fonction. Et ici, nous n'avons qu' un seul argument qui est un abonné. Et maintenant, à l'intérieur, on peut le sécher. Douille allumée. Ce n'est qu'un simple code de socket ion. Nous avons ici notre nom d'événement, ce qui signifie que nous souscrivons sur le client à ce nom d'événement que nous avons passé en paramètre. Voici notre deuxième paramètre : nous obtenons des données et ce que nous voulons faire, nous voulons émettre notre point d'abonné ensuite avec les données. Alors, que fait ce code ? Tout d'abord, ici nous devons essayer ceci et ceci, vous pouvez voir que nous obtenons une erreur. L'objet est peut-être indéfini. Et en fait c'est un problème de TypeScript parce qu'ici il ne peut pas comprendre que ce code avec Eve le couvre indéfini. Ce que nous pouvons faire à la place, nous pouvons écrire ici avec socket égal au socket. Et après cela, nous couvrons cette prise ici. Et puis au lieu de ce circuit en utilisant juste socket et dans ce cas quand ne pas l'obtenir dans le théorème TypeScript. Quelle est donc l'idée de cette fonction ? Nous allons l'utiliser comme ça. Voici donc l'écoute. Ensuite, nous fournissons un type de données, par exemple une chaîne. Et après cela, retirez et événement, par exemple, la création de colonne ou la colonne crée le succès. Dans notre cas, cette seule ligne, elle nous redonnera un observable. C'est pourquoi après cela, nous pouvons écrire, par exemple, abonner et ici, et nous obtiendrons ici nos données. Vous allez voir comment nous allons utiliser cette fonction dans un instant. L'idée principale est que cette fonction créera rapidement et observable. Nous nous abonnerons auprès Socket Layer à ce nom d'événement spécifique. Et lorsque cet événement sera déclenché, nous mettrons simplement à jour notre observable. C'est une façon angulaire vraiment confortable de faire les choses avec Socket Layer. Essayons maintenant d' utiliser cette fonction. Je veux revenir en arrière et dire que notre composant de carte, et ici nous avons nos auditeurs initialisés. Et voici un endroit vraiment sympa pour écouter les événements. C'est pourquoi je veux écrire cette leçon point service point socket. Et ici, nous devons fournir le type car il est obligatoire. Et ici, nous ne fournirons pas cela. Nous récupérons l'interface de notre colonne. C'est ce que nous obtenons après la création de la colonne. Et voici le nom de notre événement et nous voulons nous abonner ici à Socrative se termine dans une colonne à points qui crée succès parce que nous attendons le succès. Et là, après cela, nous pouvons écrire, il suffit de vous abonner et nous allons entrer dans une chronique. Et ici, nous pouvons simplement enregistrer cette colonne sur la console. Donc encore une fois, ce que fait cette ligne, elle crée pour nous un nouvel observable et nous pouvons simplement l'utiliser comme observable. Plus important encore, à l'intérieur où droite et prise allumée. Nous attendons donc notre émission. Voyons maintenant si cela fonctionne ici, je veux créer une nouvelle colonne et j'appuie au moins sur. Et Viola, comme vous pouvez le voir à l'intérieur de la console, nous recevons notre chronique. Et en fait, c'est ce code avec l'événement de succès. Et ici, nous obtenons exactement notre colonne qui a été enregistrée dans base de données, car comme vous pouvez le voir, voici un 80 de nos colonnes enregistrées. Et maintenant nous pouvons faire quelque chose sur le client pour mettre à jour la boucle est beaucoup ambulatoire notre tableau, mais il n'est pas grand comme vous pouvez le voir ici. J'ai ouvert le même onglet pour le même utilisateur. Mais la différence est que le socket ici est différent parce que chaque fois que nous ouvrons un nouvel onglet, mais que nous établissons une nouvelle connexion avec un autre socket ion. C'est pourquoi nous essaierons d'ajouter une liste. Et je suis juste en train de taper ici, au moins nous obtenons ici cette colonne journal de console. Mais en fait, nous obtenons également cette colonne journal de console car il s'agit de deux onglets distincts, deux utilisateurs distincts, ce qui signifie en fait que si deux clients différents seront connectés et ouvrez ce tableau, ils recevront simultanément notre événement concernant la création d'une nouvelle colonne. Et c'est essentiellement la fonctionnalité de base que nous voulons réaliser à l'intérieur du socket ion. Nous devons maintenant modifier une liste de nos colonnes. Et en fait, c'est ici. Je veux écrire ce service de tableaux à points et faire attention ici, pas pauvre, n'est pas notre service sans état avec fonctions, mais notre service de tableau pour le client. Ici, nous devons créer une nouvelle méthode appelée Add Column. Et nous pouvons simplement jeter à l'intérieur de notre colonne, ce qui signifie essentiellement que notre composant ne connaît rien à la logique métier, comment travailler avec les colonnes de notre service de conseil d'administration le sait. C'est pourquoi ici nous devons sauter dans notre service de tableau et nous pouvons créer ici une nouvelle fonction appelée colonne ABC. Et ici, nous arrivons à votre colonne de type, interface de colonne et retour, nous sommes annulés parce que nous ne nous soucions pas du retour. Nous avons simplement besoin de mettre à jour notre flux. Et juste pour vous rappeler qu'en haut, nous avons un flux de nos chroniques. Et maintenant, nous devons le mettre à jour. C'est pourquoi ce que nous pouvons écrire ici nous voulons tout d' abord mettre à jour nos colonnes. C'est y. Créons ici des colonnes mises à jour de propriétés. Ici, nous devons d'abord diffuser ce que nous avons maintenant. Et voici ce flux de colonnes. Et ici, nous avons une fonction getValue, et elle va simplement lire la valeur de notre flux que nous avons actuellement. Et à la fin, nous devons écrire sur votre chronique. Ce sera donc notre nouveau tableau de colonnes mis à jour. Comme vous pouvez le constater, le type est correct. C'est un tableau de colonnes et d'interfaces, et maintenant nous pouvons simplement le mettre à jour avec ces colonnes ensuite. Et ici, nous ajoutons des colonnes mises à jour sur le site. Nous créons simplement dans votre tableau et nous l'écrirons dans notre flux. Allons voir si ça fonctionne. Je recharge la page. Ici, à la fin, nous avons au moins un bouton et en fait il a l'air cassé parce qu'il est zoomé. Maintenant, créons une nouvelle colonne. Je clique sur Modifier la liste. Et comme vous pouvez le voir directement ici, nous voyons notre nouvelle colonne, qui signifie en fait que ce code met à jour notre flux et que notre composant est abonné au flux ici en haut avec ceci combinés au plus tard, ces colonnes sont mises à jour. Ensuite, nous renverrons automatiquement ce composant. Encore une fois, comment cela fonctionne-t-il ? Tout d'abord, nous arrivons ici à notre entreprise intérieure. Et cette entreprise de l'intérieur des terres ne produit que le titre pour nous. Ensuite, nous allons créer cet objet avec le titre et Boyd AD et le lancer dans notre service de colonne. Voici notre rubrique sur les crédits. Ici, nous rencontrons notre événement et nous jetons dans nos données après ce back-end ait reçu cet événement crée pour nous la colonne et les moyens à tous les utilisateurs de cette salle, dans ce forum, le message que nous avons créé notre colonne avec succès. Et après cela, chaque client est abonné avec ce code depuis le début de cette colonne. Une belle réussite. Et quand cela arrive, nous arrivons ici, notre colonne de crédit, et nous sommes deux points ici, mais service d'ajouter une colonne. Et cela va essentiellement mettre à jour un flux avec les colonnes. Et notre composant sera arriéré sur tous nos clients. 35. Créer une tâche de base: Dans la vidéo précédente, nous avons terminé avec succès la création de nos colonnes. Dans cette vidéo, nous commençons à travailler sur des tâches. Et en fait, nous devons implémenter la partie back-end de la création des tâches et l'obtention d'une liste de tâches pour notre conseil d'administration. Et pensez en fait que c'est une bonne possibilité pour vous d'essayer de l' implémenter vous-même. Parce qu'en fait, vous avez déjà fait petites fissures dans ce projet. Et maintenant tu es prête à faire quelque chose de plus grand. Et en fait, obtenir une liste de tâches et créer une tâche est très similaire à nos colonnes, ce qui signifie que vous pouvez utiliser toute la logique à partir de là. Alors, que devez-vous faire si vous souhaitez l'implémenter vous-même ? Tout d'abord, nous parlons ici de fait signe. Nous devons donc créer une nouvelle interface pour notre tâche, puis la méthode du contrôleur modèle pour obtenir ces tâches pour les garçons et méthode insérer le contrôle pour créer une tâche. La question est la suivante : de quels domaines avons-nous besoin dans notre tâche ? Et en fait, ici, je veux juste écrire les champs dont nous avons besoin. Tout d'abord, il s'agit d'un titre de notre description de tâche qui n'est pas obligatoire. Il peut être vide, puis utiliser 3D afin que nous sachions qui a créé cet ID de colonne de tâche. Nous savons donc dans quelle colonne de notre tableau nous devons tendre cette tâche et les autres à bord AT. Dans ce cas, il nous sera plus facile d'obtenir toutes nos tâches par ID de tableau spécifique. Le back-end, vous avez besoin d'une interface et d'un modèle, puis enregistrez-vous dans votre API pour intégrer ces tâches au tableau. Et la méthode pour obtenir cette liste de tâches par planche déchue. Vous devez également créer une nouvelle méthode create dans notre contrôleur. Et ce sera une méthode avec socket yacht car nous voulons informer tous nos utilisateurs qui sont abonnés à ce forum spécifique de cette nouvelle tâche. Et si vous voulez continuer par vous-même, vous pouvez simplement mettre la vidéo en pause et l'essayer. Mais si tu veux juste suivre, faisons-le ensemble. Et tout cela est dit. Ce sera super similaire à nos colonnes. C'est pourquoi je vais beaucoup copier-coller. Tout d'abord, ici, je veux entrer dans les types de sources de notre serveur. Et ici, nous allons avoir notre test d'interface de colonne. Et en fait, nous pouvons le copier-coller complètement et simplement créer notre interface Task Ts. Ici, à l'intérieur du muscle, il est exactement comme le plan. Tout d'abord, nous avons créé notre titre lors de sa mise à jour. Nous l'avons toujours fait, voici notre nom d'utilisateur et le tableau AT c'est tout à fait correct. Mais nous avons également besoin ici de créer une dame de colonne. Dans ce cas, quand non, où que ce soit la maîtrise de la tâche spécifique. Et nous avons également besoin d'une description, mais ce n'est pas obligatoire. C'est pourquoi j'ai mis ici un point d'interrogation. Notre interface est donc correcte. Maintenant, changeons le document que nous devons créer ici document de tâche, qui étend le document et notre tâche que nous avons créée. Et comme vous pouvez le voir ici, j'ai oublié de renommer notre colonne en tâche. Passons maintenant à la création de notre modèle. Ici, les modèles intérieurs étaient déjà en colonne. Je vais aussi tout copier, coller et simplement le mettre dans notre nouveau fichier, qui est task point ds. Ici, il faut tout changer. Festival Nous avons ici un autre schéma de colonne, mais un schéma de tâches. Et ici, pas le document de colonne, mais notre document de travail que nous venons de créer ici en haut, je peux supprimer le document de colonne en toute sécurité. Nous avons ici notre titre. C'est obligatoire. C'est très bien. Après cela, je vais coller à nouveau le titre et le renommer en description, mais c'est facultatif. C'est là où cela n'est pas nécessaire ici. Nous avons également ici notre ID utilisateur, ID de tableau, et ici je veux mettre un nouvel ID de colonne. Et c'est également nécessaire à coup sûr. Et type est l'ID de l'objet. Ça a l'air très bien. Maintenant, en bas, nous devons fournir ici notre document de travail. Et voici une tâche, qui est un schéma de tâches. Notre modèle est complètement prêt. Nous devons maintenant créer une nouvelle API dans notre serveur. C'est Y. Revenons aux niveaux de serveur source de service. Nous avons ici nos appels d'API. Et en fait, notre nouvel appel d'API sera très similaire à ce code. Ici, nous obtenons des colonnes par ID de tableau spécifique. En fait, nous voulons obtenir toutes nos tâches pour un port spécifique. C'est pourquoi je vais copier, coller cette ligne, la coller ici, et simplement la renommer. Ce seront des planches à tarte slushy. Board est un paramètre dynamique, et ici nous avons nos tâches et ici nous aurons également besoin de notre middleware. Et ici, nous avons besoin d'un nouveau contrôleur, qui sera contrôleur de tâches, car à l'intérieur nous voulons gérer nos tâches. Et ici, la méthode obtiendra des tâches, et cette méthode doit renvoyer toutes les tâches pour ce tableau spécifique. Il est maintenant temps de créer un contrôleur. C'est pourquoi je vais sauter et dit contrôleurs. Et je veux copier-coller toutes les colonnes du fichier simplement parce que c'est plus facile à modifier et qu'il sera super similaire. Je le colle donc ici et je renomme deux tâches, point ds. Ici, nous avons deux méthodes, create column et get column. Et en fait, ici, nous pouvons simplement renommer les colonnes get pour obtenir des tâches. Et ici, nous laissons tout tel quel, demandez une réponse. Ensuite, c'est très bien. poulet pour l' utilisateur est bien ici. Reprogrammez, tout est génial. Maintenant, nous n'avons pas besoin d'utiliser le modèle de colonne, mais nous devons utiliser le modèle de tâche here. C'est là qu'en haut je vais entrer le modèle de tâche. Depuis la tâche des modèles. Nous pouvons maintenant changer notre modèle de colonne en modèle de tâche. Ici, nous trouvons par bordure différents paramètres de requête, ID de carte, et c'est exactement ce dont nous avons besoin et c'est pourquoi nous avons un corps dans notre schéma. Dans ce cas, il suffit d' une seule ligne de travail trouver toutes nos tâches pour ce tableau spécifique. Nous récupérons donc notre liste de tâches, et ici nous pouvons simplement les renvoyer à notre API. Et avec cela, notre action pour obtenir la liste des tâches est entièrement prête. Maintenant, changeons la colonne directement cette création. Et comme vous pouvez le voir ici, nous parlons d'E/S de socket, et ce sera également très similaire. Tout d'abord, nous avons ici une méthode create task où obtenir votre socket et vos données. De quoi avons-nous besoin pour obtenir des données privilégiées ? Tout d'abord, nous nous ennuyons ou nous nous ennuyons, car nous devons avertir tous les utilisateurs de ce forum spécifique. C'est très bien. Maintenant, nous avons ici la chaîne de titre, et le dernier ici est l'id de la colonne. Et l'id de la colonne est également une chaîne et des tâches obligatoires. Et vous pouvez dire ici que nous ne fournissons pas de description à l'intérieur. Votre total est correct dans créer, recompter, modifier la description, description que nous ne pouvons fournir que dans Update. C'est pourquoi c' est très bien. Donc, ce que nous faisons ici, nous voulons tout d'abord créer un échec pour nos tâches. Mais pour cela, nous devons d'abord mettre à jour nos événements de socket. C'est pourquoi je vais sauter dans de tels types de sources. Et ici, nous avons nos événements de socket, et ici nous avons déjà des colonnes notation et ils veulent copier-coller les trois actions. Ici, nous pouvons le renommer de colonnes en tâches create, et ici c'est tasks create, puis Tasks, great success and tasks create, failing our socket events is ready. Nous pouvons revenir à l'intérieur de nos tâches et changer ici les événements de socket en tâches pointillées, créer des tâches plus pâles et elles ne changeront pas directement ici notre capture, et ici nous pouvons simplement fournir des tâches point créer échec. Maintenant, mettons à jour une partie interne . Nous n'avons pas de modèle de colonne, mais de modèle de tâche, nous sommes déjà entrés. Ici, nous recevons un titre à partir des données. C'est très bien. ID du tableau. Et ici, l'utilisateur de socket est prêt. cela est tout à fait correct, mais nous devons également fournir ici alcalinité de la colonne de points de données peut être. Et après cela, nous n'enregistrons pas une nouvelle colonne, mais une nouvelle tâche. Ici. Renommons la nouvelle tâche. Et ici, nous pouvons simplement appeler new task dot save et nous récupérons la tâche enregistrée. Avec cette ligne, nous voulons informer tous nos utilisateurs que nous avons créé une nouvelle tâche. C'est ainsi que nous émettons cet événement et que ces tâches créent le succès. Et ici, nous voulons redonner la tâche de sauvegarde. Et ici, nous pouvons supprimer ce journal de console. Nous n'en avons plus besoin et nous avons entièrement créé notre méthode Create Task. Et la dernière chose que nous devons faire, nous devons nous abonner pour commencer à créer la tâche à partir du client. C'est pourquoi nous devons retourner à l'intérieur de notre sororité S. Et ici, en bas, nous avons la prise en main. En fait, nous pouvons copier coller des colonnes Créer et simplement les changer sur notre socket, même les tâches CNN point créent. Et là, nous obtenons nos données et nous avons simplement besoin d'appeler notre contrôleur de tâches create column. Et ici, vous ne serez pas créé de colonne, mais créez une tâche. Et comme vous pouvez le voir ici, nous n'avons pas importé nos tâches de contrôle. C'est pourquoi en haut, je veux copier coller le contrôleur de colonnes et le renommer en notre nouveau fichier, qui est le contrôleur de tâches. D'après les tâches des contrôleurs, il semble que nous avons tout implémenté. Passons maintenant à l'intérieur de la console. Comme vous pouvez le voir, nous n'avons aucune erreur lors la connexion à MongoDB. Api est à l'écoute. C'est pourquoi en fait je veux juste copier-coller le tableau . J'ouvre Postman ici et essaie d'obtenir notre liste de tâches. C'est donc des sports de barre oblique qu'un collage ces tâches de barre oblique ID et les cachées ici envoient. Et comme vous pouvez le voir, je reçois un tableau vide, ce qui est très bien car nous n'avons pas encore créé de tâches, ce qui signifie que notre backend est entièrement préparé. Et maintenant, nous pouvons commencer par implémenter le côté client. 36. Obtenir des tâches: Dans la vidéo précédente, nous avons terminé avec succès la préparation nos modèles de tâches et l'intégration des tâches en backend. Dans cette vidéo, nous devons faire exactement la même chose sur le client. Et je vous recommande vivement de le faire vous-même car vous avez déjà tellement de connaissances. Que devez-vous faire si vous voulez le faire vous-même ? Tout d'abord, vous devez sauter et ladite source de clients, application partagée. Et ici nous avons nos types, nous avons ici Boyd et Column, et maintenant nous devons créer une nouvelle interface pour notre tâche. Après cela, nous devons créer un nouveau service pour travailler avec des tâches, qu' elles aient des tableaux, des colonnes. Maintenant, nous avons besoin d'un nouveau serveur appelé service de tâches. Ici, boop obtiendra les tâches exactement de la même manière, comme si nous obtenions ici des colonnes pour notre tableau, mais ce n'est pas tout. Vous devez également mettre à jour molécule d' initié dans tels services, tests de service de conseil. Parce que nous parlons ici flux pour tableau et de flux pour colonnes. Et nous devons également créer ici un flux pour nos tâches et une fonction supplémentaire qui mettra à jour le flux. Et après cela, vous devez simplement récupérer les données ici dans ce dernier combiné. Et ça y est. Si vous implémentez ce spot vous-même, vous êtes génial. Mais si vous voulez l' implémenter ensemble, faisons-le maintenant. Donc tout d'abord, je vais sauter dans ces types de clients source, application, partagés. Et ici, je veux créer un nouveau type pour notre interface Task Ts. Et nous devons avoir exactement les mêmes propriétés que celles que nous avions sur notre back-end. C'est pourquoi ici nous pouvons exporter notre nouvelle interface et c'est l' interface Task, à l'intérieur. Tout d'abord, nous avons notre identifiant, qui est une chaîne. Après cela, nous avons notre titre, qui est une chaîne. Nous aurons également ici une description, mais elle n'est pas obligatoire. C'est pourquoi Voici un point d'interrogation. C'est également une chaîne. Nous avons également besoin ici de notre colonne D, qui est la référence pour la colonne spécifique, notre parent. Et nous avons besoin ici de notre identifiant de tableau, et c'est aussi une chaîne. Et en fait, nous obtenons ici l'usure t, qui est aussi une chaîne. Notre interface de tâches est donc complètement prête. Nous pouvons maintenant revenir à l'intérieur des services partagés et créer ici dans votre service. Et en fait, ce que je veux faire, je veux copier coller le service de colonnes juste parce que ce sera super similaire. Renommons le service des colonnes en Tasks, service Ts et Comme vous pouvez le voir, c'est MenuService task service. Ce que nous voulons faire ici, est changer le nom. Nous avons donc ici des tâches, service où le constructeur vivant tel qu'il est, nous devons utiliser ici http et la dernière. Bon service. Et voici une méthode qui ne permet pas d' obtenir des colonnes, mais d'obtenir des tâches. Et ici, nous voulons obtenir nos tâches par board AT, parce que nous récupérons une seule fois toutes nos tâches pour un tableau spécifique. Et ici, nous obtenons Becker observable du tableau d' interface Task. Voici notre URL. Il s'agit de tâches de barre oblique ID de tableau de barre oblique. Voici le HTTP GET non pas la chirurgie de l'interface de colonne mais le tableau d'interface de tâche. Pour l'instant, je souhaite supprimer complètement la colonne de crédit car nous n'implémenterons pas de tâche de création dans cette vidéo. C'est pourquoi je peux supprimer ces trois entrées en haut. Nous n'en avons pas besoin pour l'instant. Il est maintenant temps de mettre à jour notre service de conseil d'administration. C'est pourquoi je vais ajouter Board Services, Board service. Et ici, nous devons créer une nouvelle chaîne. Je vais copier coller ici le flux de colonnes et le changer en flux de tâches. Et c'est un comportement qui fait l'objet d'un tableau d'interface de tâches. Et par défaut, nous avons un tableau vide, ce qui est très bien rapide. Maintenant, nous avons une méthode, envoyer des tableaux en colonnes. Nous devons créer une nouvelle méthode appelée set tasks. Et voici un argument. Nous obtenons nos tâches et c'est un tableau, donc c'est un tableau d'interface de tâches. Et maintenant, dans notre flux, les tâches avec un dollar, nous voulons définir nos nouvelles tâches afin que nous soyons presque terminés. Maintenant, la biomasse saute à l'intérieur de notre composant, panneau, composant de carte. Et voici notre dernière version combinée. Et juste pour vous rappeler qu' ici, disons data, nous combinons tous nos flux pour récupérer des données pour le forum. C'est ce que nous devons faire ici. Maintenant, nous devons ajouter ici ce service de forum, et voici les tâches de flux en cours d'utilisation. Et maintenant, dans map comme troisième argument, nous devons essayer de tâches et nous voulons les renvoyer ici. Dans ce cas, dans notre dollar de données, nous aurons non seulement un tableau et des colonnes, mais également des tâches. Et si vous avez tout fait vous-même ici, vous êtes vraiment génial et vous faites de bons progrès. Et maintenant, la seule chose que nous devons faire ici, nous devons les afficher dans le code HTML. Nous allons donc ouvrir le code HTML de nos composants de carte. Et ce que nous avons ici, c'est notre colonne pour boucle. Et à l'intérieur, nous avons un titre et nous n'avons rien d'autre. Et après ce titre, nous voulons en rendre un plus profond. Et voici ce dont nous avons besoin. Et, et G pour boucle pour nos tâches dans la colonne. Et en fait, nous ne pouvons pas le faire parce que nous avons juste ce flux pour nos tâches dans les données, mais nous n'avons pas de tâches pour cette colonne spécifique et nous devons filtrer ces données d'une manière ou d'une autre. C'est pourquoi ici je veux écrire en G4 et il sera dirigé par la tâche de, et ici je veux créer une nouvelle fonction. Par exemple, obtenez les tâches par colonne. Et puis, côté nous devons fournir tout d'abord l' identifiant de colonne et deuxièmement, toutes nos tâches, ce sont des tâches de points de données. Et juste pour vous rappeler ici, dans le flux de données, où nous entrons dans les colonnes et les tâches de notre tableau. C'est ici que dans cette fonction en tant qu'argument, nous pouvons simplement lancer des tâches de points de données, souvent G4, nous devons également ici une classe, ce sera tâche. Et ici à l'intérieur, nous voulons afficher le titre du point de la tâche. Et maintenant, nous avons juste besoin de créer cette tâche enfant par fonction de colonne. C'est ici dans le fichier OTS. Je vais créer cette fonction ici. Nous, tout d'abord, je reçois l'identifiant de la colonne, qui est notre chaîne. Et deuxièmement, les tâches, et c' est un tableau d'interface de tâches. Et là, nous obtenons notre tableau d'interface de tâches. Pourquoi est-ce que c'est ? Parce que nous voulons simplement obtenir notre tableau avec toutes les tâches et filtrer par cette colonne spécifique. C'est ici, le tableau d'interface de tâches est tout à fait correct. Et ce que nous voulons faire à l'intérieur, nous voulons filtrer nos tâches qui étaient Dieu, c'est pourquoi le filtre des tâches aura accès à chaque tâche. Et ici, nous pouvons vérifier que le point deux-points de la tâche égal à notre nom de colonne que nous avons fourni en argument, ce qui signifie que nous sommes Colin pour chaque colonne que nous affichons, cette fonction obtient tâches par colonne et nous allons rendre ici en énergie pour boucle nos tâches. Allons vérifier le son. Avons-nous des erreurs ? Oui, nous avons des tâches de propriété n'existent pas dans les colonnes du tableau de type, ce qui signifie essentiellement que nous n'avons pas mis à jour notre propriété de données. Et comme vous pouvez le voir ici en haut, nous définissons cela dans notre observable, nous venons d'acheter et des colonnes. Mais ici, nous avons également nos tâches, qui sont un tableau d'interface de tâches. Maintenant, nous n'avons aucune erreur dans notre serveur Web et nous pouvons aller à la page et voir toutes nos colonnes, mais nous ne voyons aucune tâche à l'intérieur de la raison pour laquelle cela se produit, car en fait nous n'avons pas appelé notre fetch. Et en fait, ici, dans notre constructeur, nous devons injecter notre service de tâches que nous venons de créer. Et c'est notre service de tâches qui est partagé. Et maintenant, nous devons accéder à nos données de récupération, comme nous l'avons fait ici. Nous pouvons copier, coller notre service de colonnes et le renommer en service de tâches. Et ici, il n'y aura pas de colonnes, mais des tâches et l'intérieur vaut la peine de jeter notre ID de tableau, qui est cette partie AD et retour, nous n'obtenons pas des colonnes, mais des tâches. Et ici, nous voulons appeler ce service de forum non pas définir des colonnes, mais définir des tâches. Et à l'intérieur, nous lançons des tâches que nous avons récupérées. C'est pourquoi avec ce code, nous avons mis à jour notre flux et le flux recevra de nouvelles données dans notre code HTML. Allons voir ça. Je vais recharger la page et un message d'erreur s'affiche. Comme vous pouvez le voir maintenant, nous sommes sur des tableaux slash. Et quand je passe à la première partie, nous obtenons une erreur que nous n'avons pas fournie pour le service des tâches parce qu'en fait, oui, nous devons l'injecter dans notre module de carte. C'est là qu'au sein des fournisseurs, nous devons ajouter en plus notre service de tâches. Rechargeons la page et comme vous pouvez le voir maintenant, nous n'avons aucune erreur. Et ici, au sein du réseau, nous devons avoir une demande pour nos tâches. Et voici une demande slushy pie slash boards slash ID slash tâches. Et voici un aperçu avec aucune tâche, ce qui est tout à fait correct. Nous ne les avons pas encore créés, mais nous voulons évidemment vérifier que notre code fonctionne. C'est pourquoi je veux faire ce que je veux faire dans la console. Je veux ouvrir notre Mongo, comme nous l'avons fait précédemment. Maintenant, je dois sélectionner notre base de données pour utiliser L trailer. Et ici, nous pouvons vérifier ce que nous avons. Par exemple ici maintenant nous pouvons écrire tableaux de points db, point find. Et avec cela, nous verrons tous les tableaux que nous avons. Nous n'avons qu'un seul tableau. Et de la même manière, nous pouvons écrire db point, columns, dot find, et où j'obtiens dans nos colonnes. Et ce que nous voulons faire maintenant, nous voulons insérer dans votre tâche l'une de ces colonnes. C'est pourquoi ici nous pouvons écrire db point et nous avons des tâches point, insert, et à l'intérieur nous lançons un objet. Donc, la première question, quoi avons-nous besoin pour fournir des informations ? Et pour cela, nous pouvons consulter notre interface Task. Donc tout d'abord, id sera généré à l'extérieur, nous devons fournir un titre. Voici donc le titre. Par exemple, ma première tâche après cette promesse fournit une description. Disons que la description est la mienne. Et après cela, nous devons fournir la colonne nécessiteuse. Et en fait, en haut, je vois déjà des colonnes. C'est là que je peux simplement prendre un AD ou FirstColumn et ils le lanceront ici. Ce sera donc l'identifiant de colonne. Et voici cette annonce. Et après cela, je dois également fournir un tableau AD Here. Nous aurons également une annonce de tableau ici en haut et nous pouvons la prendre. Et enfin, mais non des moindres, c'est qu' un utilisateur AT utilise réellement la 3D. Je ne vois pas ici en haut, mais je peux le prendre depuis le back-end. Et comme vous pouvez le voir ici dans notre backend, nous avons toujours un journal de console avec l' e-mail de notre utilisateur et l'identifiant de l'objet. C'est pourquoi je vais simplement copier-coller l'idée de comment un utilisateur et l'écrire ici. L'utilisation de re d est donc égale à cet identifiant d'objet. J'appuie sur Entrée, et voici notre premier enregistrement. Créons-en une autre, par exemple, ma deuxième tâche, et voici ma description. J'appuie sur Entrée et nous avons encore une tâche. Rechargeons maintenant la page et le navigateur. Comme vous pouvez le voir ici, nous avons deux tâches. La façon dont cela fonctionne ici est notre réseau et nous avons une demande avec des tâches PS à notre backend. Et ici, nous obtenons toutes les tâches filtrées par cet ID de forum spécifique. Ensuite, dans notre code, dans notre tableau, nous avons ce code que nous avons écrit pour filtrer nos données. Nous avons donc ici une fonction obtenir les tâches par colonne où à l'intérieur de laquelle filtrer toutes nos tâches par cette colonne spécifique AD. C'est ici que nous affichons uniquement les tâches qui sont liées à cette colonne, ce qui signifie que nous avons réussi à implémenter sur le front-end, obtenir nos tâches et rendre à l'intérieur de notre composant. 37. Créer un formulaire de tâche: Dans cette vidéo, nous pouvons enfin implémenter ou utiliser le formulaire intérieur pour créer une nouvelle tâche. Et en fait, nous avons déjà préparé tout ce dont nous avons besoin sur le backend. Nous avons juste besoin de l' implémenter sur le client. Commençons donc par notre forum. C'est ce qu'ils veulent faire. Je veux entrer dans le jeu, définir le code HTML de notre composant de carte. Ici, y a-t-il un diff à rendre à la tâche ? Et après cela, à la fin, nous voulons afficher notre formulaire en ligne. Nous allons suivre ici le composant de formulaire en ligne. Et terminons-le ici. Et maintenant, à l'intérieur, quand doit fournir certaines valeurs. Tout d'abord, c'est la classe. Il s'agit de notre classe de modèles qui remplace l'ensemble des styles et il s' agit de Create Task Form. Après cela, nous devons également fournir du texte par défaut. Il s'agira d'ajouter une carte, mais aussi d'avoir un bouton ici. Le bouton ici doit être vrai et nous devons fournir un texte. C'est là que se trouvera le texte du bouton et il est à l'heure actuelle. Nous voulons également fournir ici notre espace réservé d'entrée et c'est entrer un titre pour cette méthode actuelle et la dernière mais non moindre est notre méthode de soumission de handle que nous devons créer. Nommons-le, créons une tâche, comme nous l'avons fait avec notre chronique et les informations que nous voulons avant tout donner à n'importe quel événement. Ce sera le titre de la tâche créative, mais nous aurons également besoin ici de notre colonne, car notre backend doit savoir dans quelle colonne nous créons cette tâche. Et si vous voulez demander pourquoi nous sommes donnés ici juste chroniqués et non Boyd AD. Nous avons une carte 3D à l'intérieur de ce composant interne. C'est pourquoi nous n'avons pas besoin de le faire. Maintenant, créons cette méthode. Je vais accéder à notre conseil d'administration et en fait nous devons faire exactement la même chose. Ce que nous avons fait c'est créer une colonne. Mais voici une question. Nous avons ici une interface de saisie de colonne. Voici à quoi cela ressemble et nous devons maintenant créer notre interface de saisie de tâches. Ainsi, tous nos contenus sont écrits de la même manière et cela est évité que nous devions envoyer pour créer une tâche. C'est ici que nous pouvons également l'appeler interface de saisie de tâches Ts et que voulons-nous écrire dedans ? Il s'agit de notre interface, qui est une interface de saisie de tâches. Et à l'intérieur, tout d'abord, Boom doit fournir un titre. Il est obligatoire et il s'agit d'une chaîne. Deuxième boucle, nous fournissons ici notre ID de colonne, qui est également une chaîne. Et enfin, mais non des moindres, c'est notre AD bouilli, et c'est aussi une ficelle. Et maintenant, nous avons une bonne contribution et nous pouvons revenir en arrière dans notre tableau. Et maintenant je veux copier-coller cette colonne de création car ce sera exactement la même chose mais pour la tâche. Nous devons donc le renommer pour créer une tâche. Ici, nous obtenons non seulement le titre, mais également l'ID de notre colonne car nous l'avons fourni à partir de notre code HTML. Et maintenant, nous pouvons changer le nom de colonne en entrée de tâche. Et notre interface ici sera interface de saisie de tâches que nous venons de créer. Et comme vous pouvez voir où je manque ici, notre identifiant de colonne. C'est là que nous devons l' ajouter à partir de l'argument. Et ici, nous n'avons pas besoin d'appeler un service de cône. Nous devons assurer la cohérence de nos tâches. Et juste pour vous rappeler qu'il s'agit notre service sans état où nous écrivons notre requête HTTP et notre E/S de socket. Et cette méthode doit être nommée create task, et nous lançons dans notre entrée de tâche. Mais cette méthode n'existe pas encore. Nous devons le créer. C'est pourquoi revenons en arrière et disons qu'il s'agit de services partagés d'applications sources, et voici notre service de tâches. Mais ce qu'ils veulent faire, je veux copier-coller la méthode create column, car en fait ce sera exactement la même chose. Je copie la colonne de création collée et ils veulent la coller ici dans le service des tâches. Mais cette méthode sera appelée create task. Et nous obtenons comme argument notre entrée de tâche et savons bien que ce type sera interface de saisie de tâche. Ici, nous voulons également appeler une E/S de socket car elle fonctionne de la même manière. Nous avons une opération asynchrone et nous avons commencé à réussir et à échouer. Nous commençons donc à créer une tâche, avertirons avec la rencontre de notre back-end. Ensuite, Bacon crée une tâche facette, puis le backend avertit toutes les personnes qui sont inscrites à notre forum de la nouvelle tâche. C'est là que nous devons mettre à jour nos événements de socket. Je veux l'ouvrir ici à droite, et en plus, ouvrir l'enum à l'intérieur d'un serveur car nous sommes déjà écrits dans nos événements. Ces trois nouveaux événements, tâches créent le succès et l'échec. Et maintenant nous pouvons les coller ici pour les utiliser sur le client. Après cela, nous pouvons revenir dans notre service de tâches et changer le nom ici. Et ce seront les tâches du DOD créées. Et il y a un paramètre ici. Nous recevons une entrée de tâche, ce qui signifie en fait qu'après avoir rempli notre formulaire intérieur, nous enverrons notre socket, votre image à notre backend et notre bacon est déjà prêt à créer notre tâche et le succès de la viande à tous nos utilisateurs. Allons voir ça. Est-ce vraiment comme si nous pouvions sauter dans nos contrôleurs de source de serveur, et voici notre contrôleur de tâches. Et comme vous pouvez le voir, nous avons ici la méthode create task, et ici nous créons une nouvelle tâche, puis notifions avec cette ligne tous nos clients, qui signifie que nous devons simplement nous abonner à ces changements au sein de notre client. C'est là que je saute à l'intérieur de notre composant de carte ts. Et juste pour vous rappeler, nous avons ici nos auditeurs d'initialisation et ici nous avons un auditeur pour notre chronique qui crée du succès. Maintenant, nous faisons exactement la même chose pour notre tâche, un grand succès. Nous aurons donc ici notre interface Task, et ici le type sera DOD. Les tâches créent le succès. Et ce que fait cette interface de tâches de cette façon, nous récupérons l' interface des tâches car elle est générique. Et maintenant nous avons spécifié ou k, Cette leçon nous a redonné notre interface de tâche. C'est ici que nous devons créer une nouvelle méthode à la tâche dans le mot service. Et nous fournissons ici notre tâche que nous avons obtenue du backend. Et la dernière chose que nous voulons faire est ajouter cette méthode dans notre service. Ouvrons notre service de conseil. Et nous avons ici la colonne. Et comme vous avez tous fait le stent, je veux le copier-coller et faire exactement la même chose. Ici, nous avons une méthode de tâche et nous arrivons ici lorsque vous créez une tâche, et c'est une interface de tâche. Ici, nous devons créer un ensemble de tâches mises à jour. Donc, ici, nous obtenons ce qui n'est pas un flux de colonnes, mais un flux de tâches, puis nous obtenons de la valeur. Et ici, à la fin, nous voulons écrire notre nouvelle tâche. Et après cela, nous devons à nouveau mettre à jour notre variété. Voici le flux de tâches et voici les tâches mises à jour. Et avec ce code, nous mettrons à jour notre flux avec succès et tous nos composants abonnés à ce flux seront automatiquement fermés par lettre. Allons voir si ça fonctionne. Nous n'avons aucune erreur ici. Et maintenant je veux ouvrir deux onglets ici. Et ils veulent que les deux clients sautent dans le même tableau. Et comme vous pouvez le voir, voici le journal de notre console. Et ils veulent essayer la coupe ici. Voici donc notre formulaire en ligne et appelons-le, créé une fonction de tâche. Maintenant, j'appuie sur Entrée, et comme vous pouvez le voir directement dans cet onglet, cet élément apparaît. Donc, comment cela fonctionne, nous avons rempli notre entreprise intérieure. Nous lui envoyons notre image au back-end. Back-end, je l'ai obtenu, créé une nouvelle tâche et a informé toutes les personnes, tous nos clients qui sont abonnés à ce forum de ce changement. Et avec cette écoute, nous avons mis à jour notre éventail de tâches et ce composant a été mis à jour. partie la plus intéressante est ici un autre onglet et un autre utilisateur, c'est un autre client avec un autre socket AD. Comme vous pouvez le voir ici, nous avons également fonction Créer une tâche, car tous nos clients sont désormais synchronisés. Et vous pouvez dire, d'accord, mais votre destination, vous n'avez besoin que d'un seul navigateur. Ça n'a pas vraiment d'importance. Il s'agit simplement d' une connexion socket différente de votre serveur. Si vous n'avez que deux ordinateurs et votre projet est déployé en production, il fonctionnera exactement de la même manière. Par exemple, je peux simplement créer une nouvelle tâche. Par exemple, foo, je frappe ici à la carte et j'obtiens exactement les mêmes informations sans Pedro lot dans un autre onglet, ce qui signifie en fait que notre fonctionnalité créait des tâches est complètement terminé. 38. Mettre à jour le nom de la société: Dans cette vidéo, nous allons implémenter une autre fonctionnalité manquante : il s'agit d'une forme de mise à jour du nom de notre forum. Et comme vous pouvez le voir ici, nous avons un tableau de formulaire en ligne avec espace réservé, et ici nous devons utiliser notre formulaire intérieur. Et en fait, il s'agit de notre première vidéo laquelle nous allons implémenter l'ensemble du backend et du client en une seule vidéo. Et en fait, toute la logique sera exactement la même que nous l'avons déjà fait précédemment, parce que nous avons construit une belle architecture et nous pouvons maintenant créer facilement de nouvelles fonctionnalités. Donc, en quoi consiste cette fonctionnalité, nous aurons ici et ensuite la société minière et nous en tirons un titre. Plus important encore, tout d'abord, nous devons jeter notre titre du tableau en signant ce formulaire sur notre succès de mise à jour, mais nous ne voulons pas utiliser le GTP ici. Whoop, je veux utiliser Socket IO par là, parce que tous nos clients doivent être avertis si les urgences, à ce stade, nous avons changé le nom de la carte. C'est là que la prise ou votre viande comme toujours. Ensuite, sur notre backend, nous devons attraper cet événement et mettre à jour notre nom. Et en fait, nous pouvons créer une méthode pour mettre à jour l'ensemble du tableau, mais nous allons mettre à jour pour l' instant le titre du calque. Essayons donc de le faire maintenant. Pour cela, je veux entrer dans notre code et commencer. Tout d'abord, il y avait notre serveur. Et pour ce registre de masse de flèche et utiliser événement socket ici dans notre Socrative et Xenon. Et nous avons déjà ici des planches, des feuilles et des chaînes de ports et en fait nous voulons exactement la même chose que nous l'avons fait avec les colonnes. Et ici, nous avons des colonnes créées par exemple, et ils veulent copier-coller les trois. Parce qu'en fait ici par exemple, après la mise en ligne des tableaux, nous voulons écrire des tableaux et ici seront mis à jour. C'est ici que nous pouvons directement le changer en mise à jour du tableau, succès des mises à jour des tableaux et échec de mise à jour des Et maintenant, sur la droite, nous devons faire exactement la même chose. Voici les tableaux et les mises à jour. Après le succès de la mise à jour de ce forum et l'échec de la mise Notre événement de socket est donc créé avec succès et nous devons maintenant l' enregistrer dans notre E/S de socket. C'est par un retour à l'intérieur ou un service, oui. Et ici, en bas, nous avons notre prise de courant. Ici, nous devons enregistrer et utiliser socket ton. Pour cela, nous pouvons simplement copier-coller par exemple, créer une tâche et écrire ici, ne pas créer, mais réagir mise à jour des tableaux de points que nous venons de créer. Nous attendons donc la mise à jour des tableaux d'événements de la part de notre client. Et ici, nous ne voulons pas utiliser le contrôleur de tâches, mais le contrôleur de la carte ici ne crée pas de tâche, mais met à jour le tableau. Et en fait, à l'intérieur, nous transmettons les données de votre socket, comme nous le faisions précédemment. Maintenant, créons cette méthode de tableau de mise à jour pour ces paiements directement dans nos tableaux de contrôleurs. Et ici nous avons déjà cette méthode de création de planche, mais ce n'est pas ce que nous voulons car cette méthode est avec une chaussure TP. C'est pourquoi nous voulons quelque chose comme le live board par exemple. C'est pourquoi je vais copier-coller cette méthode car toutes les options seront similaires et nous pouvons nommer ce tableau de mise à jour de méthode. Et nous savons que nous recevons ici notre prise infrarouge, puis nos données. Et la question est quelles données avons-nous besoin pour mettre à jour un tableau Nous devons certainement connaître le titre du tableau que nous voulions fournir. Et deuxièmement, l'idée du tableau que nous voulons mettre à jour. C'est là que notre corps va parfaitement bien. Et en fait ici je ne veux pas écrire de titre, je veux écrire des champs. Et ici, nous allons passer la chaîne de titre. Pourquoi avons-nous une telle notation ? Dans ce cas, nous pouvons facilement ajouter un nouveau champ que nous voulons mettre à jour dans notre tableau. Par exemple, si plus tard nous aurons une description, nous pouvons simplement la lancer ici, mais pour l'instant nous n' avons qu'un titre. Maintenant, nous pouvons supprimer ce journal de console, nous n'en avons pas besoin et aussi socket leaf. La question est donc de savoir ce que nous allons écrire ici ? Tout d'abord, nous devons écrire ici try-catch juste parce que nous pouvons avoir une erreur. C'est par ici. Créons, essayons et attrapons. Et là, nous entrons à l'intérieur, attrapons une erreur. Et si nous avons une erreur, nous voulons juste écrire socket et meat. Et voici nos événements de socket en un point. Et nous avons déjà créé l'échec de la mise à jour de nos tableaux. Et ce que nous voulons fournir des informations, c'est notre message d'erreur get. Et juste pour te rappeler, c'est notre assistant qui transformera une flèche. C'est mon intérieur. Nous pouvons simplement indiquer notre erreur inconnue. Créons maintenant notre pneu. Alors Festival ici nous voulons vérifier si un utilisateur est valide, c'est y. Vérifions si nous n' avons pas d'utilisateur point socket, puis passons à émettre exactement la même erreur. Essayons donc le socket, les événements de socket, l'échec de la mise à jour des cartes ENM. Et ici, au lieu d' obtenir un message d'erreur, nous pouvons simplement écrire que l'utilisateur n'est pas autorisé. De plus, nous ne devons pas oublier ici d'écrire un retour. Dans ce cas, nous allons simplement arrêter de faire quoi que ce soit. Parce qu'après cela, si nous voulons écrire notre logique, agit d'une mise à jour du tableau. Et en fait c'est extrêmement facile, mais nous devons rendre cette méthode aussi synchrone parce que nous voulons l'utiliser au Koweït à l'intérieur. Maintenant, voici ce que je veux faire, je veux récupérer notre tableau mis à jour. Et pour mettre à jour un tableau, nous devons utiliser ici un poids et nous avons ici accédé à notre modèle de travail. Et nous pouvons utiliser la recherche par ID et la mise à jour. Et en fait, c'est une méthode incroyable de Mongoose. Dans ce cas, nous ne fournissons que NAT et dans notre cas, il s'agit de l'ID de tableau de points de données. Voici notre mise à jour. Et en fait, update est exactement ce que nous voulons mettre à jour au sein de notre entité. C'est ici que nous pouvons simplement essayer les champs de points du tableau et c'est un objet. Et le dernier concerne les options. Ici, je veux vous fournir une option. Cette option est vraiment importante car dans ce cas, nous récupérerons notre tableau mis à jour. De plus, comme vous pouvez le voir ici, j'ai fait une erreur. Il ne s'agit pas de champs de points de tableau, mais de champs de points de données. Nous n'avons plus aucune erreur et nous pouvons répondre avec ce port. Et pour cela, nous pouvons simplement utiliser socket and meet. Voici notre socket même vu. Et nous avons ici du succès. Les tableaux mettent donc à jour le succès Nous voulons fournir comme deuxième paramètre sont mis à jour le tableau. Dans ce cas, tous nos clients seront informés de cet événement après ce coupon afin d'informer tous nos clients abonnés à ce forum de notre changement. C'est ici que nous pouvons écrire ir point t2, et ici nous voulons avertir tous les clients à l'intérieur de notre chambre. C'est là que nous aurons des données, point d'identification du tableau de points, et nous nous rencontrerons comme nous l'avons écrit précédemment. Et ici, à l'intérieur, nous pouvons utiliser nos événements de socket dans m point. Et ici, nous avons un succès de mise à jour du tableau. Et il y a un deuxième paramètre que nous voulons écrire ici, le port mis à jour. Dans ce cas, les utilisateurs d'Oliver seront avertis que TO board a été mis à jour et ils sauront quels champs ils doivent modifier. Notre partie back-end est complètement prête. Nous devons maintenant implémenter une partie client. C'est ici que nous allons revenir à l'intérieur notre application source client. Et ici, je veux tout d' abord aller dans Shared Services, Board service. Pourquoi est-ce que c'est ? Parce qu'en fait, nous organisons nos événements pour le back-end. Et en fait, avant que nous écrivions ici, tout comme GTP cat et le difficile proposé. Mais dans notre cas, nous devons émettre un événement socket. C'est pourquoi ce que nous voulons créer ici est le tableau de mise à jour des méthodes. Nous voulons vous fournir ici. Tout d'abord, notre tableau AD, il s'agit d'une chaîne et deuxièmement, des champs que nous voulons mettre à jour. Comme vous pouvez le voir, nous avons des paramètres exactement comme sur le backend. Here fields est intitulé, qui est une chaîne, et retour avec pas besoin d'obtenir quoi que ce soit parce que nous utilisons simplement ici socket IO, mais pour l'utiliser ici, mais il faut l'injecter dans le constructeur. C'est ici que nous obtenons notre service de socket, qui est notre service de socket. Maintenant, dans notre tableau de mise à jour, nous pouvons utiliser ce service point socket, dot and meat. Et ici, nous devons fournir notre événement socket. Mais voici le problème. Nous ne l'avons pas encore enregistré chez notre client. Ici, nous n' avons pas de telles chaînes. C'est là qu'en bas, je veux y ouvrir nos événements de socket serveur. Et ici, je veux copier-coller ces pores, mettre à jour le succès et l'échec. Et maintenant, nous voulons juste les coller ici dans notre client. Nous n'avons donc pas dit à notre client les chaînes et nous pouvons les émettre. C'est pourquoi ici nous pouvons simplement écrire des événements de socket en m point et ici nous avons une mise à jour de la carte. C'est le début de notre mise à jour en signe de protestation. Et est-ce que le deuxième paramètre ici passe à fournir notre virgule ID du tableau, nos champs. Nous avons donc exactement le même lac de données que celui que nous avons préparé sur notre backend. Et maintenant, à partir de n'importe quelle partie de notre application, nous pouvons utiliser ce service de tableau partagé. Utilisez cette méthode du forum de mise à jour pour envoyer une rencontre. Il est maintenant temps d'ajouter notre formulaire, que nous n'avons pas encore créé. C'est pourquoi revenons à l'intérieur de notre application. Composants de la carte, carte, composants de la carte HTML. Et comme vous pouvez le voir ici sur le conteneur d'en-tête du tableau intérieur supérieur , nous avons ce tableau de formulaire en ligne avec espace réservé. Et exactement ici, nous voulons écrire un formulaire en ligne pour mettre à jour le titre de notre tableau. C'est ici, écrivons notre formulaire de tableau de bord en ligne que nous voulons utiliser, et fermons-le ici. Maintenant, tout d'abord, l'intérieur de l'utérus doit fournir la classe pour obtenir un style correct. Et dans ce cas ici, il sera ajouté forum du forum. Ensuite, nous allons également vouloir fournir notre texte par défaut. Et ici, nous aurons notre tableau de points de données, le titre des points. Pourquoi est-ce que c'est ? Parce qu'en fait, juste pour vous rappeler ici en haut, nous avons nos données, des données locales sur nous avons nos données, les propriétés, et à l'intérieur nous avons toutes nos colonnes, toutes nos tâches et un tableau. C'est pourquoi nous avons ici un accès direct au titre du tableau de données et nous voulons le rendre comme texte par défaut. Ensuite, nous voulons également fournir un titre, et c'est la valeur pour notre entreprise. Ici, nous allons également écrire titre du tableau de données et enfin, mais non des moindres, est géré soumettre. Il s'agit de notre événement et nous voulons créer une nouvelle méthode, par exemple, update board name et inside dollar event est une chaîne pour mettre à jour un tableau. Créons maintenant cette méthode. Je vais sauter dans le fichier RTS et quelque part en bas, nous pouvons ajouter le nom du tableau de mise à jour. Et nous savons que nous obtenons ici le nom de notre tableau, qui est une chaîne. Et de retour, nous voulons obtenir un vide parce que nous voulons simplement utiliser notre service. Et en fait, nous avons déjà accès à notre service de tableaux à points. Et c'est important, ne pas s'ennuyer mais les planches parsèment. Et voici notre tableau de mise à jour ici à l'intérieur. Tout d'abord, nous devons fournir notre ID de tableau, et c'est ce tableau à points AT. Et deuxièmement, nos champs. Dans notre cas, nous n'avons qu'un titre, qui est le nom de notre tableau que nous avons obtenu à partir de notre formulaire intérieur. Nous avons donc réussi à créer un flux unique. Nous avons donc créé notre intérieur à partir ici, nous avons mis à jour le nom de notre tableau et nous avons reçu un événement pour notre back-end. Vérifions si cette pièce fonctionne. Je n'ai aucune erreur sur le client ou sur le backend. Et maintenant, ouvrons un navigateur. Comme vous pouvez le voir ici, nous avons maintenant la première partie et je peux cliquer ici pour ouvrir un formulaire. Et voici notre première planche. Ils peuvent écrire quelque chose ici et appuyer sur Entrée. Et comme vous pouvez le constater, elle n'a pas été mise à jour car nous n'avons pas réagi à nos modifications depuis le backend. Et en fait, comme vous pouvez le voir ici, nous n' avons pas d'erreur et notre titre a probablement déjà été mis à jour, mais nous n'avons pas prévenu notre client. Et en fait, nous pouvons facilement le vérifier. Nous pouvons simplement recharger la page. Et comme vous pouvez le voir maintenant, nous recevons notre titre mis à jour, ce qui signifie que toute la logique fonctionne déjà et que notre backend a réussi à mettre à jour notre tableau. Mais le principal problème est que nous n'avons pas informé tous nos clients du changement. En fait, oui, nous l'avons fait en back-end, mais nous n'avons pas créé d'abonnement pour cet événement sur le client. C'est Y. Allons-y maintenant. Tout d'abord, nous devons revenir à l'intérieur de notre composant board. Et juste pour vous rappeler qu'en haut de la page, nous avons des abonnements pour différents événements. C'est pourquoi je souhaite ici copier-coller un abonnement et le modifier. Nous avons donc notre service this socket et nous sommes écoute de l'événement de mise à jour de notre carte, ce qui signifie en fait que nous recevons une nouvelle carte. C'est ici que nous avons une interface de carte et ici nous avons l'événement socket C num point. Et ici, nous sommes à l'écoute du succès. Nous avons ici des tableaux, des mises à jour, des succès. Et dans notre Abonnez-vous maintenant, nous recevons notre tableau mis à jour. Alors, que voulons-nous en faire ? En fait, je voudrais simplement appeler une méthode dans notre service de tableaux et cela mettra à jour notre flux de données. C'est pourquoi nous pouvons utiliser ici le service de tableau, tableau de mise à jour par points et la ligne de valeur. Et dans notre tableau mis à jour, super successful est inscrit à notre événement. Et nous avons juste besoin de créer cette fonction de mise à jour du tableau dans notre service de tableau. Passons donc à notre service de conseil d'administration. Et ici, en bas, nous pouvons le créer. Voici donc le point de mise à jour, et nous savons que nous obtenons ici un tableau mis à jour, qui est en fait une interface complète. Et ici, nous allons devenir large parce que nous voulons simplement mettre à jour notre flux. Mais ici, nous avons un problème. Par défaut, notre tableau est maintenant, c'est ici. Typescript criera que nous ne pouvons pas travailler avec. Maintenant, c'est ici que je veux vérifier si nous avons maintenant embarqué ou non. Donc, ici, je veux obtenir un tableau, et voici, est-ce que ces tableaux diffusent vers la valeur. Et après ça, je veux vérifier si c'est le cas maintenant. Donc, si nous n'avons pas notre tableau, alors je veux lancer une erreur. Donc, voici une nouvelle erreur parce que nous ne pouvons pas mettre à jour le tableau si nous n'en avons pas. Ici, disons que board n'est pas initialisé après cela si nous pouvons travailler avec part et nous voulons simplement mettre à jour notre flux. Donc ce tableau avec le point dollar suivant, et ici je veux fusionner tout le tableau que nous avons avec le titre parce que je veux juste mettre à jour le titre. Le titre est donc notre titre de point de tableau mis à jour. Et vous pourriez dire, d'accord, nous pouvons simplement prendre l'objet en entier. Oui, nous allons bien, mais je veux rester prudent et simplement implémenter une fonctionnalité que nous devons résoudre. Ce code devrait réussir à mettre à jour le flux et notre composant, il est abonné au flux, sera notifié et rétroactif. Allons voir si ça fonctionne. Nous n'avons aucune erreur ici. Rechargeons la page et voici le premier tableau. Changeons simplement votre titre et appuyez sur Entrée. Et comme vous pouvez le voir, voici directement mes modifications. Maintenant, dupliquons cet onglet et réessayons. Donc, dans le deuxième onglet, je vais juste essayer de syntoniser et d'appuyer sur Entrée. Et comme vous pouvez le voir ici sur le premier onglet, il a également été mis à jour, ce qui signifie que nous avons implémenté avec succès une fonctionnalité de mise à jour du titre d'un tableau du début à la fin. 39. Supprimer le tableau: Dans cette vidéo, nous allons implémenter la suppression du point. Et en fait, cette fonctionnalité sera super similaire à notre fonctionnalité précédente avec la mise à jour suffisante de notre tableau, c'est y. Implémentons-la vraiment vite comme toujours. Mettez-en un pour démarrer avec notre serveur. C'est y. Passons aux sources du serveur. Et ici, nous nous intéressons à nos événements sur les sockets. Et en fait, exactement comme cette mise à jour, nous avons besoin de trois nouveaux événements à supprimer. C'est par ici, créons trois nouveaux événements. Ce sont des cartes de suppression de port à son succès et à son échec. Et changeons sur la droite, notre chaîne deux tableaux suppriment. Les tableaux suppriment ensuite les succès et les tableaux suppriment les échecs Abonnez-vous maintenant à notre événement pour ce saut bonus à l'intérieur de notre serveur. Et ici, nous pouvons copier, coller le succès de notre tableau et le remplacer par nos tableaux. Supprimer. Ici, nous voulons utiliser une nouvelle méthode, pas mettre à jour le tableau mais supprimer le port. Passons maintenant à notre contrôleur et créons cette méthode dans le contrôleur de notre carte. Et en fait, pour cela, je veux copier-coller complètement notre méthode de mise à jour car une suppression sera super similaire. Tout d'abord, changeons le nom. C'est delete board et c' est une méthode asynchrone. Maintenant, au milieu de nos données, la seule chose dont nous avons besoin, ce n'est pas un identifiant de notre conseil d'administration. C'est là que j'ai acheté le D c'est assez ici, mais je n'ai pas besoin de fournir autre chose car nous supprimons simplement notre tableau par d. Et pour le back-end, c' est assez d'informations. Maintenant, à l'intérieur, nous avons try-catch comme toujours, et nous recherchons notre utilisateur de socket. Mais ici, en cas d'erreur, nous voulons lancer une autre erreur et ce sera l'échec de la suppression des cartes. Ici. Changeons également notre cage. Ce sera également l'échec de la suppression des cartes DOD. Et maintenant, nous devons changer notre modèle chuchoté logique, car ici nous avons fait une mise à jour. Maintenant, nous avons Azure move et en fait nous ne voulons rien récupérer, mais nous voulons simplement supprimer ce lien d'ici d. Et pour cela, nous pouvons utiliser différentes méthodes. Par exemple, nous pouvons utiliser find one et delete. C'est très bien. C'est exactement comme nous l'avons fait dans la mise à jour. Mais en fait, vous pouvez également utiliser directement sans sucre, en supprimer un. Et c'est une méthode juste pour que vous sachiez à l'intérieur de delete one, nous devons fournir un objet avec champs par lesquels nous voulons trouver le sensible. Et en fait, ici, nous pouvons simplement fournir un identifiant de soulignement égal et d Maintenant, dans le cas où il s'agit d'AD de tableau de points de données, et peu importe que vous utilisiez delete one ou find by the end delete, cela fonctionne exactement pareil. Cette ligne supprime donc avec succès pour nous notre tableau. Et après cela, nous voulons émettre notre succès de suppression. C'est ici que, pour tous nos utilisateurs à l'intérieur de ce port, nous voulons émettre des cartes, supprimer le succès. Et en fait, ici, nous n'avons pas besoin de fournir un identifiant de notre forum, car tous ces utilisateurs sont à l'intérieur de ce forum spécifique, ils savent quel forum a été supprimé et ils doivent être redirigés vers la page d'accueil. parce qu'ils ne peuvent pas rester sur le tableau que l'un des clients a supprimé. Notre logique de serveur est donc complètement prête. Revenons maintenant à notre client et exactement comme précédemment. Tout d'abord, nous voulons commencer par partagés et par nos événements socket. Et je vais copier-coller à partir de nos événements de socket, trois événements, le succès et l'échec de la suppression du tableau, et le coller ici en bas. Nous devons maintenant sauter dans nos services, board service, car ici nous voulons créer une nouvelle méthode pour supprimer un tableau. C'est ici que nous allons copier-coller notre tableau de mise à jour et le changer en point de suppression. Et la seule chose dont nous avons besoin est notre tableau AT, nous n'avons pas besoin de champs ici. Et ici, nous voulons émettre notre événement de suppression de tableau. Essayons-le ici. Acheté delete et à l'intérieur, nous fournirons un objet avec un seul champ. Indeed est l'identifiant de notre tableau. Maintenant, dans notre application, nous pouvons appeler ce tableau de suppression et cela lancera une fin corrective de la couche de socket. Nous allons maintenant mettre à jour notre composant. Je veux donc retourner dans notre tableau. Composants achetés en HTML. Nous avons ici notre formulaire en ligne. Et après ce formulaire en ligne, nous devons créer une icône qui supprimera le tableau. C'est ici que disons div class Delete Board. Et ici, nous aurons notre événement click et décliquerons Poupon pour supprimer notre point. Et en fait, nous n'avons pas besoin de fournir quoi que ce soit à l'intérieur car nous avons le NAD de notre carte dans notre fichier de test. Donc, ici, je veux fermer notre div et l'essayer dans le code Delete Board. Nous devons maintenant sauter dans notre fichier ts et créer cette méthode ici en bas. Et ce que nous voulons faire dans notre tableau de suppression, il suffit d' appeler notre service. Eh bien, ici, nous savons que c'est un vide et nous voulons appeler un service. Mais en plus, je veux écrire ici une confirmation car nous devons être sûrs que les utilisateurs veulent vraiment supprimer un forum. Essayons-le ici. Si vous confirmez et si vous ne savez pas ce qui est confirmé, s'agit d'une fenêtre contextuelle Javascript standard à l'intérieur du navigateur, qui vous montrera un oui ou un non. Nous voulons donc écrire quelque chose comme, êtes-vous sûr de vouloir supprimer le tableau ? Et si la réponse est oui, alors nous allons entrer dans ce tamis et nous appellerons ce service de conseil. Et ici, nous avons le point de suppression où nous pouvons fournir notre AD de tableau. Et maintenant, vous pourriez penser, d'accord, nous devons mettre à jour notre service de conseil. Mais nous n'avons pas besoin de le faire parce que c' est en fait beaucoup plus simple. Ce que nous voulons faire Poupon pour vous abonner ici à notre événement socket, qui sera supprimé avec succès. Faisons ça maintenant. Pour cela, nous voulons copier-coller notre service de socket, écouter et entendre boop vouloir écouter void parce que back whoop n' aura pas de tableau. Nous savons que c'est le succès de la suppression de notre tableau. C'est ici que l' événement sera acheté, supprimera le succès et reviendra lorsqu'il n'obtiendra rien. Et la question est ce que nous voulons faire à l'intérieur et nous voulons simplement rediriger l' utilisateur vers notre page d'accueil. Pourquoi est-ce que c'est ? Parce qu'en fait, nous avons un écouteur ici en haut de la navigation Démarrer, ce qui signifie en fait qu' au moment où notre utilisateur va sur une autre page, par exemple, sur la page d'accueil, nous gérera les flux en direct via notre service de conseil et nous supprimerons correctement tous les flux. C'est ainsi que nous voulons faire dans notre abonnement, vous écrivez simplement ce routeur point navigation par URL. Et ici, nous avons, par exemple, des tableaux slash, ce qui signifie en fait que le tableau n'existe pas. Nous devons afficher pour chaque client la liste des tableaux disponibles. Vérifions si ce code fonctionne. Comme vous pouvez le constater, nous n'avons aucune erreur sur le client. Nous n'avons pas d'erreurs sur le backend. Ouvrons-le maintenant dans le navigateur. Et comme vous pouvez le constater, notre page fonctionne toujours. Et maintenant, nous avons ce tableau de suppression. Mais en fait, je ne veux pas supprimer cette partie parce que nous avons construit pas mal de tests ici. Mais je veux faire, je veux revenir à l'intérieur de nos tableaux et créer un nouveau tableau, par exemple, à supprimer. Dans ce cas, nous pouvons tester cette fonctionnalité sur cette nouvelle barre vide. Mais nous voulons le faire maintenant, nous voulons dupliquer cet onglet juste pour vérifier s'il fonctionnera pour le deuxième utilisateur. Donc, ce que je veux faire maintenant, je veux cliquer sur Supprimer le point, et comme vous pouvez le voir, je vois une confirmation. Je vous assure que vous voulez supprimer un tableau là où il est masqué, d'accord ? Et là où il y a de la régularité a réagi à nos planches. Et comme vous pouvez le voir ici, nous n'avons pas notre tableau parce qu'il a réussi ou a été supprimé. Et comme vous pouvez le voir dans le deuxième onglet, où tous les chiffres sont dirigés vers notre barre oblique parce que tous nos clients dans cette salle ont été informés de la réussite de la suppression du tableau et ils doivent être rejeté sur notre page de tableaux. Comme vous pouvez le constater, notre architecture est tellement incroyable que nous pouvons créer de nouvelles fonctionnalités en quelques minutes. 40. Supprimer la colonne: Dans cette vidéo, nous devons implémenter la suppression de notre colonne. Et en fait, nous avons ici une colonne à l'intérieur de notre tableau et la masse près du titre montre l'icône pour supprimer une colonne. Et encore une fois, il doit être implémenté avec le socket IO. Nous informerons donc un autre utilisateur de notre suppression. Et je pense que c'est une fonctionnalité vraiment intéressante que vous pouvez implémenter vous-même car elle sera super similaire à supprimer dans un oiseau. Et voici de l'aide de ma part. Tout d'abord, comme toujours, nous devons sur le backend, implémenter de nouveaux événements et enregistrer l'événement use socket. Après cela, nous devons créer une nouvelle action de contrôleur qui est des colonnes. Par exemple, supprimez une colonne. Nous devons également avoir du sens uniquement pour le client. Tout d'abord, le registre et le nouvel événement. Ensuite, nous avons rassemblé une nouvelle méthode dans le service de colonne qui est partageable pour supprimer une colonne. Après cela, nous devons mettre à jour notre composant pour ajouter un bouton sur lequel nous supprimerons cette colonne spécifique à partir de ce point. Et en fait, il ne s'agit que d'une réunion de l'événement pour le back-end. Et nous devons également souscrire au succès pour supprimer cette colonne chez tous nos clients. Et voici le balisage du bouton. Vous savez donc ce que vous devez mettre en œuvre. Comme vous pouvez le voir ici, je suis à l'intérieur du composant HTML du tableau. Nous avons ici les titres de nos colonnes et juste après le titre, nous voulons écrire ici une image avec la source. Et ici, nous aurons des actifs de barre oblique, une barre oblique, un trait de soulignement, un point d' icône SVG. Et ici, nous pouvons fermer notre image, mais nous devons également fournir ici une classe qui sera l'icône de suppression de colonne. Allons voir ça. Je recharge la page et voilà que nous avons une belle croix. Et c'est exactement là que vous allez lier l'événement de clic. Mais si vous voulez juste suivre, mettons-nous en œuvre ensemble. Et en fait, comme je l'ai dit, ce sera super similaire à la suppression du tableau. C'est Y. Allons-y vite et furieusement. Tout d'abord, je veux commencer par notre backend et la biomasse sauter ici à l'intérieur de nos types de sources de serveur. Et voici nos événements de socket. Et encore une fois, nous avons ici supprimer les tableaux, je peux le copier-coller et le changer simplement en colonnes supprimer. C'est ici que sur la gauche, nous aurons des colonnes supprimées et sur la droite au lieu de tableaux écrirons des colonnes partout. Et nous devons également le changer en cas de succès et d'échec. Nos événements sont donc là. Maintenant, nous devons sauter à l'intérieur de nos niveaux de serveur ici et utiliser socket ici au lieu de supprimer les tableaux, je veux écrire des colonnes delete, que nous venons de créer. Ici. Au lieu d'un contrôleur de carte, nous devons utiliser notre contrôleur de colonnes. Ici, nous ne supprimerons pas de tableau, mais nous supprimerons notre colonne. Et maintenant, nous sommes la méthode de suppression de colonne moutarde dans notre contrôleur de colonnes. Mais je ne veux rien retaper parce que le code est exactement le même que la suppression du tableau. C'est là que nous pouvons copier, coller complètement ce tableau de suppression et le coller dans notre contrôleur de colonnes car il sera identique à 99%. Tout d'abord, la question est ce que nous devons obtenir ici en tant que paramètre ? Nous y sommes déjà, je reçois AD à bord et ils veulent aussi obtenir ici la colonne D, parce que nous avons besoin de savoir ce que nous supprimons. Et vous pourriez dire ici, d'accord, mais pourquoi avons-nous besoin de la pauvre dame ? Nous avons juste besoin d'une colonne et en fait pas parce que nous devons avertir tous ceux qui se abonnés à cette annonce de forum spécifique. C'est pourquoi nous devons fournir les deux valeurs ici. Après cela, nous vérifierons ici pour notre utilisateur et ici nous devons rencontrer un événement d'échec. Dans notre cas, ce sera l'échec de la suppression des colonnes. Ici, cet utilisateur n'est pas autorisé, et ici nous avons notre catch et nous pouvons utiliser ici les mêmes colonnes delete failure avec notre message d'erreur get. Ici. Au lieu du modèle de tableau, nous utiliserons notre modèle de colonne. Ici, nous supprimons un enregistrement par point de données, et voici l' ID de la colonne car nous devons supprimer notre colonne non née et ainsi rencontrer notre succès. Mais ici, nous allons essayer de réussir pour notre suppression de colonne, et voici le succès. Et en fait, nous sommes déjà prêts avec notre backend. Ce que je veux faire maintenant est de copier-coller ces événements de socket car nous allons l'utiliser sur le client. C'est ainsi que je vais copier-coller des colonnes, supprimer le succès et l'échec, et que le champion désactivé définit l'application source des clients. Et ici, nous avons des types partagés et voici nos événements de socket où nous pouvons coller des colonnes, les supprimer. Notre prochaine étape sera Data, Service, Insight shared services columns. Parce que nous voulons implémenter la suppression de colonne exactement ici. Nous pouvons écrire une nouvelle colonne de suppression de méthode, et nous savons que nous obtenons ici notre ID de tableau, qui est une chaîne, et également notre ID de colonne, qui est également une chaîne. Et nous obtenons un grand vide parce que nous voulons juste émettre notre événement socket. C'est pourquoi ici nous pouvons écrire ce service de socket et nous rencontrons, et nous utilisons ici nos événements de socket dans m colonnes de points delete. Et nous devons fournir comme second paramètre et un objet avec notre AD de tableau et également l'ID de colonne, que nous obtenons à partir des paramètres. Après cela, nous devons mettre à jour notre service de conseil. Et juste pour vous rappeler, ennuyez les services exactement là où nous stockons notre flux de colonnes. Ce qui signifie en fait que nous devons implémenter la suppression de la colonne. Donc, ici en bas, je peux créer une méthode de suppression de colonne. Et ici, nous avons juste besoin de notre colonne. Nous n'avons pas besoin ici d'idée de tableau car nous appellerons cette méthode uniquement depuis le composant pour mettre à jour notre flux. Nous connaissons donc ici l'ID de colonne que nous voulons supprimer et nous sommes annulés, et maintenant nous voulons mettre à jour la liste de nos colonnes. C'est par ici. Nous pouvons créer une propriété mise à jour des colonnes. Et ici, nous pouvons accéder à notre flux avec ces colonnes. Ici, nous obtenons notre valeur. Et après cela, nous voulons filtrer notre tableau. En fait, nous avons accès à chaque colonne et nous voulons rejeter cet identifiant de colonne spécifique. C'est pourquoi ici nous pouvons vérifier que ID de colonne n'est pas égal à nos noms de colonne, qui ont été passés en tant que paramètre. Dans ce cas, nous obtenons exactement la même liste de nos colonnes, mais sans cette colonne. Et après cela, nous devons simplement mettre à jour notre flux. Pour cela, nous pouvons écrire ces colonnes ensuite et nous les jetons à l'intérieur de nos colonnes mises à jour. Donc, en fait, cette méthode mettra à jour notre flux et supprimera une colonne du flux. L'étape suivante consiste à mettre à jour notre composant. Et en fait, nous avons déjà changé notre code HTML. Ici, nous avons maintenant une image, mais nous devons l'attacher, entendre un événement de clic. Et voici ce que je veux faire, je veux supprimer une colonne. C'est ainsi que nous pouvons fournir une colonne de suppression de méthode, et nous devons passer à l'intérieur de com point id. Et ici en haut, comme vous pouvez le voir, nous avons accès à notre colonne. Nous pouvons maintenant sauter dans notre composant et créer cette méthode. Donc, la colonne Dalit ne reçoit qu'un seul argument, qui est notre ID de colonne que nous voulons supprimer et la banque où elle devient nulle. Et maintenant, à l'intérieur, nous voulons simplement appeler notre service partagé. Voici donc ce monde de service de colonne ou Hérode. Maintenant, nous avons une colonne de suppression de méthode à l'intérieur. Nous devons fournir un AD de tableau, et en fait, il s'agit de l'AD du tableau et ensuite de l'ID de colonne. Cette ligne de code enverra donc un événement à notre backend pour supprimer cette colonne et avertir tous nos clients. Et maintenant, il suffit de s'inscrire dans notre abonnement ici en haut de la page pour mettre à jour notre liste de colonnes. C'est là qu'ici nous pouvons copier-coller quelque chose similaire et les colonnes soudées ici créent du succès. Je vais le copier, le coller et le coller ici en bas. Et ici, nous avons supprimé et effectivement supprimé avec ne pas l'avoir fait correctement. Je veux revenir à l'intérieur de nos colonnes de contrôleurs. Comme vous pouvez le voir ici, nous avons le tableau de données i2 qu'ils émettent, et ici je viens de changer le nom des colonnes supprimer le succès, mais ce n'est pas suffisant. Nous devons fournir ici quelques données car en fait tous nos clients doivent savoir quelle colonne nous devons supprimer. C'est là que, en tant que deuxième paramètre, je veux fournir une colonne de points de données. Et dans ce cas, nous recevons suffisamment d'informations à tous nos clients concernant notre suppression de colonne. Maintenant, nous pouvons revenir à l'intérieur du composant de la carte et voici notre écoute. Et en fait, nous écoutons nos chroniques, supprimez le succès. Et ici, ce que nous récupérons n'est pas une colonne, mais juste la chaîne que nous voulons supprimer. C'est pourquoi nous pouvons écrire ici qu'il s'agit d'un ID de colonne et il s'agit en fait d'informations suffisantes pour le client supprime une colonne. C'est pourquoi nous pouvons désormais appeler board service point. Et voici notre colonne de suppression. Et à l'intérieur, comme vous pouvez le voir, nous fournissons la colonne D, et c'est exactement ce que nous avons ici depuis notre back-end. En fait, nous avons tout implémenté pour notre fonctionnalité. Allons voir si ça fonctionne. Tout d'abord, vérifions le backend nous avons ici un problème. La colonne Supprimer n'existe pas sur le type et voici les colonnes. Allons voir ça. Je vais revenir à l'intérieur de nos manettes, et voici notre tableau de suppression. Voilà donc le problème. J'ai copié la méthode Delete Board collée, mais ils ne l'ont pas renommée. Il devrait s'agir d'une colonne de suppression. Vérifions-le encore une fois. Je l'enregistre et je saute dans la console. Et comme vous pouvez le constater, nous n'avons aucune erreur. Voyons maintenant notre client. Tout va bien. Passons donc à notre tableau. Comme vous pouvez le constater, nos pages fonctionnent. Et maintenant, je peux cliquer dessus pour supprimer, par exemple, cette colonne complète. Je clique dessus et comme vous pouvez le voir, il a complètement disparu. Et ce qui est plus intéressant, nous pouvons dupliquer l'onglet et essayer de supprimer la colonne suivante, F, d, d, etc. Je frappe ici croix et elle est supprimée non seulement ici, mais aussi dans cet onglet. Et tout est automatiquement mis à jour, ce qui signifie que nous avons réussi supprimer les colonnes de notre application. 41. Mettre à jour la colonne: Dans cette vidéo, nous devons implémenter l'une des dernières fonctionnalités de notre tableau, savoir la mise à jour de la colonne. Et comme vous pouvez déjà le comprendre, il sera très similaire de supprimer la colonne. La seule différence est que nous aurons un intérieur des terres par rapport à la mise à jour, mais beaucoup de choses resteront exactement les mêmes. une réunion, je suis un événement socket où l'obtenir sur le backend et quand nous définissons tous nos clients, c'est y. Implémentons-le ensemble maintenant, tout d'abord, je veux revenir à l'intérieur de notre serveur types de sources. Et ici, nous devons créer des événements de socket internes dans nouveaux types et une boule de poils à la note des colonnes de tête, je peux le copier-coller et renommer deux colonnes de mise à jour. Nous aurons donc ici les colonnes Mise à jour, mises à jour des colonnes, le succès et l'échec. Ici, sur la droite. Ensuite, nous pouvons le modifier pour le mettre à jour. Puis un succès de date de naissance et un échec de mise à jour après ce retour de lithium dans notre sororité S et ici et votre propre événement. Donc ici, je copie la suppression de colonne collée, et changeons-la pour la mise à jour de nos colonnes que nous venons de créer. Et ici, nous utilisons notre contrôleur de colonnes, mais ici nous n'obtenons pas une colonne de suppression mais une colonne de mise à jour. Maintenant, nous devons créer cette action, mais en fait nous pouvons la copier-coller depuis nos tableaux car ici nous avons déjà implémenté le tableau de mise à jour et il sera super similaire. C'est pourquoi je veux copier-coller complètement et coller en bas à l'intérieur de notre contrôleur de colonnes. Ici avec tout d'abord, il faut changer le nom. Nous avons donc ici notre colonne de mise à jour et en fait je veux garder exactement la même chose avec la pauvre dame et les champs. Nous avons donc exactement la même structure. C'est là que la seule chose dont nous avons besoin est l'ID de colonne, qui est une chaîne. Le seul champ que nous mettons à jour ici est notre titre. Changeons maintenant notre contenu. Ici, nous aurons des événements de socket dans m et ici ont été créés échec de mise à jour de colonne. Et changeons aussi notre piège ici sera également l'échec de la mise à jour de la colonne. Nous devons maintenant changer de logique. Au lieu du modèle de Bohr, nous aurons ici le modèle de colonne et nous le ferons affiner à la fin de la mise à jour. C'est très bien. Mais ici, nous voulons obtenir non pas un tableau, mais une colonne par un identifiant de colonne. Et ici, nous avons des champs de données. C'est tout à fait normal et la colonne mise à jour en arrière et le tableau non mis à jour. Maintenant, nous voulons émettre à tous nos clients notre événement, qui sera le succès de la mise à jour des colonnes. Et ici, nous devons fournir notre colonne mise à jour afin qu'ils puissent la modifier sur le client. Notre backend est un succès, il a changé. Nous devons maintenant mettre à jour notre client. Et tout d'abord, je veux copier/coller ces trois nouveaux événements, qui sont les colonnes mise à jour, succès et échec. Revenons maintenant à l'intérieur de l'application source de nos clients. Et ici, nous n'avons pas dit de perdre nos types d'événements socket. Et ici, en bas, j'ajouterai colonnes succès et échec de la mise à jour. Maintenant, nous voulons changer notre service de chemises, qui est responsable de faire des demandes à notre API. Voici les colonnes des services et nous avons déjà implémenté la colonne de suppression, mais nous devons maintenant faire notre nouvelle colonne de mise à jour de méthode. Ici, nous savons déjà ce que nous obtenons. Nous obtenons ici notre identifiant de tableau, qui est une chaîne. Après cela, nous obtenons notre ID de colonne, qui est également une chaîne. Enfin et surtout , nos champs, qui sont un objet avec un titre, qui est une chaîne. Et de retour, nous sommes annulés parce qu' ici, nous émettons simplement un événement. C'est là que se rencontrent les sockets service Datta et nous voulons utiliser ici socket même les voir point. Et ici, nous avons l'action de mise à jour de nos colonnes comme deuxième paramètre. Nous devons tout fournir. Tout d'abord conseil AT deuxième colonne nécessiteux. Enfin, les films. Et grâce à cela, notre service est complètement prêt. Nous devons maintenant mettre à jour notre service de conseil afin de pouvoir modifier notre composant. C'est pourquoi je vais sauter dans notre application, Board Services, Board service. Et ici, nous avons déjà créé un tableau de mise à jour des méthodes. C'est ici que nous allons créer notre méthode de colonne de mise à jour. Et nous savons que ce groupe souhaite mettre à jour un seul enregistrement dans notre tableau. Et ici, la seule chose que nous voulons obtenir est une colonne un peu datée. C'est ce que nous avons obtenu de notre back-end. Ici. Nous obtenons l'interface complète de la colonne et nous voulons être annulés. Maintenant, voici notre idée. Nous devons cartographier chaque colonne et mettre à jour cette colonne tous les jours. C'est ainsi que nous pouvons récupérer nos colonnes mises à jour. Et ici, nous voulons tout d'abord tirer la valeur de notre flux. Donc, ici, nos colonnes recevront la valeur et nous allons mapper à travers ce tableau. Voici donc la carte et nous avons accès à chaque colonne ici nous devons écrire notre logique. Donc, si notre identifiant de colonne que nous parcourons en boucle est égal à notre identifiant de point de colonne mis à jour, alors nous devons faire notre magie. Et si ce n'est pas le cas, nous voulons simplement retourner notre chronique sans mise à jour. Maintenant, que voulons-nous faire dans la boucle 1 pour mettre à jour cette colonne spécifique. C'est pourquoi je souhaite fusionner notre colonne avec le titre. Et ici, nous fournissons un titre de point de colonne mis à jour. Dans ce cas, nous ne mettons à jour qu'une seule veste lorsqu'elle correspond. Dans un autre cas, il suffit de renvoyer notre colonne. Après cela, il ne nous reste plus qu'à mettre à jour notre flux avec ces colonnes. Nous sommes fournis dans nos colonnes mises à jour, donc notre méthode est complètement prête. Il ne nous reste plus qu'à mettre à jour notre composant. Revenons donc à l'intérieur de notre composant de tableau, et nous avons ici le titre de notre colonne, mais au lieu d'un simple titre , nous devons suivre la tendance ici. Essayons-le en ligne, et fermons-le directement ici. Maintenant, tout d'abord, nous devons définir ici notre classe qui sera ajoutée sous forme de colonne. Ensuite, nous devons fournir le texte par défaut. Et ici nous voulons écrire le nom de notre colonne, qui sera colonne, le titre, mais doit également fournir ici une valeur. C'est y, voici le titre, qui est le titre de notre colonne. Et le dernier est notre rappel, qui est géré par soumission. Et en fait, cette méthode nous pouvons nommer, mettre à jour, le nom de la colonne, et à l'intérieur, nous obtenons Festival, notre événement, qui est en fait le nom de notre colonne. Et ici, nous devons également fournir l'ID de colonne car ce n'est pas le cas Groupon sait pour quelle colonne nous voulons mettre à jour cet écran spécifique. Maintenant, créons cette méthode dans notre composant. Donc, en bas, je veux ajouter le nom de la colonne de mise à jour. Et voici tout d' abord le nom de notre colonne, qui est la chaîne de notre amusement intérieur. Et deuxièmement, nous obtenons ici notre identifiant de colonne. Dans ce cas, nous savons ce que nous devons mettre à jour et ce que nous voulons faire ici. Nous voulons simplement appeler notre méthode à partir de shred columns. C'est y, ici, ce service de colonne, et voici notre colonne de mise à jour de méthode que nous venons de créer. Tout d'abord, nous devons fournir ici notre ID de tableau, ID de colonne, ainsi que nos champs. Dans notre cas, nous n' avons qu'un seul champ, qui sera notre titre, qui est le nom de notre colonne. Du côté client, tout est prêt, mais il faut s'abonner au succès d'une date de naissance dans la colonne. C'est pourquoi nous devons aller ici en haut, sur maintenant un service socket. Et en fait, nous avons déjà notre mise à jour du tableau, ce qui signifie en fait que je veux copier-coller lignes et les modifier. Parce que de retour, nous aurons interface de notre colonne après avoir mis à jour notre colonne. Et en fait, ici, nous voulons nous abonner pour les appeler succès de mise à jour. Et ici, nous ne recevons pas de tableau mis à jour, mais nous recevons un numéro de colonne mis à jour devons appeler une autre méthode de notre service de forum. Et cette méthode sera mise à jour de la colonne. Et à l'intérieur, nous fournissons notre colonne mise à jour, ce qui signifie qu' avec ce code, tous nos clients seront avertis et nous mettrons à jour cette colonne particulière. Voyons si cela fonctionne ici sur le backend, tout va bien. Ici, sur le client, nous n'avons aucune erreur. Passons au navigateur. Et comme vous pouvez le voir ici, j'ai ce joli nom et maintenant je peux cliquer dessus parce que c'est notre entreprise intérieure et pas seulement le titre. Maintenant, essayons-le ici, mis à jour et j'appuie sur Entrée. Et comme vous pouvez le voir, il a été mis à jour et reporté le chargement de la page, puis ce code est également taché, qui signifie en fait que nous avons réussi ce changement sur le backend et ils l'ont fait tous nos clients. Et ici, si je passe au deuxième onglet, il a exactement la même apparence car il a également été mis à jour et notifié via socket IO. Cela étant dit, nous avons implémenté avec succès notre fonctionnalité de mise à jour dans la colonne. 42. Se désabonner: Dans cette vidéo, je veux parler de désinscription parce qu' en fait, nous avons un problème. Regardons notre test des composants de la carte. Ici, nous avons nos auditeurs d'initialisation et nous utilisons point subscribe pas mal de fois. Et en fait, vous devez savoir que dans Angular chaque fois que vous écrivez le mot subscribe, vous êtes en danger parce que vous y créez un abonnement. Et cet abonnement sera là jusqu'au bout du monde. Ce qui signifie, par exemple, que nous quittons notre conseil d'administration et que nous passons à un autre tableau. Et tous ces abonnements sont déjà là et ils ne seront jamais détruits parce que tous les abonnements n'ont rien à voir avec notre composant et que l'angulaire ne le fait pas n'importe quoi à leur sujet. Mais ici, il est important de mentionner si nous parlons dans Angular de client HTTP, nous ne devons pas nous en désabonner. Ce n'est pas obligatoire car angular se désabonnera automatiquement, ce qui signifie en fait que lorsque nous utilisons ce routeur, abonnez-vous aux événements, c'est tout à fait correct. Ici, nous pouvons également consulter nos données de récupération et ici nous utilisons également abonnez-vous pour nous ennuyer. Et pour cela, nous devons ouvrir notre ennuyer et vérifier ce que nous avons ici. Et en fait c'est un très gros Gad, qui est un client HTTP, qui signifie que ce code est parfaitement correct et que nous ne devrions pas nous désinscrire. Mais en fait, je préfère me désinscrire partout, dans chaque application où un abonnement C, parce que vous ne savez jamais quelle est exactement cette méthode get board ? Est-ce vraiment un client HTTP ou est-ce juste un wrapper ? Et tu dois vraiment te désinscrire. Et la question est de savoir comment vous pouvez vous désinscrire dans votre application pour la rendre plus confortable. Et il existe de nombreuses façons de le faire. Et en fait, nous voulons toujours désabonner lorsque nous détruisons un composant. Et généralement, lorsque ce composant Turner, lorsque nous changeons, ce qui signifie en fait que nous pouvons écrire quelque chose comme cet abonnement au forum est égal. Et ici, nous obtenons le résultat de notre abonnement et le résultat de l'abonnement subscribe easy, qui signifie en fait créer cette propriété en masse , puis directement dans notre moteur, Détruire l'abonnement Boards point désabonnement. C'est tout à fait valide, mais ensuite nous allons créer de nombreuses propriétés et ce n'est pas très confortable. C'est pourquoi il existe de meilleurs moyens de le faire. Je voulais vous montrer une approche simple que vous pouvez utiliser. Ce que je veux faire dans mon composant de tableau, je veux créer une autre propriété et ils veulent nommer cette propriété se désinscrire. Et en fait, je veux mettre le dollar ici parce que ce sera un flux. Et ici, je veux assigner un nouveau sujet et en fait aussi le sujet comportemental des jeunes au sein de notre service de conseil. Mais ici, nous avons un nouveau sujet avec void, et je l'appelle simplement, la principale différence entre le sujet et le sujet comportemental est le sujet comportemental a toujours une valeur initiale et alors disons, sujet, nous n'avons aucune valeur initiale. Maintenant, nous voulons ajouter des outils sur destroy, ce qui signifie en fait que nous devons créer en G lors de la destruction. Et maintenant, nous parlons ici de l'Allemagne dedans. Et ici, nous pouvons écrire en juin destroy et ce que nous voulons faire à l'intérieur, nous voulons écrire ce point de désabonnement ensuite, donc nous allons colonne la valeur suivante. Et après cela, ce point de désabonnement est terminé, ce qui signifie qu'après avoir détruit ce composant, nous ne voulons pas obtenir de nouvelles valeurs dans ce désabonnement. Et maintenant, nous pouvons utiliser ce désabonnement partout pour ignorer les abonnements. À quoi ressemble-t-il ? En fait, ici, nous n'avons pas besoin de l'utiliser, mais nous devons l'utiliser dans le service socket car il s'agit d'un abonnement personnalisé. Et pour le faire avant de nous abonner, nous pouvons simplement l'essayer point pipe et à l'intérieur nous voulons utiliser la méthode take until et à l'intérieur ils veulent mettre ce désabonnement que nous venons de créer, ce qui signifie en fait que nous prenons, d'accord, nous devons prendre de nouvelles valeurs et avoir cet abonnement jusqu'à ce que ce désabonnement soit valide. Au moment où nous sommes Colin avec Bond, venez ici pour nous abonner. Ce qui signifie en fait que dans chaque cas, lorsque nous avons un abonnement, nous pouvons simplement l'essayer avant par adhésion jusqu'à ce désabonnement. Et nous sommes prêts à occuper de la destruction de nos composants . Ici, nous aurons terminé et cette logique ne se produira jamais. C'est vraiment une variante confortable et facile à mettre en œuvre, se désabonner. C'est pourquoi je souhaite copier-coller ce code et le mettre dans chaque leçon que nous écrivons ici juste avant de m'abonner. Dans ce cas , nous sommes du bon côté, et nous n'appellerons pas ce code après avoir détruit un composant. Maintenant, vous voulez certainement savoir si cela fonctionne vraiment comme ça. C'est pourquoi, pour le tester, nous pouvons simplement commenter les prises jusqu'à ce que, par exemple, dans les colonnes, les mises à jour d'accès. Mais en fait, cela ne fonctionnera pas comme ça parce que lorsque nous quittions le forum, Bacon arrête d'envoyer des événements pour demander, c'est pourquoi ce que nous pouvons faire juste pour les tests est défendu dans les colonnes des contrôleurs. Et voici notre colonne de mise à jour de méthode, et ici nous avons notre fonction sont vos deux. Et ici, nous devons trouver uniquement les clients qui se trouvent dans cette partie spécifique. Juste pour des raisons de test, je vais supprimer ici pour avertir tous les clients parce qu'ils veulent vous montrer que cet abonnement est toujours là quand nous quittons le forum. Alors maintenant, je veux juste essayer de me connecter à la console. Colonne mise à jour. Voici notre rubrique mise à jour. Allons voir ça. Je recharge la page, je passe à ce point et j'essaie de mettre à jour la colonne. Comme vous pouvez le voir, il s'agit de notre journal de console, et ici nous avons également le journal de la console. C'est très bien. Mais maintenant, nous retournons à nos planches, nous n'avons rien et notre composant a été détruit. Maintenant, dans le deuxième onglet, nous allons mettre à jour cette colonne. Et comme vous pouvez le voir ici, insérez la première étape. Nous avons cette colonne mise à jour et nous l'obtenons parce que cet abonnement est toujours suspendu avec ne pas désabonner de notre code et indiqué pour le faire, nous pouvons simplement décommenter jusqu'à ce que , Essayons ça. Maintenant, nous allons plonger dans notre application. Nous recevons une colonne mise à jour où le champion revient à nos tableaux. Et maintenant, nous pouvons essayer de mettre à jour notre chronique. Mais comme vous pouvez le voir dans la première étape, nous n'avons pas reçu de message car ici, il n'a pas été soumis à cette prise avant, est pourquoi il est si important de se désinscrire de tous nos abonnements. Maintenant, changeons ce code. Tout d'abord, nous n'avons pas besoin de ce journal de console. Et deuxièmement, je vais sauter dans les colonnes de notre contrôleur et changer le code en ID de base de données i2. Donc, dans la vraie application, je vous recommande vivement de vous désinscrire de tous vos abonnements. 43. Module de tâche et composant de base: Dans cette vidéo, nous commençons nouvelle fonctionnalité intéressante, puis parlons ici du modèle de tâche de fonctionnalité. Qu'est-ce que cela signifie ? En fait, comme vous pouvez le voir ici, où à l'intérieur du tableau et lorsque nous cliquons sur tâche spécifique à l'intérieur de ce point, en fait, nous devons ouvrir ici un modèle, mais ce n'est pas aussi simple que cela, parce que ce que nous voulons pour ce faire, nous voulons modifier notre itinéraire. Maintenant, nous avons le slash board slash board Id. Et en fait, lorsque nous ouvrons une tâche après le rechargement de la page, nous voulons voir la même tâche. Et le moyen le plus simple de l'implémenter est évidemment le routage. Nous voulons donc, au moment où nous sommes ouverts, une URL de tâche comme barre oblique ID du tableau barre oblique tâches slash KD de la tâche, ce qui signifie en fait que nous avons un itinéraire imbriqué à l'intérieur du tableau. Et en fait Angular nous permet de gérer très simplement les sécheresses des enfants. Pourquoi avons-nous besoin d' une sécheresse infantile ? Parce qu'ils sont ici, nous voulons tout d'abord rendre l'ensemble du tableau et en plus rendre ce modèle, qui signifie en fait que notre modèle, sera ici en haut et en dessous de notre modèle, nous verrons l'ensemble du conseil. Et c'est extrêmement important parce qu'en fait, même à l'intérieur du modèle, nous allons même à l'intérieur du modèle, récupérer le tableau complet. Et en fait, tout ce composant sera rendu tel qu'il est sans aucune modification. Et ce qui est également intéressant dans notre modèle de tâches, nous utiliserons ces informations du tableau, et c'est exactement ce que nous avons implémenté ici. Ici, dans notre source client, notre application, services de conseil, notre service Bot, nous avons trois flux. Notre colonne de tâches et, mais, et c'est incroyable parce que maintenant, dans notre modèle de tâche, nous pouvons lire toutes nos tâches, trouver la tâche nécessaire par cet ID dans l'URL que nous allons implémenter dans une seconde , puis Il suffit de rendre ces informations de la tâche sans demandes supplémentaires. Et dans cette vidéo, je veux commencer par les bases de ce modèle de tâches. Ici, nous voulons créer un composant de base et lier correctement notre route. Et pour cela, je veux revenir à l' intérieur de notre module de carte. Et voici notre itinéraire avec des tableaux slash, slash board Id. Et ici, nous voulons avoir une sécheresse infantile. C'est ici que nous pouvons écrire des enfants et c'est un tableau. Ici, nous avons également un objet avec un chemin, qui sera une barre oblique Tâches. Et voici l'ID de la tâche, ce qui signifie que nous prenons ici le chemin parent et le chemin enfant. Et ensemble, nous aurons notre chemin d'identification de tâche ici, mais nous devons également fournir un composant que nous créerons en une seconde. Il s'agit de notre composant de modèle de tâches. Mais nous n'avons pas non plus mis en œuvre de changement de route. Et pour cela, je veux sauter à l'intérieur de notre carte de composants. Et voici le composant HTML acheté. Et comme vous pouvez le voir ici, nous avons un lien vers notre mission. C'est cette tâche de classe div, et voici l'énergie pour la boucle. Et en fait, nous voulons écrire un événement click. Et voici ce que nous voulons faire, nous voulons ouvrir une tâche. Et pour cela, nous avons juste besoin de notre identifiant de point de tâche et ce que nous voulons faire dans cette méthode, c'est simplement changer de route. C'est par ici. Créons cette tâche ouverte dans le composant board. Et ici, nous obtenons notre ID de tâche, qui est une chaîne. Le dos devient vide. Et maintenant, nous pouvons simplement utiliser notre routeur pour changer de route. Ici, nous pouvons écrire ce routeur point navigate, et nous utilisons here navigate et non navigate by URL parce que nous voulons passer à l'intérieur d'un tableau. Ici. Tout d'abord, nous avons des tableaux, puis nous concaténons cette chaîne avec cet ID de tableau, puis une virgule. Et nous avons ici nos tâches, et ici nous aurons notre ID de tâche. Comme vous pouvez le voir, il est beaucoup plus simple d'écrire navigate avec array, puis de naviguer par URL, où nous devons concaténer cette chaîne nous-mêmes. Notre événement click est donc complètement prêt, et il ne nous reste plus qu'à créer ce nouveau composant. C'est pourquoi, à l'intérieur de notre carte, nous parlons toujours de composants d'insert de module de carte. Nous voulons créer notre nouveau composant et ce sera notre modèle de tâche. Maintenant à l'intérieur avec tout d'abord, besoin de créer un modèle de tâche Ts et aussi un composant point de modèle de tâche point HTML. Et maintenant, dans le code HTML, je veux directement ancrer l'ensemble du balisage de notre modèle sans aucune logique. Dans ce cas, nous pouvons voir directement que le terme modèle fonctionne et que le routeur fonctionne également. C'est ici que nous allons écrire l'ensemble du marché. Donc ici tout d'abord, nous avons notre conteneur de modèle de tâche de classe, et ici nous ne lierons aucune donnée pour le moment. Maintenant, à l'intérieur de cette div, nous devons l'essayer encore plus profondément, et ce sera notre en-tête modal de tâche. Fermons cette div et à l'intérieur, nous afficherons plus tard le titre de notre tâche sous forme de ligne. Et après notre forme intérieure, nous avons besoin de rendre une image. Et en fait, ici sera source slash assets slash fermer l'icône point SVG. Et ici, nous devons également fournir une classe qui sera une tâche. Modèle proche et en fait je ne l'ai pas écrit correctement. Cette image doit figurer après le titre de la tâche entreprise en ligne. Nous parlons donc ici de l'en-tête modal de la tâche. Et après l'en-tête modal du crépuscule, nous voulons créer la prochaine div, qui sera le corps modal Task. Fermons ici notre div et à l'intérieur nous voulons créer un motif car nous devons regrouper nos éléments. Donc, à l'intérieur de cette div, nous voulons créer notre formulaire plus tard. Vous pouvez vous demander, d'accord, mais pourquoi nous utilisons le cabinet Justin Lin et ici nous voulons créer un vrai cabinet parce que plus tard, nous aurons également besoin d'une sélection pour changer notre colonne. C'est pourquoi il est beaucoup plus facile à utiliser pour ce forum. C'est par ici. Créons un formulaire pour l'instant sans aucun groupe ferme, il suffit de fouetter le verre. Et ici, nous aurons notre conteneur de sélection de colonne. Fermons ce formulaire. Et dans notre formulaire plus tard, nous allons afficher ici une sélection, mais pour l'instant nous ne l'avons pas. C'est ici, il suffit de sélectionner la colonne. Et après cette entreprise voudra créer un motif où nous aurons notre description de modèle de tâche. Et ici, nous aurons notre div avec l'étiquette de description du modèle de tâche de classe. Et puis nous allons simplement écrire une description de mot. Après cette div, nous aurons un formulaire en ligne pour notre description. Voici donc la description du formulaire en ligne que nous allons créer ultérieurement. Et maintenant, après cette div que nous avons créée, il faudrait créer un motif. Et ici, nous aurons nos actions de modèle de tâche à l'intérieur avec tout d'abord, aurons besoin d'une classe supplémentaire et ce seront actions de modèle de tâche étiquetées et dans cette div, nous allons simplement écrire des actions. Et après cela, nous devons créer une autre div. Et à l'intérieur de cette div, nous allons emballer un motif avec classe, tâche, modèle, actions, action. Ici, fermons cette div et puis à l'intérieur nous pouvons rendre une image avec des acides slash source slash trash SVG. Et voici notre classe qui sera chargée de l'icône des actions de modèle. Et après la seconde, nous allons simplement rendre un mot supprimer. Et après tout le balisage à la fin, nous devons rendre une toile de fond, afin que l'ensemble de notre tableau soit un peu caché. C'est ici que nous devons créer div avec toile de fond du modèle de tâche de classe ici Fermons cette div afin que notre balisage soit complètement prêt. Il ne nous reste plus qu'à créer ce composant. Créons d'abord ici une classe qui sera notre composant modal de tâche. En haut, nous avons maîtrisé notre composant, et inscrivons-nous à l'intérieur. Tout d'abord, un sélecteur, il sera chargé modèle. Et après cela, une URL de modèle et soudée, plus il est lourd composant modal HTML, mais ce n'est pas tout. Nous devons fournir une classe supplémentaire pour l'ensemble de l'enveloppe de ce composant. Dans ce cas seulement, notre marché sera correct. Et ici, nous devons directement lier l'hôte. Et là, je donne un cours de perspicacité. Ici, nous pouvons écrire des classes égales au modèle de tâche. Et si vous n'avez jamais écrit quelque chose comme ça, nous utilisons une telle notation lorsque nous n'avons pas besoin d' appliquer cette classe au plus profond de ce composant, mais nous voulons exactement appliquer une classe sur notre élément composant. Nous avons donc créé quelques composants de base. Voyons maintenant si cela fonctionne. Alors Festival ici, nous avons beaucoup d'erreurs. Par exemple, ici dans le module de tableau ne peut pas trouver le composant modal de la tâche. Donc tout d'abord, nous devons sauter à l'intérieur de notre module de carte. Et ici, nous devons entrer notre composant de modèle de tâche. Et nous devons également le fournir ici dans la déclaration, il s' agit d'un composant de modèle de tâche. Vérifions-nous à nouveau avec ne pas avoir d'erreurs ici. Je vais recharger la page et ils ne voient aucune erreur dans la console maintenant. Mais ce que nous devons faire maintenant, nous devons cliquer sur l'une des tâches. Par exemple, voici ma première tâche et je ne fais que cliquer. Comme vous pouvez le voir, il ne s'est rien passé. Mais à l'intérieur de la sécheresse, nous pouvons voir maintenant slash boards, slash notre board ID, slash tasks et slash le d de notre tâche que nous venons d'ouvrir. Et maintenant, vous pouvez vous demander, d'accord, mais pourquoi nous ne voyons pas notre composant et en fait nous n'avons pas tendance à l'exutoire pour nos enfants, ce qui signifie en fait à l'intérieur de notre tableau, intérieur du code HTML du composant du tableau, quelque part dans notre balisage, par exemple, en bas, nous devons afficher Zhao Outlet comme nous l'avons fait dans notre composant d'application. Alors, fermons simplement la prise du routeur et maintenant cela doit fonctionner. Je vais recharger la page. Et comme vous pouvez le voir, nous voyons notre modèle par là parce qu'en fait c'est la route. Et maintenant, chaque fois que je recharge la page, nous voyons notre parent en arrière-plan. Et ici, nous voyons notre modèle et avons déjà un balisage de base pour ce modèle, qui signifie qu'il fonctionne pleinement. Mais maintenant je veux corriger un énorme écueil qui sera super difficile de déboguer ce dont je parle. Comme vous pouvez le voir ici à l'intérieur de notre composant de tableau, nous avons ici une vérification d'itinéraire et en fait ici, en haut, nous nous sommes abonnés aux étoiles de navigation de cet événement. Et ici, nous déclenchons la naissance vivante. Que fait le live board ? En fait, nous rencontrons un événement socket pour notre back-end, ce qui signifie que nous sommes en train de nous désinscrire dans ce socket actuel, notre utilisateur actuel de vous est allé sur ce point, qui en fait signifie que nous en étions là, slash board slash AD. Et maintenant, nous obtenons des événements. Tout va bien. Mais au moment où nous ouvrons notre modèle, nous avons changé de cap. Et en fait, cela signifie que nous sommes ici dans cette IV et que nous voyons ici en direct ce que nous pouvons facilement vérifier. Par exemple, ici je vais simplement l'essayer en direct, mais je recharge la page. Ça a l'air bien. Mais quand je saute nos tableaux et que je clique simplement sur ma première tâche. Comme vous pouvez le voir ici, nous allons quitter le conseil. Ceci est complètement redessiné car dans ce cas, nous ne recevrons aucune notification dans notre forum, mais nous avons déjà quitté le forum. C'est le comportement de Sean parce que nous ne voulons pas vivre une planche. Si nous ouvrons simplement le modèle, nous voulons toujours être sur cette page, mais nous pouvons le faire pour le réparer, nous avons juste besoin de vérifier notre itinéraire de barres obliques. Parce qu'en fait, si ici , au milieu de la sécheresse, nous avons des tableaux slash, cela signifie que nous restons toujours sur cette page. Parce que si nous revenons sur notre page de tableaux, avons ici que des tableaux à barres obliques et nous n' avons pas de barre oblique. Et puis c'est là que je peux écrire URL de point de fin et non d'événement. Et c'est l'URL complète que nous allons inclure, et nous vérifions que cette barre oblique d' URL spécifique , barre oblique de tableaux. Donc, ici, nous allons déclencher notre tableau de bord lorsque notre navigation a commencé. Et cette URL que nous allons utiliser n'inclut pas la barre oblique du port. Cette barre oblique est soit nos obligations simples, soit notre modèle de panneau unique était. Allons voir si ça fonctionne. Je clique ici sur ma première tâche et maintenant nous ne restons pas partie, qui signifie que tout fonctionnera bien. Et maintenant, mettons-nous en œuvre ensemble. Allez au tableau parce que ce n'est qu'une seule ligne que je veux faire. Je veux me lancer dans notre modèle de tâche. Et ici, en haut, nous avons cette image proche. Et en fait, ici , nous pouvons simplement créer un événement click et le nommer, aller au tableau. Maintenant, nous pouvons sauter directement dans notre modèle de tâche et créer cette méthode, allez dans Bond. Et que devons-nous savoir à l'intérieur cette composante pour accéder à notre tableau, nous devons lire cette année. Eh bien, tout d'abord, notre identifiant de tâche, nous en aurons besoin dans tous les cas. Et ici, surtout, board AD, ce qui signifie que nous allons écrire le même code que nous l'avons fait dans notre constructeur à l'intérieur de board. Alors inscrivons ici notre constructeur. Et à l'intérieur, nous devons d' abord obtenir notre conseil d'administration AT. Pour cela, nous devons utiliser route, ce qui signifie en fait que nous devons injecter notre route, qui est une route activée. Et maintenant, nous pouvons écrire cet instantané de point d'itinéraire, point, params, map, point, get. Et ici, nous essayons d' obtenir notre carte d'identité. Et comme vous pouvez le voir ici, nous sommes sous pression maintenant. C'est pourquoi il est très logique de vérifier si nous avons bien obtenu notre identifiant de tableau. Dans ce cas, nous pouvons enregistrer l'ID du tableau et l' AD de la tâche directement en tant que propriété dans notre composant. C'est ainsi que je veux tout d'abord créer notre tableau AD. C'est une chaîne. Et deuxièmement, tâche Katie, c'est aussi une chaîne. Maintenant, nous pouvons vérifier, accord, dupliquer un tableau. Si ce n'est pas le cas, nous devons lancer une erreur. C'est là que vous entendez une erreur. Et ici, nous pouvons dire impossible d' obtenir l'ID du forum à partir de l'URL. Et maintenant, nous devons faire exactement la même chose pour notre ID de tâche. C'est par ici. Essayons de charger AD et nous essayons d'obtenir une tâche différente. Et maintenant, nous voulons écrire une Eve de plus et vérifier ici pour la tâche AD. Nous pouvons donc écrire ici, impossible obtenir l'ID de la tâche à partir de l'URL. Mais en fait, ici, j'ai fait une énorme erreur c'est que vous pouvez voir que nous avons un identifiant de tableau et un identifiant de tâche, mais avec Taskade, c'est tout à fait correct. Il s'agit de cette carte de paramètres d' instantané d'itinéraire. Mais avec Boyd AD, ce n'est pas bien parce que nous voulons lire toutes ces informations de notre parent. C'est pourquoi ici nous devons essayer route point parent, et ici nous devons mettre un point d'interrogation puis mapper les programmes d' instantanés. Dans ce cas, nous le lirons directement auprès du parent. Et maintenant, après ces deux vérifications, nous pouvons simplement attribuer cette tâche AD, et c'est une chaîne maintenant, et ici nous avons également cet ID de tableau et c' est aussi une chaîne. Maintenant, nous pouvons implémenter la méthode go to board, mais pour cet utérus doit injecter ici. De plus, criez pour changer d'itinéraire. Nous avons donc notre routeur. Et maintenant, à l'intérieur de cette méthode, nous pouvons simplement écrire cet itinéraire et naviguer comme nous le faisions précédemment. Et ici, nous voulons monter à bord. Et comme deuxième paramètre, c'est cette carte. Dans ce cas, l'URL sera points obliques, une barre oblique ID de tableau. Allons voir ça. Je recharge la page ici. Je suis à l'intérieur de la tâche et je clique ici sur Cross. Et après avoir cliqué à l' endroit où ils sautent directement l'identifiant de la barre oblique et, surtout, nous n'avons pas eu de rechargement de page. Nous n'avons pas besoin de récupérer les données pour cette partie, car toutes les données sont là. Et maintenant, nous pouvons simplement ouvrir la deuxième tâche, la fermer, et c'est vraiment fluide et rapide car nous n'avons pas besoin de chercher des informations supplémentaires ici. 44. Obtenez des tâches et des colonnes: Dans ce coupon vidéo pour parler des flux de données au sein de notre modèle de tâches. C'est là que ce sera vraiment intéressant. Pourquoi est-ce que c'est ? Parce qu'ils disposaient déjà des données complètes pour chaque modèle dans notre tableau, nous avons juste besoin d'utiliser ces données et de les cartographier correctement dans le modèle de tâche. C'est là que la première chose que je veux faire est d'injecter ici notre service de conseil que nous avons déjà et non pas le service Boards pour ne pas travailler avec le gâteau, mais notre service de conseil avec l'État. Maintenant, ici, tout d'abord, je veux trouver la tâche. Et en fait ici par exemple, après cet identifiant de carte dans le constructeur, nous pouvons simplement écrire que cette tâche était plus grande et ce sera notre flux de la tâche en cours que nous avons ouverte. Et ici, nous pouvons simplement essayer ce service sportif. Et ici, nous avons notre flux avec toutes les tâches de notre conseil d'administration. Comme vous pouvez le constater, il est déjà disponible, mais nous n'avons pas besoin de l' ensemble de nos tâches. C'est ainsi que boop veut utiliser la carte. C'est ici que nous pouvons écrire par carte, puis citer où accéder à toutes nos tâches. Et maintenant, il ne nous reste plus qu'à trouver une tâche spécifique dont nous avons besoin pour ce modèle de tâche. Donc, ici, je veux simplement renvoyer les tâches, et à l'intérieur, nous aurons accès à chaque tâche. Et ici, nous obtenons simplement cette tâche par AD et nous la comparons à cette tâche AD qui se trouve en haut à l'intérieur du constructeur. Donc, en fait, cela transforme nos tâches de service de stream board. Et ici, nous ne faisons que cartographier la tâche unique et nous la récupérons. Mais ce n'est pas tout en fait après la carte. Je veux écrire un filtre et ici je veux fournir un booléen. Pourquoi faisons-nous ça ? Parce qu'en fait, il peut arriver qu'au début avec ne pas avoir de tâche parce que nous n'avons pas récupéré toutes ces tâches ici, ce qui signifie en fait où sauter dans le constructeur dans notre modèle, c'est notre flux. Tasks est simplement un tableau vide. Ici, nous avons essayé de le trouver et nous ne pouvons pas et nous obtenons un indéfini, mais indéfini qui ne l' intéresse pas rapidement. C'est là que j'ai écrit le filtre booléen et il va juste se débarrasser de chaque indéfini. Maintenant, dans ce cas, ce flux ne sera pas rempli tant que nous n'aurons pas trouvé une tâche. Essayons maintenant d'utiliser ce trim dans notre code HTML. Ici, en haut, nous devons créer un formulaire en ligne, le titre mis à jour de notre tâche. Et nous pouvons simplement écrire ici notre formulaire en ligne qui a déjà été utilisé des centaines de fois. Et puis côté tout d'abord, nous devons définir une classe, et ici nous aurons le modèle de tâche ajouté titre forum. Ensuite, nous voulons définir notre texte par défaut. Et en fait, nous devons fournir le titre de la tâche. Mais encore une fois, je veux l' écrire encore mieux. Nous pourrions utiliser ce flux dans notre code HTML. Mais comme je l'ai déjà dit précédemment, nous pouvons combiner différents flux de données au sein d'une même propriété, et c'est exactement ce que nous pouvons faire maintenant, ici, nous pouvons écrire ces données étaient plus grandes et nous pouvons les utiliser ici combiné dernier, tout comme nous l'avons utilisé précédemment et en fait plus tard, nous n'aurons pas ici juste une tâche au moins devra également obtenir ici une liste de nos colonnes par là, parce qu'en fait nous avons une sélection modifiez la colonne dans laquelle se trouve cette tâche. C'est par ici. Tout d'abord, nous aurons notre tâche et plus tard également élève ici, flux pour les colonnes. Et ici, nous devons mapper toutes ces données et nous voulons convertir notre tableau en objet. Ici. Tout d'abord, nous allons obtenir notre tâche. Ici. Nous avons juste besoin de retourner une tâche. Maintenant, nous devons créer ces données à l'intérieur de ce composant, cette façon ici en haut. Tout d'abord, nous devons changer le dollar des tâches en observable. Et ici, nous obtenons notre interface Task et jamais maintenant parce que nous l'avons vérifiée avec un filtre. Et maintenant, nous avons également besoin de données volées. Et ici, nous aurons également un observable de l'objet. Et nous avons ici notre tâche, qui est une interface de tâches. Maintenant, les données sont prêtes, en fait, dans le code HTML, nous pouvons utiliser ces données directement. C'est là que, sur notre division supérieure, je vais juste l'essayer. Et G, nous avons ici notre flux avec des données en tant que, et ici nous obtenons des données, ce qui signifie en fait que maintenant dans l'ensemble du fichier, nous pouvons simplement utiliser des données. Ceci est ici dans le texte par défaut, nous pouvons fournir une tâche de point de données, un titre de point. Et après cela, nous devons fournir un titre dans le formulaire, ce sera également le titre du point de la tâche de données. Et comme vous pouvez le voir, nous n'avons pas de flux ici, mais en fait, dans les données, nous avons créé une tâche Stream, qui est une chaîne basée sur notre flux où nous avons un tableau de tâches. Et la dernière chose est une sortie ici et ici nous avons notre handle submit, par exemple, update task name. Et ici, à l'intérieur , où organiser un événement. Et ils veulent simplement créer cette fonction à l'intérieur de notre composant. Je n'implémenterai rien ici. Nous obtenons donc le nom de notre tâche. Ce qui est une ficelle, le dos est vide. Et maintenant je veux juste écrire ici le journal de la console. Il s'agit du nom de la tâche de mise à jour, et nous obtenons ici notre nom de tâche. Vérifions-nous si cela fonctionne. Nous n'avons aucune erreur ici et ils vont simplement recharger la page. Et comme vous pouvez le voir directement ici, nous avons ma première mission. Comment fonctionne-t-il ? Ici, nous construisons notre tâche de flux, qui est basée sur nos tâches et après beaucoup de pages quand aucune erreur n'est générée. Et nous pourrions potentiellement l'obtenir. En fait, pas parce que nous avons ici à GE avec Chegg, mais c'est toujours agréable d'écrire un filtre booléen juste pour savoir que nous sommes du bon côté. Et voici notre première tâche à l'intérieur de ce flux de données. Ici, nous pouvons directement changer cela, ma première tâche et mise à jour. Comme vous pouvez le voir, il s' agit de notre journal de console. Évidemment, nous n'avons pas encore implémenté la mise à jour, mais nous sommes sur la bonne voie. Maintenant. Nous pouvons écrire exactement le même code avec la description de notre formulaire en ligne. C'est pourquoi je souhaite revenir en arrière dans notre code HTML. Voici notre description de l'intérieur des terres. Et en fait, ici, nous pouvons simplement l'essayer en ligne comme nous l'avons fait pour le titre. Et ici, nous avons déjà les données à l'intérieur du flux de données. C'est par ici. Tout d'abord, notre modèle de tâche de classe , édition, description, formulaire. Et après cela, tout d'abord, nous avons ici le texte par défaut. Ici, nous allons essayer la description de la tâche de données. Et ici, je veux écrire, ou parce qu'en fait, une description à l'intérieur de la tâche n' est pas obligatoire, ce qui signifie qu'à un moment donné, ce sera une chaîne vide. C'est ici, ajoutez une description plus détaillée. Après cela, nous voulons également définir notre titre. C'est pourquoi la description de la tâche data dot. Nous voulons également fournir ici à l'extérieur, et c'est notre première utilisation de textarea. C'est par ici. Le type d'entrée est la zone de texte a également la propriété Button doit être définie sur true. Et après ce bouton, le texte peut être défini pour enregistrer. Et nous devons également fournir ici que je gère la soumission. Ici, nommez-le, mettez à jour la description de la tâche. Ici, nous obtenons notre événement en fait. Ici, nous devons créer la fonction, mais ce sera exactement la même chose. C'est pourquoi je vais copier-coller, mettre à jour le nom de la tâche et simplement changer le nom et le journal de la console. Mais il ne s'agit évidemment pas d'un nom de tâche mais d'une description de tâche. Nous allons le modifier et le journal de la console et vérifier si cela fonctionne. Comme vous pouvez le voir ici, nous obtenons un type d'erreur non défini. Il n'est pas assignable au type string. En fait, c'est un point valide de TypeScript parce que notre From intérieur veut obtenir juste une chaîne et non une indéfinie ici. C'est pourquoi nous pouvons simplement l' essayer ou une chaîne vide. C'est très bien. Comme vous pouvez le constater, nous n'avons pas d'erreur. Nous obtenons maintenant ma description, qui est une vraie description de notre tâche. Nous pouvons le modifier et appuyer sur Entrée. Et en fait, ici c'est une zone de texte, donc Endo n'aide pas. Nous devons cliquer sur le bouton Enregistrer. Et ici, nous entrons dans la mise à jour de la console , la description de la tâche, ma description, ce qui signifie en fait que notre entreprise intérieure fonctionne et que notre flux fournit également des données rapidement. Et maintenant, parlons des colonnes. En fait, c'est encore plus facile. Nous devons simplement nous lancer , disons modèle de tâche. Et ici, nous avons besoin de ce flux pour les colonnes de notre tableau. Et en fait, nous n'avons même pas besoin de créer une propriété supplémentaire ici à l'intérieur du dernier combiné, je peux simplement écrire ce chien d'assistance de tableau. Et ici, nous avons un flux de colonnes et nous pouvons simplement compresser un tableau de colonnes ici dans ce composant, et c'est parti. Nous voici donc arrivés à notre tâche. Et deuxièmement, les colonnes présentes dans l'objet boop veulent renvoyer ce tableau de colonnes. Et maintenant, nous pouvons utiliser ces colonnes pour créer une sélection à l'intérieur de notre Markov. Donc, en fait, nous avons ici un formulaire et à l'intérieur, nous voulons écrire une sélection. Faisons ça maintenant. Tout d'abord, voici S Select et nous voulons écrire ici nom du contrôle de formulaire parce que nous devons le faire entrer dans Group. Pourquoi faisons-nous ça ? Parce qu' en fait, il est beaucoup plus facile de travailler avec des formulaires réactifs si vous avez, par exemple, un Select. C'est par ici. Créons un groupe de formulaires. Et ici, nous voulons créer, par exemple, un formulaire de colonne. Et ici, à l'intérieur de select, nous pouvons simplement emballer le nom du contrôle de formulaire, et ce sera notre ID de colonne. Et ici, nous devons également fournir la sélection de colonne de classe. Maintenant, dans select, nous voulons afficher toutes nos options et ce sera notre tableau de colonnes. C'est comme ça, option dans G4, nous le rendons ici avec juste une boucle dans nos colonnes parce que nous les avons dans des colonnes de points de données et nous n'avons pas besoin de nous embêter avec des flux ici. Ici aussi, nous voulons utiliser la valeur G et fournir la valeur à l'intérieur de l'option R. Ce sera un point de colonne AD parce que nous les parcourons en boucle. Fermons cette option et exécutons simplement l'intérieur de chaque option du titre. Ici, nous allons simplement lancer le titre du point de la colonne. Allons voir si ça fonctionne. Je saute ici et nous obtenons une erreur et la valeur G est inconnue. Et tout d'abord, nous devons créer notre forme. C'est pourquoi revenons en arrière et définissons notre composant. Et ici, en haut, nous devons créer un formulaire pour une seule propriété. Donc, ici, je vais essayer que nous ayons notre forme de colonne. Et c'est ce FB. Et en fait, nous n'avons pas fait d' injection ici si p. Alors faisons-le maintenant. Si B est comme toujours, juste un générateur de formulaire, et ici nous écrirons ce groupe F B et à l'intérieur nous passerons nos contrôles. Et ici, nous n'avons qu'un identifiant de colonne, mais nous n'avons besoin de rien d'autre. Et par défaut, ce sera le cas. Maintenant, nous avons toujours cette Sarah. Et en fait, parce que nous n'avons pas injecté formulaires réactifs dans notre module de tableau. Nous devons donc revenir en arrière et configurer notre module de carte. Et juste ici, dans le module de formulaires réactifs de saisie, comme vous pouvez le voir, nous obtenons une autre erreur dans notre code HTML. Et ici, nous obtenons des colonnes qui n'existent pas sur l'interface de type Task car en fait nous n'avons pas étendu notre interface. Ici, en haut, nous avons un flux de données et ici nous disons que nous avons juste une tâche et ce n'est pas vrai. Nous avons ici des colonnes, et ce n'est qu'un tableau de notre interface de colonnes, comme vous pouvez le voir maintenant dans notre console sans aucune erreur. Voyons donc ça. Maintenant, je recharge le patient ici, nous avons maintenant notre sélection impressionnante et nous ne voyons aucune valeur parce que nous n'avons pas fourni de valeur par défaut. Maintenant, nous pouvons ouvrir cette sélection et nous pouvons choisir entre différentes colonnes. Et comme vous pouvez le voir, c'est directement nos colonnes que nous avons à l'intérieur du tableau. Maintenant, la seule dernière chose que je veux implémenter, définir la valeur par défaut dans la sélection, car en fait, par défaut, nous avons une colonne et cette tâche est située dans une colonne. Et nous pouvons le faire facilement parce que nous avons des flux. Donc ici, nous pouvons simplement utiliser cette tâche qui a été volée parce que nous avons le flux. Et ici, nous savons que nous obtenons notre tâche et nous pouvons simplement écrire Subscribe ici et nous aurons accès à notre tâche. Et maintenant, nous devons mettre à jour notre formulaire. Nous avons donc ici accès à cette forme de colonne, à quelle valeur, et si vous ne savez pas ce que fait la valeur de hauteur, elle met à jour les propriétés dans le formulaire. Nous devons donc ici fournir un objet avec des champs. Et dans notre cas, il ne s'agit que d'un identifiant de colonne de champ unique. À l'intérieur, nous voulons fournir une colonne idéale pour cette tâche. C'est l'ID de colonne de points de tâche, ce qui signifie en fait à l'intérieur du constructeur lors initialisation où vous vous abonnez au flux de tâches. Et lorsque nous arrivons à notre tâche ici, nous corrigeons la valeur. Comme vous pouvez le voir maintenant navigateur, nous recevons notre première colonne. Mais ce que je n'aime pas ici, c'est que nous utilisons à nouveau subscribe sans se désinscrire. C'est pourquoi je veux faire exactement la même chose que nous avons fait au sein de notre conseil d'administration. Tout d'abord, nous devons créer notre désinscription. Et c'est un sujet d'utilisation où à l'intérieur nous fournissons du vide. Et maintenant, nous voulons créer en G sur la destruction. C'est par ici, des outils sur ce Troy. Et quelque part après constructeur, nous pouvons créer en juin, la grève et la perspicacité avec tout d'abord, je veux appeler ce désabonnement ensuite, puis terminer. Donc, ces désabonnements sont complets. Et après cela, nous ne devons pas oublier avant de vous abonner Write pipe. Et voici jusqu'à ce que nous leur fournissions ces désabonnements que nous venons de créer. Dans ce cas, nous sommes du bon côté surDétruire ce composant. Notre abonnement sera également détruit. 45. Mettre à jour la tâche: Dans cette vidéo, nous devons mettre en œuvre la mise à jour de notre tâche du début à la fin. Et en fait, à l'intérieur d'une tâche, nous avons trois choses différentes. Tout d'abord, nous avons ici un formulaire en ligne pour notre titre, pour toutes les mises en œuvre. Et nous obtenons ici le journal de la console. En fait, il s'agit d'une mise à jour partielle de notre tâche. Nous avons exactement la même logique avec la description. Ici, nous pouvons simplement le modifier et cliquer sur Enregistrer. Mais ici aussi, nous avons un changement de colonne et en fait nous ne l'avons pas du tout géré et nous devons le faire. Et il s'agit également d'une mise à jour de la tâche. Plus important encore, ce sont toutes des mises à jour partielles que nous devons respecter pour notre back-end car nous voulons informer tous nos clients de ce changement à l'intérieur de la tâche, qui signifie en fait que notre logique sera exactement comme précédemment dans la partie, nous émettons quelque chose sur le client, sur le backend, nous faisons quelque chose à notre base de données, par exemple, une tâche de données Web. Ensuite, nous informerons tous nos clients qui sont abonnés à ce forum spécifique. Et la première chose que nous devons faire est de créer de nouveaux événements de socket. Commençons cette fois par le client. Et dans nos types de shred d' application source, nous avons un événement socket. Et en fait, ici je vois des tâches Créer, et maintenant nous avons besoin exactement de la même chose avec la mise à jour des tâches PS. Et ici, nous avons du succès et de l'échec, comme toujours. Et ici, nous pouvons changer le nom en tâches, mise à jour, puis réussite de la mise à jour et échec de la mise à jour. Pour que notre événement soit prêt, Nobu doit implémenter une nouvelle méthode dans les tâches de service de nos chemises, car comme précédemment, nous voulons cacher notre socket à l'intérieur de cette méthode à l'intérieur des tâches de partage. C'est par ici. Créons notre méthode qui mettra à jour la tâche. Ici. Tout d'abord, nous obtenons notre identifiant de forum parce que nous devons savoir quels utilisateurs, nous devons avertir. C'est là que vous entendez anniversaire, cette chaîne aura également besoin d'un ID de tâche car nous devons savoir quelle tâche nous devons mettre à jour. Enfin, voici une liste de champs. Et ici, nous aurons un objet où tous nos champs ne seront pas obligatoires. C'est pourquoi je les écris avec un point d' interrogation afin que nous puissions mettre à jour notre titre. C'est une chaîne. Nous pouvons également mettre à jour notre description. Il est également facultatif et chaîne. Et ici, nous avons également notre colonne et notre dame de colonne est l'endroit où se situe notre tâche. Et ici, nous sommes en train de devenir nuls. La seule chose que nous devons faire ici, c'est socket meet. C'est pourquoi Socket Service Summit. Et ici, nous voulons utiliser notre nouvelle méthode, événements de socket en m point. Et nous avons ici nos mises à jour de tâches commencent ici en tant que deuxième paramètre, nous devons fournir un objet avec tous ces champs. Tout d'abord, il s'agit d'un rayon de bordure, puis d'un ID de colonne, puis de notre objet avec des champs. Comme vous pouvez le voir ici, j'ai fait une faute de frappe. Ce n'est pas une continuité mais un ID de tâche et cause de TypeScript avec voir directement une erreur. Nous pouvons donc maintenant revenir en arrière et définir notre composant et effectuer les modifications nécessaires. Et voici le nom de la tâche de mise à jour et la description de la date. Dans les deux cas, nous voulons appeler cette méthode de tâche de mise à jour. C'est ainsi ici au sommet avec tout d'abord, il faut injecter ces tâches service qui viennent d'être mises à jour. Et c'est un service de tâches. Après cela, nous pouvons simplement écrire ici ce service de tâches, et voici notre nouvelle tâche de mise à jour de méthode, puis la dire. Tout d'abord, nous devons choisir un tableau À cet ID de tableau ici est d' une tâche ou avons-nous ici l'ID de la tâche ? Oui, nous l'avons défini ici dans le constructeur. Donc ici nous pouvons également écrire ce point fait KD, et ici nous avons nos champs. Dans ce cas, il suffit de mettre à jour le titre. C'est ainsi que nous pouvons dire title, Task, Name, et comme vous pouvez le voir ici, nous obtenons un identifiant de colonne de propriété étrange qui manque dans le type, ce qui signifie en fait que j'ai fait quelque chose de mal. Et ils voient déjà le problème ici. La dame de colonne est également facultative. Il ne doit pas toujours y être. C'est ici qu'il en est. Vous pouvez voir maintenant que nous n'obtenons pas d'erreur car tous nos champs peuvent être indéfinis. Et ici, nous avons juste besoin de fournir un titre. Nous avons donc mis à jour le nom de notre tâche. Maintenant je peux copier-coller ce code et mettre à jour ici notre description. Ici, je vais simplement fournir une description, et c'est notre description de tâche à partir du paramètre et c'est maintenant la partie la plus intéressante. Nous devons gérer ce changement de sélection unique. Et en fait, c' est une forme réactive, ce qui est en fait une bonne chose parce que nous pouvons réagir aux changements de manière complètement réactive. Ce que je veux écrire ici est cette forme de colonne de points Gad. Et ici, nous pouvons obtenir notre identifiant de colonne, mais en fait ici nous voulons réagir aux valeur et les changements de valeur réels nous donneront un retour et seront observables, ce qui signifie en fait que nous pouvons écrire ici Souscrire. Mais comme vous pouvez le voir ici, nous recevons un avertissement de TypeScript indiquant que ce champ peut être présent, mais pas dans notre cas, parce que dans notre cas, il est toujours dit que c'est là que nous peut supprimer cet avertissement simplement en utilisant bank here. Dans ce cas, nous disons TypeScript, ne vous embêtez pas avec la vérification de la présence de cette propriété. Et comme vous pouvez le voir ici, les changements de valeur sont observables. C'est là que je peux maintenant simplement essayer, m'abonner, puis obtenir ce qu'il y a à l'intérieur cette dame de colonne après le changement, qui signifie en fait manger cette dame de colonne quand elle était mis à jour. Et maintenant j'ai juste besoin d' écrire le journal de la console d'insertion. ID de colonne modifié. Et ici, nous pouvons vérifier si cela fonctionne vraiment. Rechargeons la page. Comme vous pouvez le voir ici dans la console, je suis en train de changer de colonne D, et voici notre ID de colonne. Et en fait c'est un problème parce que ce que nous voulons faire maintenant dans cet abonnement, nous voulons déclencher un changement pour le back-end, comme nous l' avons fait ici avec la tâche de mise à jour. Mais cela n'a aucun sens de le déclencher au début lorsque nous avons le même identifiant de colonne, nous voulons vraiment trop délicat lorsque nous le modifions. C'est pourquoi nous pouvons écrire ici. Nous pouvons vérifier si la colonne a besoin, ce qui a été changé n'est pas la même chose que la moitié valide. Mais là aussi, le problème, nous avons ces informations uniquement dans notre flux de tâches, ce qui signifie en fait que nous devons combiner ces deux flux ensemble. C'est pourquoi nous pouvons utiliser ici lasers combinés comme nous le faisions auparavant. Et ici, nous pouvons fournir, tout d' abord, que cette tâche était plus grande. Et ici, après cela, ce flux que nous avons écrit ici en bas, je vais simplement le coller comme second paramètre. Et ce dernier combiné nous donne un tableau, qui signifie en fait que nous avons accès à notre tâche et ensuite ce qui signifie en fait que nous avons accès à notre tâche et ensuite à notre identifiant de colonne à partir du formulaire. Et ici, je peux maintenant les enregistrer sur console. Ici, je veux voir tout d'abord, la dame de colonne changée et deuxièmement ce que nous avons à l'intérieur de la tâche. Et en fait, ici, nous voulons vérifier l'identifiant de la colonne du lot de tâches . Je recharge la page et nous avons les deux années quatre-vingt. Et comme vous pouvez le voir, ils sont similaires, ce qui signifie que c'est exactement le cas lorsque nous n'avons rien à faire. Donc, ce que nous voulons écrire ici, si notre colonne de tâche D n'est pas égale à notre identifiant de colonne, alors nous devons faire une mise à jour. Ici, nous pouvons simplement écrire ce service de tâches comme nous l'avons fait pour la tâche de mise à jour du bas. Et ici, l'intérieur a été fourni. Et tout d'abord, cet identifiant de tableau, puis la tâche, avons-nous à l'intérieur de l'identifiant du point de la tâche, et voici nos champs. À l'intérieur des champs, nous avons juste notre propriété column id. Comme vous pouvez le voir, JS d' Eric nous aide vraiment à travailler ensemble avec des formulaires réactifs , des flux, nos propres flux ou un chemin extrêmement efficace. Nous pouvons maintenant supprimer ce code commenté. Nous n'en avons plus besoin. Mais ce qu'ils veulent faire ici, je veux écrire pris pour traiter les désabonnés dans ce cas ici, nous n'aurons pas d'abonnement arme de poing. C'est ici que nous devons prendre le tuyau droit jusqu'à ce que nous l'avons déjà fait ici. Et à l'intérieur de ces désabonnements et en fait, notre partie frontale du code est complètement prête. Nous devons maintenant essayer les éléments standard sur le back-end, ce qui signifie en fait que nous devons tout d'abord copier et coller les événements. Ensuite, nous devons créer un nouvel abonnement à cet événement, puis implémenter une nouvelle méthode dans contrôleur pour mettre à jour une tâche. Faisons ça maintenant. Tout d'abord, je veux sauter dans nos événements de socket et mettre à jour les tâches de copier-coller. Après cela, nous pouvons sauter à l'intérieur d'un type de source de serveur. Ici nous avons nos événements de socket et en bas je peux coller ces trois nouveaux événements. Maintenant, nous pouvons revenir à l'intérieur de la sororité S. Et ici, en bas, nous pouvons ajouter une nouvelle tonne de socket. Ici, nous voulons écouter nos événements de socket en m point. Et ici, nous avons nos tâches mises à jour ici avec ne pas vouloir appeler un contrôleur de colonnes, mais un contrôleur de tâches. Et ici, nous avons une nouvelle fonction, tâche de mise à jour, et nous devons fournir des informations sur votre socket et vos données. Il est maintenant temps de créer cette tâche de mise à jour. Et en fait, j'ai besoin de copier-coller à partir de la mise à jour des colonnes car ce sera super similaire comme vous pouvez le voir ici, nous avons la colonne de mise à Je vais copier, coller l'ensemble de la méthode et sauter et dire tâches, et le coller ici en bas. Maintenant, changeons-le ici. Nous avons d'abord notre tâche de mise à jour et nous obtenons ici les données. Alors, qu'avons-nous obtenu des données privilégiées ? C'était une carte d'identité. Ensuite, nous avons ici l'ID de la tâche, et à l'intérieur de nos champs, nous avons trois champs. Tout d'abord, le titre, il est facultatif. Ensuite, nous pouvons obtenir ici la description. Il s'agit également d'une chaîne facultative. Et enfin, notre colonne D, qui est également facultative. Maintenant, mettons à jour notre festival try and catch ici nous vérifions les colonnes mises à jour qui sont dessinées, nous devons le changer pour nos tâches. échec de mise à jour Ici, nous envoyons l'utilisateur n' est pas autorisé, nous devons également changer l' échec à l'intérieur de la cage. Donc, ici, nous aurons également des échecs de mise à jour des tâches. Et maintenant, nous devons changer de modèle. Le modèle de tâche rechercher par ID et mettre à jour fonctionne parfaitement. Et ici, nous avons notre point de données, et ici nous avons notre ID de tâche. Ici, nous jetons simplement tous les champs de données que nous avons à l'intérieur et ils seront simplement mis à jour avec ce que nous avons fourni. De retour, nous recevons une tâche mise à jour et nous voulons envoyer cette tâche mise à jour à notre client. Et ici, nous fournissons l'identifiant du tableau de données. C'est très bien et la demande ici est le succès de la mise à jour des tâches. Et ici, à l'intérieur, nous fournissons notre tâche mise à jour. Nous en avons donc complètement fini avec notre partie back-end, mais nous devons également écrire sur le client une écoute pour informer tous nos clients des modifications. Nous devons donc gérer le sommet sur le client. Et pour cela, il faut retourner dans l'application source de nos clients, Board Services, Board service par ici, parce qu'en fait, nous avons simplement besoin d'écrire une leçon à l'intérieur de nos composants de carte avec besoin d'écrire écouter à l'intérieur du modèle de carte parce que le modèle réellement acheté utilise simplement nos flux d'ici, ce qui signifie en fait qu'il suffit s'abonner à l'intérieur de notre composant de carte. Ici, nous appellerons une méthode pour mettre à jour la tâche dans notre flux de tâches. C'est pourquoi je veux juste regarder notre colonne de mise à jour car elle sera très similaire à notre tâche de mise à jour. Et en fait, nous pouvons le copier-coller complètement. Alors changeons-le maintenant. Nous avons ici notre tâche de mise à jour. Nous arrivons ici à une tâche mise à jour, qui est en fait à l'interface du crépuscule. Ici, nous devons faire exactement la même chose avec juste besoin mettre à jour une seule tâche à l'intérieur de notre tableau. Nous obtenons donc ici des tâches mises à jour et ici nous utilisons nos tâches de flux pour obtenir de la valeur et nous avons accès à chaque tâche. Maintenant, nous sommes en train de vérifier, d'accord, notre ID de tâche doit être égal à notre AD de tâche mis à jour. Dans ce cas, nous devons revenir, étalons cette tâche et nous voulons mettre à jour ici juste un titre. Et en fait, cela n'est pas valide car ici nous devons en revenir plus ici. Tout d'abord, la tâche mise à jour, le titre, mais aussi nous devons mettre à jour ici notre description car il peut arriver que nous l'ayons mise à jour. C'est là que vous entendez la description du point de la tâche mise à jour et le dernier ici sera notre colonne nécessiteuse, et il est également mis à jour l'ID de colonne de points de tâche. Il semble maintenant tout à fait beau. Et dans les autres cas, nous retournons simplement notre tâche. Et après cela, nous devons mettre à jour notre flux de tâches avec des tâches mises à jour afin que notre méthode soit entièrement prête. Il nous suffit maintenant de revenir arrière et de configurer notre carte de composants, notre composant de carte. Et ici, nous devons créer une leçon de plus, une conférence. Je veux retrouver ici notre succès de mise à jour du cône car il sera super similaire. C'est ici. Je vais simplement le copier-coller. Et ici, nous devons le changer. Tout d'abord, de retour, nous obtenons notre interface de tâches et voici succès de la mise à jour des tâches Socrative et C num point. Maintenant, nous avons notre désinscription et retour, nous recevons notre tâche mise à jour. Et maintenant, nous pouvons simplement appeler cette méthode que nous venons de créer, cette tâche de mise à jour. Et à l'intérieur, nous devons fournir notre tâche mise à jour que nous obtenons du backend. Dans ce cas, avec ce code, nous mettrons à jour le flux de tâches pour chaque client abonné à notre page. Voyons maintenant si suivre un code fonctionne ici. Nous n'avons aucune erreur dans le front-end, aucune erreur dans le back-end. Maintenant, ouvrons notre site web et je veux dupliquer l'onglet afin que nous puissions le vérifier avec un autre client. Voici donc ma première tâche et ils veulent juste mettre à jour un titre ici. Écrivons simplement en entier et appuyez sur Entrée. Et comme vous pouvez le voir, il a été directement mis à jour ici, ici sur le tableau. Et à l'étape suivante, il a également été mis à jour, il a également été mis à jour, ce qui signifie en fait que nous l'avons mis à jour avec succès sur le backend, que nous informerons les clients juridiques avec cet abonnement d'écoute lorsqu'il informerons les clients juridiques a été mis à jour le flux et maintenant tous les endroits qui sont abonnés aux flux de façon spectaculaire arrière. Cela fonctionne à merveille. Maintenant, vérifions-nous que nous pouvons modifier une colonne. Je veux donc sélectionner la deuxième colonne, mise à jour et un certain nombre. Et comme vous pouvez le voir directement, cette tâche a disparu de la première colonne, et maintenant elle est ici dans la deuxième colonne. Il a été mis à jour dans notre formulaire. Et ici, à l'étape suivante, nous voyons ma première tâche, qui est également mise à jour dans la colonne suivante. Ce qui signifie que nous avons mis en œuvre avec succès la mise à jour de notre tâche et son déplacement entre nos colonnes. 46. Supprimer la tâche: Dans cette vidéo, nous allons implémenter la dernière fonctionnalité de notre projet, savoir la suppression des tâches. Faisons ça maintenant. Tout d'abord, je veux partir de notre serveur ici, mais je dois sauter dans nos événements de socket de types source, et créer trois nouveaux événements de socket. Parce que nous voulons avertir tous les autres clients qui ont supprimé une tâche. C'est pourquoi nous le ferons via des événements de socket. C'est ici que je vais copier-coller les tâches mises à jour, il suffit de les changer en tâches, de les supprimer. Et ici, sur la droite, nous pouvons le changer en tâches, supprimer, tâches, succès de suppression et échec de suppression de tâches. Après cela, nous pouvons sauter à l'intérieur ces célébrités et de nouvelles tonnes de socket. Nous devons donc le nommer point, et ici nous avons nos tâches supprimer, ce qui est une norme. Et voici notre contrôleur de tâches où nous appelons notre tâche de suppression. Et maintenant, je veux copier-coller notre suppression de la colonne. Ce sera super similaire. Comme vous pouvez le voir ici en haut, nous avons la méthode delete column et ils vont simplement copier et la mettre dans nos tâches ici en bas. Et maintenant, changeons cette méthode. Tout d'abord, ne supprime pas la colonne mais supprime la tâche. Et ce que nous obtenons ici, nous nous ennuyons comme toujours, ils doivent avertir tous nos clients. Et ici, nous devons obtenir juste la tâche Katie, pour savoir ce que nous devons supprimer. Et ici, nous avons notre erreur et nous avons juste besoin d' appeler ici l'échec de la suppression des tâches. Et ici, à l'intérieur de notre cage, nous pouvons également appeler échec de suppression de tâches. Maintenant, au lieu du modèle de colonne, nous pouvons simplement utiliser un modèle de tâche supprimer un point, et nous supprimons simplement notre tâche par ID de tâche que nous avons fourni. Et après cela, nous ne définirons pas tous nos clients avec ces tâches de socket. Supprimez le succès ici Beckwith, il suffit de donner un D à une tâche car nous n'avons pas plus d'informations et ces informations sont suffisantes pour notre client comprenne quelle tâche doit être supprimée. Nous devons maintenant continuer avec le chemin client et pour cela il faut copier-coller ces trois événements de socket que nous venons de créer. Je vais revenir à l'intérieur de la source AB de nos clients, types partagés, des événements de socket. Et ici, en bas, nous pouvons les ajouter. Et maintenant, nous devons mettre à jour notre service pour travailler avec des tâches. Et ce que nous voulons faire ici, nous voulons créer une nouvelle méthode qui supprimera at task. C'est par ici. Créons une tâche de suppression. Et nous savons que nous fournissons simplement ici un identifiant de tableau, qui est une chaîne. Et nous avons également besoin ici de notre ID de tâche, et c'est aussi une chaîne. Et de retour, nous sommes ici nuls. Et maintenant, à l'intérieur, nous pouvons simplement appeler notre image point de service de circuits. Voici comment vous pouvez tâches point cinéma événement socket événement supprimer les tâches point cinéma événement socket événement comme deuxième paramètre. Nous fournissons nos options, qui sont tout d'abord board AT et deuxièmement, notre ID de tâche. Et grâce à cela, notre méthode API est complètement prête. Nous devons maintenant sauter à l'intérieur du module de carte et du service de carte. Et en fait, ici, nous avons besoin d'une nouvelle méthode, tout comme delete column, mais elle sera supprimée de la tâche et en fait le code sera super similaire parce qu'ici nous voulons juste filtrer un de notre tableau. C'est ici que nous allons le changer pour supprimer la tâche, et voici un argument que nous obtenons notre AD de tâche. C'est ici que nous voulons faire une boucle dans notre flux, qui est Task Stream obtenir la valeur ici où j'ai accès à chaque tâche. Et nous comparons notre tâche k, d avec l'identifiant de tâche que nous devons supprimer. Et voici les tâches mises à jour en arrière. Et maintenant, nous voulons mettre à jour notre flux, qui est notre réserve de flux de tâches et vous avez mis à jour le tableau des tâches. Nous avons donc créé avec succès notre tâche de suppression pour l'état du forum. Et maintenant, je veux également supprimer ce commentaire. Nous n'en avons plus besoin. Maintenant, nous devons créer du code HTML pour supprimer notre tâche. C'est là que nous devons revenir en arrière et a déclaré notre modèle de tâche de composants. Et ici, au bas de notre composant de modèle de tâche HTML, nous avons des actions, et ici nous avons une suppression avec une image. Et en fait maintenant sur cette div, nous pouvons simplement ajouter l'événement click et appeler ici une nouvelle méthode qui sera supprimée de la tâche. Créons maintenant cette tâche de suppression dans notre composant. Ici, nous n'avons besoin de rien, nous avons juste besoin de cet ID de tâche et de cet ID de tableau, et nous les avons déjà. C'est pourquoi nous pouvons simplement écrire ce service de tâches Dot Delete Task et nous les fournissons à l'intérieur. Voici donc ce point À cette tâche KD, donc nos clients ont réussi émettre cet événement vers le back-end. Le back-end a mis à jour notre tâche et a informé tous nos clients. Mais en fait, nous devons nous abonner à l'écoute dans différents endroits. Tout d'abord, nous voulons le faire ici dans notre modèle de tâches. Et deuxièmement, dans notre tableau, et en fait à l'intérieur du tableau, nous avons simplement besoin d'appeler cette méthode que nous avons créée Delete Task juste pour mettre à jour un flux. Mais ce que je veux faire ici, je ne veux pas directement à l'intérieur tâche de suppression pour accéder à notre page de tableau. En fait, cela a du sens, mais nous ne sommes pas sûrs d'avoir supprimé la tâche réussie. C'est pourquoi je ne veux pas écrire de code ici. Je veux vraiment écrire listen, par exemple, dans notre constructeur. Pour cela, nous devons injecter ici notre service socket. C'est là que nous entendons le service de circuit privé et nous obtenons ici notre service de socket. Et maintenant ici, dans le constructeur South par exemple, en bas, nous pouvons simplement écrire cette leçon de service de socket. Ici, il faut fournir cela en obtenant une tension dorsale. Et c'est la tâche k d que nous supprimons. Maintenant, nous pouvons utiliser les événements de socket dans m point et où l'abonnement à nos tâches supprime le succès. Et ici, je veux passer par pris jusqu'à ce que nous soyons du bon côté, puis donner un aperçu de ces désabonnements. Et après la pipe, nous pouvons utiliser notre abonnement et ne nous soucions pas du tout de Tuskegee. Nous voulons simplement aller trop loin et déjà créé une telle méthode. C'est ça, ça va à quoi ? Nous avons, cette méthode directement ici dans ce fichier, qui signifie en fait que lorsque nous aurons du succès et que notre modèle sera ouvert, ce code reviendra directement au tableau car nous pouvons afficher cette tâche supprimée. Et maintenant je veux copier-coller ce code complètement parce que nous allons écrire exactement la même chose à l'intérieur de notre tableau. Et comme vous vous en souvenez, nous écrivons tous ces appels à notre conseil d'administration. C'est là qu'il est tout à fait logique de mettre ce code ici. Et au lieu de cela, allez à bord, essayez-le ici, ce point de service de mot. Et ici, nous avons notre tâche de suppression laquelle nous fournissons l'ID de la tâche. Et dans ce cas, nous avons besoin cette tâche AD que nous obtenons du backend, et ils ont en fait été entièrement implémentés cette fonctionnalité. Maintenant, vérifions-nous si cela fonctionne, mais nous n'avons aucune erreur ici et aucune erreur dans le backend. Passons maintenant au navigateur. Ici, j'ai ma première tâche, alors supprimez-la maintenant, comme vous pouvez le voir dans les actions, nous avons cette suppression, puis appuyez sur Supprimer et cette tâche a complètement disparu avec ne pas la voir ici à l'intérieur du tableau, et nous ne le voyons pas dans le deuxième tableau. Et en fait, en cas de succès, nous avons été redirigés avec succès vers l'ID du tableau slash, qui signifie que nous avons implémenté avec succès cette fonctionnalité, Fool Live du début à la fin. 47. Déploiement: Nous avons terminé avec succès notre projet avec la création d'un clone Trello, et nous devons maintenant parler de déploiement. En général, le déploiement n'est pas une tâche facile et de nombreuses personnes se posent des questions. Comment le joueur devrait-il projeter, comment nous allons le gérer, quel service nous devons utiliser pour cela. Et c'est en fait un problème. Il existe des centaines d'entreprises différentes où vous pouvez payer de l'argent et elles se déploieront pour votre projet. Mais tout d'abord, vous devez comparer toutes ces entreprises, comprendre comment déployer leur projet, apprendre leurs outils en ligne, etc. Cela n'a pas beaucoup de sens. En fait, tous ces outils font exactement la même chose. Ils mettent en place votre projet en production sur un vrai serveur. En fait, la meilleure option pour apprendre la production et le déploiement est déployer notre projet par nous-mêmes sur notre propre serveur. C'est le fondement même du déploiement. C'est là qu'il est tout à fait logique d' apprendre à le faire. De plus, ce sera probablement la variante la moins chère, comment héberger votre projet. Oui, ce ne sera pas gratuit car vous devez payer pour le serveur, mais vous ne payez pas l'entreprise pour gérer un serveur et vous ne payez pas pour certains outils graphiques pour applaudir votre projet. C'est là que dans cette vidéo, nous devons louer un serveur ensemble, le configurer, puis déployer notre projet. Et en fait, si vous ne voulez pas payer pour le serveur, c'est très bien. Vous pouvez simplement laisser votre projet tel quel. Et en vérifiant la vidéo, comment je le fais et fait une société de serveurs, j'utilise moi-même hertz et c' est un fournisseur de serveur assez bon marché et fiable. Et en fait, vous pouvez choisir n'importe quel fournisseur de votre choix. Vous avez juste besoin d'accéder à un serveur privé virtuel. Mais j'aime bien Hatsune parce qu'il est fiable et pas si cher. Comme vous pouvez le voir ici, nous pouvons cliquer sur le Cloud et vérifier les prix ici en bas. Comme vous pouvez le voir, il existe de nombreux packages différents et le minimum est ici pour des années et 0,15$, ce qui est assez bon marché pour le mois de 20 téraoctets, tragique deux gigaoctets de RAM et de processeur processeur. Et en fait, j'utilise ce plus petit serveur pour deux projets en production, mais pas mal de monde vient. Et si vous optimisez le thriller de vos projets, c'est bien, alors vous êtes tout à fait d' accord avec un petit sirop. C'est pourquoi dans cette vidéo, nous louerons exactement le sirop. Maintenant, la première étape consiste à enregistrer juste l'intérieur de son fils un peigne ou tout autre fournisseur que vous souhaitez. J'ai déjà un compte ici et après inscription et confirmation de votre e-mail, vous verrez cette page. En fait, ici, ce service dans votre profil sera vide, mais c'est mon propre serveur web. Ici, je veux cliquer sur le serveur parce qu'ils veulent juste créer un nouveau serveur pour le bien de ce cours . Donc le premier ici est l'emplacement, peu importe. Nous pouvons choisir ici Helsinki ou ce que vous préférez. La blessure à l'image est parfaitement bonne. Nous n'avons pas besoin de choisir quoi que ce soit. Voici le type standard, tout à fait bien. Et ici, le niveau le plus petit, qui est pour vous, 0,15$. Nous n'avons pas besoin de changer quoi que ce soit. Nous n'avons pas besoin de volumes, de réseaux, de pare-feu, fonctionnalités supplémentaires, de clé SSH, et ici juste d'un nom. Nous pouvons le nommer ici, dans la bande-annonce, tout comme notre projet pour que nous sachions de quoi nous parlons. Et comme vous pouvez le voir ici, nous n'avons pas sélectionné notre clé SSH, ce qui signifie que nous recevrons un e-mail avec l'utilisateur root et le mot de passe, ce qui est très bien rapide. Je clique ici pour créer et maintenant, et notre serveur sera créé. Comme vous pouvez le voir, mon serveur est déjà vert et fonctionne. Et en fait, disons, l'e-mail, j'ai reçu mes informations d'identification où j'ai un utilisateur root et le mot de passe de notre serveur. Nous devons maintenant sauter dans la console et écrire SSH. Et voici tout d'abord, notre utilisateur root ajouter. Ensuite, l'adresse IP que nous avons ici, nous pouvons simplement cliquer dessus et elle sera copiée et ils devront la coller ici. Nous avons donc ici SSH, root at, et voici l'artiste AP. J'appuie sur Entrée et nous recevons le message. Je vous assure que vous voulez continuer. Où c'est ici, oui. Et en appuyant sur Entrée, comme vous pouvez le voir ici, nous recevons tout d'abord la question concernant notre mot de passe. Nous devons donc prendre un mot de passe de l'e-mail et le coller ici. Après cela, nous recevons de nombreuses informations concernant notre serveur. Et nous commençons le processus de modification du mot de passe root et en fait pour changer le mot de passe avec tout d'abord, devons fournir un mot de passe actuel. C'est pourquoi je le colle à nouveau et j'appuie sur Entrée. Et maintenant, nous devons fournir un nouveau mot de passe à notre utilisateur root. Et nous le faisons juste pour que Kasner ne connaisse pas notre mot de passe. Ici, je n'en fournirai que 123. Et encore une fois, 123. Comme vous pouvez le voir, nous recevons un message. Vous devez choisir un mot de passe plus long. Faisons en sorte que ce soit 12345678. Et encore une fois, et en fait, vous devez comprendre que pour le vrai projet de production, vous devez créer un mot de passe sécurisé et pas comme ça, c'est juste pour le test. Donc, si vous avez une telle sortie avec root en L, Trello et hachage ici, cela signifie que vous avez réussi, nous regardons à l'intérieur de l'observateur. Ici, nous pouvons faire quelque chose. Je voudrais mentionner ici quelque chose d'important. Dans ce cours, nous ne parlons pas de la façon de gérer les serveurs de manière efficace et sécurisée. Ce qui signifie en fait que je vais tout montrer, l'ensemble du déploiement avec notre utilisateur root. En général, dans un vrai projet de production, vous ne voulez pas tout faire avec l'utilisateur root. Vous souhaitez créer un autre utilisateur avec des autorisations limitées qui peut simplement déployer un projet. Encore une fois, utiliser route en production est une mauvaise chose, mais si vous le faites comme votre projet favori, c' est tout à fait correct. La prochaine étape consiste à intégrer notre projet dans le sirop. Et en fait, il existe de nombreuses possibilités pour cela et je veux utiliser le plus simple ici. Ce que nous pouvons faire, c'est simplement pousser notre projet vers GitHub ou GitLab, vous le souhaitez, puis cloner ce projet dans notre sirop. C'est très efficace car vous pouvez apporter certaines modifications à un projet. Vous pourrez certainement stocker et mettre à jour votre projet dans le référentiel Git, ce qui signifie que chaque fois que vous voulez mettre à jour votre projet, vous sautez simplement ici dans votre et dit Sarah, vous essayez simplement d'obtenir pool pour mettre en pool votre projet , puis vous le redémarrez. C'est ça. J'espère que vous ne saviez pas déjà comment déployer votre projet pour obtenir lab ou GitHub. Mais si vous n' entendez pas quelques étapes, je préfère utiliser MATLAB pour mes propres projets, mais c'est juste ma préférence personnelle. Ici, je me suis déjà connecté à GitHub et ils ont cliqué sur Créer un nouveau projet. Maintenant, il me suffit de cliquer sur Créer un projet vide. Et ici, nous pouvons écrire un nom. Par exemple, nous pouvons nommer la bande-annonce de notre projet L, et nous n'avons rien à changer ici. Et en fait, par défaut dans GitHub, nous devenons privés gratuitement, et c'est génial pour nos besoins. Maintenant, dans l'URL de notre projet, nous devons choisir notre espace de noms, et ils choisiront l' espace de noms de mon utilisateur. Maintenant, je clique sur Créer un projet ici et notre projet est créé. Et ici, nous allons voir comment nous devons amener ce projet à obtenir un laboratoire. Nous devons maintenant sauter dans la console de notre projet et écrire bien dans le besoin. Cela sera bien initialisé pour notre projet. Je clique ici et reçois un message indiquant que mon dossier est déjà un dépôt Git parce qu'ils ont déjà mon projet à l'intérieur, généralement vous ne recevrez pas un tel message, mais juste le message que nous avons initialisé avec succès. Bien dans ce dépôt, notre deuxième étape consiste à déployer tous nos fichiers dans MATLAB. Mais le point le plus important ici est que nous devons ajouter pour ignorer tous les modules de nœud dans les modules nœud client et les modules de nœud de serveur Insights. Nous n'avons pas besoin de télécharger toutes ces bibliothèques dans le dépôt Git. C'est pourquoi nous devons créer un fichier point gitignore à l'intérieur du serveur. Ils ont ici des modules de nœud dans ce client et également à l'intérieur du client. Ici, comme vous pouvez le voir, j'ai aussi dot gitignore, et ici nous avons plein de choses. Il a été créé automatiquement par angular sans qu'il soit nécessaire de changer quoi que ce soit ici. Ici, les modules de nœud ont été signalés et cela est ignoré, ce qui signifie que nous devons simplement changer de serveur. Et voici notre être ignoré. Après cela, nous devons sauter dans la console de jeu ici, non ? Git ajoute un point et il ajoutera tous nos fichiers au bon. Maintenant, nous devons créer notre premier commit pour cela, nous pouvons essayer de git commit am. Et ici, par exemple, projet terminé, comme vous pouvez le voir ici, je reçois un message, rien à valider, mais cela ne devrait pas être votre cas. Dans votre cas, vous obtiendrez des centaines de fichiers qui ont déjà été créés dans ce projet. Notre dernière étape ici est que vous pouvez voir est d'ajouter cette ligne, git remote, ajouter l'origine HTTPS, puis le chemin complet, je vais le coller maintenant ici. Et grâce à cela, nous avons réussi à lier get lip à ce dépôt. Et notre dernière étape ici sera cette git push moins uf origin main. Et en fait, comme vous pouvez le voir ici, c'est écrit en main. Mais pour moi, par défaut, j' ai un master de branche, ce qui est tout à fait correct. C'est pourquoi je souhaite renommer main en master. C'est bon. Push minus uf origin, master them hidden here, Enter, comme vous pouvez le voir ici, je dois tout d'abord fournir un nom d'utilisateur de mon utilisateur GitHub. Et deuxièmement, le mot de passe est, vous pouvez voir ici que je reçois un message est accès profondément refusé, ce qui signifie en fait que cela ne s'est pas produit. Mais ici, nous devons créer un jeton d'accès personnel avec dépôt de droit redéposé dans GitLab. Si vous utilisez GitHub par exemple, cela a peut-être fonctionné pour vous. Si ce n'est pas le cas, nous pouvons accéder à ce lien slash profile jetons d'accès personnels. Comme vous pouvez le voir, je l'ai ouvert ici et ici nous avons juste besoin créer un jeton d'accès pour pouvoir pousser vers GitHub. Et ici, par exemple, il peut créer un nom parlant en trello. Et ici, nous devons sélectionner des portées. Pour nous. Nous devons créer le bon dépôt et lire le référentiel. C'est le plus important. Je clique ici, crée un jeton d'accès, et ici nous arrivons au sommet de notre nouveau jeton d'accès. Et heureusement, nous devons à nouveau changer notre télécommande à cause de ce jeton d'accès pour cette table, n'est-ce pas ? Bon ashram ou région éloignée, qui supprimera cette origine que nous avons créée ici en haut avec cette ligne, et cela sera supprimé. Maintenant, je veux copier-coller cette ligne et voici comment nous le faisons avec le jeton d'accès dans GitHub. Comme vous pouvez le voir ici lors de l'écriture de git remote add origin HTTPS. Ici, nous devons tout d'abord fournir le nom du jeton d'accès. C'est pourquoi nous avons créé l trailer en guise de jeton. Je vais écrire ceci ici, ultra law, et maintenant nous avons deux points et notre jeton d'accès. Je vais également le copier-coller à partir de notre page où nous l'avons généré. Et après cela, nous avons exactement la même chose que nous avons ici en haut. Pour moi c'est https github com slash mon surnom slash L point. Bien. C'est ici que j' écrirai exactement la même chose. Et puis mon dépôt, je vais Trello, vérifions-le. Nous essayons de pousser à nouveau vers notre dépôt avec git push origin master, comme nous l'avons fait précédemment. Nous sommes en train de frapper ici. Et comme vous pouvez le voir, lorsque vous n'êtes pas interrogé sur notre nom d'utilisateur et notre mot de passe, parce que maintenant nous poussons avec notre jeton d'accès. Et comme vous pouvez le constater, nous n'avons pas d'erreur. Ici. Nous obtenons que tout est résolu et nous réussissons maintenant à booster la branche master dans Origin. Comme vous pouvez le voir maintenant , dans notre projet, nous avons une branche master, et voici toutes nos modifications. Nous avons ici deux dossiers, client et serveur. Et ici, à l'intérieur, nous pouvons voir l'ensemble du projet que nous construisons. Et maintenant, nous pouvons applaudir notre code à notre serveur. C'est pourquoi je veux revenir à l' intérieur de notre serveur que nous venons de créer. Et comme tu peux le voir, je suis dans le sirop. Tout d'abord, je veux créer un nouveau répertoire qui s' appelle projects. Maintenant, je veux sauter dans ce projet de répertoire et cloner ce projet ici. Et en fait, nous pouvons essayer d' utiliser avec le même jeton d'accès que celui que nous venons d'utiliser. Nous pouvons simplement écrire dans la console, obtenir la version chmod moins dans la console locale, pas dans le serveur. Et voici notre télécommande avec l'URL de ce jeton. Et en fait, nous pouvons simplement copier-coller cette URL et l'utiliser ici à l'intérieur sirop ici, je veux juste écrire git clone et puis cette URL que je frappe ici. Comme vous pouvez le constater, nous n'avons aucun problème d'autorisation. Et nous avons cloné notre projet avec succès ici dans projects. Et maintenant je peux écrire Ls. Et comme vous pouvez le voir, nous avons le trailer du dossier L, ce qui signifie que nous avons réussi notre projet à l'étranger sur notre serveur. Pour continuer, nous devons mettre à jour tous les packages de notre serveur. Et pour cela, nous pouvons simplement écrire apt-get update et appuyer sur Entrée. Comme vous pouvez le voir, tous nos paquets ont été mis à jour et maintenant je veux les installer, d' abord en jeans et ensuite MongoDB. Qu'est-ce qui porte malheur ? Il s'agit de notre futur serveur Web que nous utiliserons pour notre projet. C'est ici que nous pouvons écrire EPT avec style et malheur. Ici, nous devons cliquer sur Oui, pour installer ce package. Comme vous pouvez le constater, notre package a été correctement installé. Voyons si cela fonctionne ici, nous pouvons simplement écrire le statut du service et de la poisse. Comme vous pouvez le voir, j'appuie sur Entrée et nous obtenons beaucoup d'informations. Tout d'abord, ce qui est dans Jinx et ici, actif en cours d'exécution, ce qui signifie en fait qu'il a été installé avec succès et qu'il fonctionne maintenant. Notre prochaine étape est d'installer notre base de données, et c'était MongoDB. C'est ici, apt installe Mongo DB et nous devons le confirmer par yes. Voyons maintenant l'état de notre MongoDB pour ce week-end, à droite, le service puis le statut Mongo DB. Et comme vous pouvez le voir, il est également actif et en cours d'exécution, qui signifie que tout va bien. L'outil suivant que je veux installer s'appelle n. Et en fait, nous l'utiliserons pour gérer la version de notre nœud car il peut arriver que nous souhaitions mettre à jour le nœud et c'est beaucoup Il est plus facile de le faire en utilisant cet outil, en particulier si vous avez plusieurs projets et que vous devez basculer entre différentes versions de nœuds. C'est ici que je vais coller cette ligne dans la console. Donc c'est curl moins l et cette URL, c'est Gita, ton slash n dans style bash. J'appuie sur Entrée et un message d'erreur s'affiche. C'est pourquoi nous devons agir. Nous devons tout d'abord exécuter apt install. Et voici l'essentiel construit. J'appuie sur Entrée et nous devons le confirmer. Maintenant, comme vous pouvez le voir, il est installé afin que nous puissions essayer de l'installer. Et encore une fois, j'appuie sur Entrée et je mets. Je n'ai aucune erreur. Ici. Nous pouvons simplement écrire oui et procéder à l'installation. Comme vous pouvez le voir ici, par défaut, n installé pour moi, je sais, 16151. Et en fait, c'est exactement le même nœud qu'ils ont localement. Et ils vous recommandent vivement d'avoir la même version de nœud sur votre serveur de production et dans un environnement local. Dans ce cas, vous éviterez les tracas et la boîte magique. Et les deux derniers que nous voulons installer s'appellent PM2.5. C'est un gestionnaire spécial pour redémarrer nos processus de nœud et nous l' utiliserons pour démarrer notre appel. C'est ici que nous pouvons écrire npm install minus g, ce qui signifie globalement VM2. Et comme vous pouvez le voir ici, nous obtenons une commande d'erreur npm not found, et la même chose pour command node not found. Si je suis juste ici, nœud moins version. Et en fait, après l'installation de n, à la fois au niveau national et en obtenant Node et NPM. Mais nous devons redémarrer notre terminal. Nous devons donc nous déconnecter du serveur et nous reconnecter afin d'apporter une chance connue à l'intérieur du chemin. C'est là que nous pouvons simplement écrire exit, puis à nouveau, utiliser SSH root et notre adresse IP. Keaton ici Entrez et nous devons fournir notre nouveau mot de passe. Et comme vous pouvez le voir ici, je suis à l'intérieur et maintenant je peux écrire node minus fashion puis obtenir la version du nœud et la même chose avec la version NPM moins, ce qui signifie en fait que nous pouvons maintenant installer TM2 à nouveau avec npm install globalement VM2. Maintenant, nous n'avons plus d'erreur et notre PM two est en cours d'installation. Maintenant, nous devons installer tous nos packages pour le client et pour le serveur. Et pour cela, je dois sauter à nouveau dans le dossier des projets. Et comme vous pouvez le voir, j'ai notre projet Ultra Lab. Comme vous pouvez le voir ici, je suis à l'intérieur la bande-annonce et ils ont un client et un serveur. Tout d'abord, je veux sauter et dire serveur. Et ici, nous avons beaucoup de fichiers, donc nous pouvons simplement écrire et payer style et installer toutes les dépendances pour notre serveur. Comme vous pouvez le voir, tout est installé maintenant nous devons sauter dans notre client. J'écris donc un client de CD et après cette installation npm à nouveau, et nous installerons tous nos packages frontaux pour Angular. Tous nos paquets ont donc été installés avec succès et nous devons maintenant créer une configuration pour nginx pour notre projet. Et pour cela, nous pouvons écrire cd slash UTC et jinx Cohen's d. Et ici, à l'intérieur, nous devons créer un nouveau fichier. Et pour cela, nous pouvons écrire Tij puis L trailer point com.com. Et en fait, pour ouvrir et éditer un fichier, nous devons utiliser un éditeur depuis la console. Et je vais écrire ici nano puis le nom de notre dossier, qui est l'ancien trailer, calm, calm. Je frappe ici et voici à quoi ressemble cet éditeur. Ici, nous pouvons simplement taper quelque chose, puis plus tard en sécurité. Et en fait, ici, je veux déjà coller le conflit porte souvent la poisse au type préparé précédemment, et voici à quoi cela ressemble. Nous avons donc ici un blog sur le serveur. Maintenant, à l'intérieur, nous avons écouté AT, qui est une partie AT par défaut. Et c'est là que se trouve notre racine de frontend. Voici les projets de slash route slash où ils ont déjà été créés. Ici, le dossier est solide. Il s'agit en fait d' un dossier Ultra bas que nous venons de créer. Ensuite, slash client slash et slash app. Et en fait, nous devons également construire notre client plus tard après avoir installé les packages. Notre script de type sera donc converti en JavaScript, et il sera ici dans ce dossier, dans l'application slash. C'est pourquoi maintenant tout va bien. Ici, nous résolvons notre index.HTML et ici le nom du serveur, le nom de famille est vraiment important car il s'agit en fait de notre domaine. C'est L.com et www L Trello.com. Et en fait, nous n' avons aucun domaine. Et c'est très bien parce qu' en fait, nous pouvons, dans notre machine locale, dans le fichier hôte, écrire une adresse APR du serveur. Dans ce cas, nous n'avons pas besoin de nous embêter avec la stratégie bientôt en tant que domaine réel, et cela fonctionnera exactement comme avec le domaine. Après cela, nous avons l'emplacement. Nous essayons donc de toujours charger notre fichier index.HTML. Et ici, nous avons l'API de barre oblique d'emplacement. Et en fait, c'est important parce que nous disons, accord, quand nous sommes champions de l'API slash L Trello.com, alors nous devons envoyer notre requête par proxy à ce serveur Web et à ce serveur Web que nous utiliserons à l'intérieur de notre backend. Il s'agit d'un hôte local pour l'API barre oblique 1001. Après cela, nous avons exactement la même chose sauf pour les requêtes d'E/S de socket. Et ici nous avons http localhost 4,001, et ici nous avons quelques en-têtes. Et en fait, c' est toute la configuration dont nous avons besoin pour In Jinx. Maintenant, la question est de savoir comment enregistrer ce fichier ? Et pour cela, tout d'abord, nous voulons cliquer sur Control O. Et ici en bas, nous voyons filename pour écrire ys l Trello com conf, où il suffit d'appuyer sur Entrée. Et c'est très bien ainsi. Elle a été sauvée. Maintenant, je veux cliquer sur Control X, et maintenant nous sommes sortis, nous sommes de retour dans notre console. Et maintenant, si vous avez besoin de vérifier si tout a bien été enregistré, vous pouvez écrire cat, puis je vais Trello, j'appuie sur Entrée et nous entrons dans la console cette belle sortie avec le contenu de notre fichier, mais ce n'est pas tout ce que nous devons également changer d'utilisateur dans la configuration des gènes. C'est par ici. Je veux sortir de ce dossier ici, je veux écrire à nouveau nano, mais dans notre cas maintenant, ce sera dans jinx.com. Et en fait, c'est la configuration par défaut, souvent Jinx. Et ici, nous voulons modifier une seule ligne. Ici, en haut, nous avons une donnée utilisateur et nous voulons la changer en route utilisateur avec laquelle nous sommes bloqués ici, et nous devons enregistrer à nouveau ce fichier. Donc Control O Enter, puis Control X. Maintenant nous devons redémarrer In Jinx pour appliquer la configuration que nous avons faite. C'est pourquoi nous pouvons écrire service et jinx restart. J'appuie sur Entrée et nous n'avons aucune erreur. Et maintenant, nous ne devons pas oublier de construire notre façade. Et c'est pourquoi nous devons revenir à l'intérieur projets de slash route slash. Et voici notre trailer L et notre client. Et en fait, nous sommes clients internes. Et pour créer notre projet Angular, nous pouvons simplement exécuter npm, lancer build. Et comme vous pouvez le voir ici, nous appelons GI Bill, qui est la commande d'Angular, et qui construira pour nous ensemble du projet dans ce dossier, comme vous pouvez le voir ici, après avoir construit, Je reçois pas mal d' erreurs dans la console. Et en fait, le principal problème est qu'il s'agit d'une version de production et la paie n'existe pas sur le type booléen de production, ce qui signifie que nous n'avons pas mis à jour nos environnements, Config dans notre projet. C'est là que c'est réel et agréable que nous avons maintenant du bon, donc nous pouvons rapidement faire des ajustements. Ici, je souhaite revenir sur notre projet et nous nous intéressons à nos environnements de source de pièces client. Nous avons ici deux dossiers. L'environnement, oui. Et sur la droite, je vais ouvrir une manifestation environnementale. Ici. Comme vous pouvez le voir sur la gauche, nous avons fourni l'URL de l'API et l'URL des sockets, mais nous ne les avons pas fournies sur la droite. Et en fait, je vais simplement les copier de gauche à droite ici. Nous avons maintenant ces propriétés dans notre configuration. Après cette blessure doit déployer ces changements au bon saut pour handicapés dans le projet local, non ? Git add point, il ajoutera uniquement tous les fichiers localement et après ce commit. Donc git commit moins m et par exemple, environnement mis à jour. Je frappe ici, entrez nos navettes. Après cela, nous pouvons simplement écrire git push origin master et appuyer sur Entrée. Et nos modifications se trouvent déjà dans GitHub ou GitLab. Après cela, nous pouvons revenir à l'intérieur notre serveur, qui a été saisi. Et là, je veux sortir du client. Et me voici dans notre petit dossier de trailer. Maintenant, je viens d'essayer Git pool et nous apportons nos modifications comme vous pouvez le voir ici, protéase de l'environnement à l'intérieur de notre serveur. Et après cela, nous devons réessayer de lancer build, et c'est npm run build, mais nous ne devons pas oublier, nous devons sauter dans le client, comme vous pouvez le voir, aucun paquet de fichier ou de répertoire de ce type, Jason, parce que je ne suis pas un client interne. Donc, le client et ici npm lancent build. Comme vous pouvez le constater, nous n' avons aucune erreur et nous recevons un message indiquant que tout est terminé. Et en fait, nous devons vérifier ce que nous avons dans notre dossier dist. Il a donc diminué. Et comme vous pouvez le voir ici, nous avons tous les trailer et dans tous les Trello, nous avons tous ces fichiers. Tout d'abord, notre index.HTML, puis nos actifs, nos gestionnaires, etc. Mais en fait, cela signifie que nous avons un petit problème dans notre config l'intérieur et que nous avons un mauvais sort parce qu' il y a eu notre dossier racine, cette application slash. Et dans notre cas, nous avons une barre oblique réduite, je vais Trello, ce qui signifie que nous devons la mettre à jour maintenant. Nous devons donc essayer Nano slash, ETC. Et Jinx Cohen est mort. Et voici notre Comic-Con L Trello. J'appuie sur Entrée et j'ai de nouveau ouvert notre configuration. Et ici, à l'intérieur de la route, nous devons essayer ce slash l Trello. Maintenant, je clique sur Control O, Enter Control fuit et nous devons redémarrer et porter la poisse, donc le service et la poisse redémarrent. Donc maintenant notre interface est complètement prête et nous avons simplement besoin de lancer notre backend et nous n'avons pas besoin de démarrer notre fronted d'une manière ou d'une autre, car in jinx le fera rapidement. Mais pour commencer, ce ne sera pas cas parce qu'en fait, à l'intérieur de notre interface , il suffit d'avoir des fichiers statiques comme HTML, JavaScript et CSS. Mais à l'intérieur de notre backend, nous avons notre observable. C'est pourquoi je veux me lancer dans notre back-end. Voici donc le serveur de CD, et ici nous devons démarrer notre serveur avec PM2.5. Mais en fait, nous avons également un problème à l'intérieur de notre serveur. Nous avons TypeScript sans fichiers JavaScript et en fait womb doit convertir tout notre TypeScript JavaScript avant de commencer à l'exécuter sans PM2.5. Et en fait, pour cela, il faut créer dans votre commande. C'est pourquoi nous devons revenir dans notre projet et aller dans le package serveur, Jason. Et ici, nous avons un script pour démarrer, mais nous n'avons pas de script pour Build. C'est pourquoi ici nous pouvons simplement écrire build et ici le script sera TAC. Qu'est-ce que le TAC ? En fait, c'est un TypeScript et il transmettra simplement tout le code que nous avons à l'intérieur ce projet avec cette configuration ts. Comme vous pouvez le voir ici est la sortie, c'est le dossier dist. C'est très bien vite. Mais après cela, nous avons changé. Nous devons sauter dans set console et refaire exactement la même chose, d' abord, get head, puis git commit, puis git push. Avec ces commandes, nous apportons nos modifications dans get wrapper. Maintenant, nous revenons en arrière au lieu d'une enquête. Voilà, nous sortons et je retire à nouveau mon projet. Donc nous sommes prêts à y aller maintenant, nous pouvons revenir en arrière et dire, oh, dossier serveur. Et ici, nous pouvons essayer de construire notre back-end. C'est ici que je peux simplement écrire npm run build, et cela transmettra mon script de type à mon JavaScript. Comme vous pouvez le voir ici, c'est chose faite. Maintenant, nous pouvons simplement essayer un peu moins et vérifier ce que nous avons. Et comme vous pouvez le voir ici, nous voyons tous nos fichiers qui ont été créés, mais avec l'extension js, ce qui signifie en fait que c'est tout correct et que nous devons démarrer dist slash server.js et il lancez notre projet. Nous voulons utiliser les PM2,5. C'est là que nous pouvons simplement lancer PM l'espace, démarrer l'espace. Ici sera diminuée la recherche par barre oblique. Oui, j'appuie sur Entrée et nous obtenons beaucoup de résultats. Comme vous pouvez le voir ici, il s'agit de l'ensemble de la sortie de PM deux. Ce n'est pas grave, mais ici, en bas nous voyons des PM engendrer un démon. Il est diabolisé avec succès et nous commençons avec cette surtension en mode 4k, et c'est fait et voici notre serveur. Et en fait, pourquoi nous utilisons ici P M2, pas seulement un processus de note, nous pourrions écrire ici node et puis par exemple, la montée, oui, c' est tout à fait correct. Mais pm tubule, tout d'abord, les risques commencent pour nous, ce serveur web s'il est cassé pour une raison quelconque. Deuxièmement, le PM 2 est mieux adapté aux applications de production. Donc, ce que nous avons fait ici, tout d'abord, nous avons réussi à créer notre client et ensuite, nous avons lancé notre backend. Et la dernière étape que nous voulons faire est d'ouvrir un navigateur. Mais nous pouvons simplement ouvrir un navigateur car nous devons pointer notre domaine, L Trello.com, qui n'existe pas. Nous ne l'avons pas acheté depuis notre machine locale vers notre serveur. Et en fait, ici, je dois sauter dans la console localement. Et ouvrez le fichier hôte, par exemple, dans Linux et macOS, c'est une ligne dans une barre oblique, ETC slash hosts. Alors voici à quoi cela ressemble pour moi, si vous êtes sous Windows, voici votre chemin, c'est le disque C, le système Windows, donc les deux pilotes, ETC, hébergent et vous ouvrez ce fichier et C'est exactement comme dans mon dossier. Et comme vous pouvez le voir ici, j'ai déjà testé ce projet. C'est pourquoi j'ai cette ligne. J'ai donc ici un domaine, L Trello.com. C'est ce que nous sommes enregistrés, mais il s'agit de l'ancienne adresse API. Je n'en ai pas besoin. Je dois revenir à l'intérieur de mon panneau de SNA de tête et copier ce domaine et le coller ici, ce qui signifie en fait sur notre machine locale lorsque nous sautons à l'intérieur l'ultra faible dose venir quand ce n'est pas en regardant dans la table de recherche DNS, nous pointons simplement vers notre adresse IP du serveur. Maintenant, le moment de vérité, nous allons ouvrir notre projet. J'écris dans le navigateur L Trello.com. Et ça, tu peux voir que c'est notre projet. Cela fonctionne. Et en fait, je veux ouvrir la console ici afin que nous puissions vérifier si nous avons des erreurs. Et en fait, ici, nous avons un hôte local étroit pour 1001 utilisateurs de slushy ice lift d'origine, je vais Trello et en fait, comme vous pouvez le voir, réseau, c'est notre demande à l'API. Il s'agit de http localhost 4 001 paires slushy plus l'utilisateur. Et il est évident que c'est fort. Ce n'est pas ce que nous devons utiliser. C'est pourquoi nous devons revenir à l'intérieur de notre projet et aller à l'intérieur du client localement et le modifier. Voici donc la source, l' environnement et la protestation environnementale de notre client . Ici. Il est évident que cet hôte local n'existe pas. Ce que nous avons maintenant ici est une API barre oblique CTP L Trello.com et la même chose ici, http L Trello.com. Et puis nous n'avons pas besoin de fournir ici un port. Et maintenant, nous devons à nouveau valider ces changements. C'est pourquoi git add git commit puis git push. Maintenant, nous voulons accéder à notre serveur, sortir et dire dossier Trello et à droite, obtenir***. Mais après cela, nous devons reconstruire notre client parce que nous avons changé de client. Et pour ce faire, nous pouvons écrire un client c, d. Et maintenant, npm lance build et il va simplement générer des fichiers statiques rapides pour le frontend, notre projet est construit avec succès. Je recharge la page ici et il n'y a pas d'erreur. Nous avons ici pour 01, pour HTTP L trailer com slash APIs slash user. C'est très bien. Nous ne sommes pas enfermés. Essayons maintenant d'enregistrer l'utilisateur. Je suis donc en train d'écrire f2 sur gmail.com. Voici notre nom d'utilisateur et mot de passe 123 cachés ici s'inscrire. Et en fait, ça a marché. Et c'est important à vérifier car cela signifie que nous avons configuré MongoDB avec succès parce que cette requête post est entrée dans l'API et c' est notre réponse. Et ici, nous récupérons l'annonce de l'utilisateur enregistré et ici le jeton. Notre backend et notre DPI fonctionnent donc également. Maintenant, nous avons un tableau et ici je vais créer mon premier tableau. Appuyons sur Entrée et nous obtenons notre tableau, nous pouvons l'ouvrir. Et nous voici à l'intérieur du tableau. Voyons maintenant si notre socket IO fonctionne pour cela. Je veux dupliquer cette touche ici et essayer de créer une liste. Voici, par exemple, la première liste, je frappe ici au moins, et nous obtenons la liste. Et à l'étape suivante, nous obtenons exactement la même liste. Maintenant, au deuxième trimestre, nous pouvons créer une nouvelle carte. Par exemple, la première carte, je clique ici, ajoute et nous obtenons cette carte sur les deux pages. Maintenant, nous pouvons ouvrir notre modèle et il fonctionne comme prévu, ce qui signifie que nous avons déployé notre projet avec succès en production. Cela n'a pas été facile, mais c'est l'essentiel de tout projet que vous pouvez déployer. Peu importe la vue angulaire qui réagit. N'importe quel client que vous voulez, JavaScript brut ou n'importe quel backend, il sera toujours vraiment similaire. 48. Exercice: Toutes mes félicitations, vous avez terminé ce cours avec succès, et je pense vraiment que vous êtes géniale et que vous avez appris pas mal de choses. Maintenant, vous avez certainement appris à créer votre projet full stack avec Node.JS sur le backend et à l'exprimer en tant que service. De plus, vous pouvez certainement utiliser les E/S socket car nous l'avons beaucoup utilisé sur le client. Encore une fois, beaucoup d'expérience concernant n TypeScript plus cool, les interfaces et la création d'un bon état réactif. Mais ce n'est évidemment pas la fin. En tant que bon professeur, je dois vous donner des devoirs car si vous voulez améliorer vos compétences en tant que développeur, vous devez apprendre et créer vos propres projets. Et ici, vous avez deux possibilités. Vous pouvez créer votre propre projet à partir de zéro. C'est ce que je recommande vraiment, ou vous pouvez implémenter des fonctionnalités dans ce projet. Et en fait, les deux possibilités présentent des avantages . Si vous continuez à mettre en œuvre ce projet, vous disposez déjà d'une très bonne architecture et ce sera beaucoup plus facile pour vous. Et en fait, la quantité de fonctionnalités que vous pouvez implémenter dans ce projet est vraiment énorme. Tout d'abord, vous pouvez implémenter ici différents rôles. Par exemple, comme les administrateurs qui peuvent créer, par exemple, des équipes, ce qui signifie que vous commencez à organiser les personnes au sein de Teams, tout comme dans le vrai Trello également, par exemple, sur vous pouvez implémenter le glisser-déposer pour les tâches à l'intérieur du tableau. La variante la plus simple pour vous serait d'ouvrir l' application officielle de la bande-annonce regarder leur ensemble de fonctionnalités et simplement implémenter quelque chose qui vous intéresse. Et en fait, c' est très important et c'est lié à votre propre projet. Si vous envisagez de réaliser votre propre projet, je vous recommande vivement de mettre en œuvre quelque chose qui vous intéresse vraiment. Parce que si votre projet ne vous intéresse pas, vous ne le ferez pas sur une longue période. Et si vous êtes à la recherche d' idées pour vos propres projets, interrompez bon nombre d'entre eux. Par exemple, vous pouvez mettre en place un choc du commerce électronique, ou peut-être une librairie, un clone de Netflix ou une application financière pour gérer vos dépenses. J'espère vraiment que ce cours vous a plu et que vous avez beaucoup appris et que nous vous verrons dans mon prochain cours.