JavaScript moderne pour les débutants : partie 2 | Chris Dixon | Skillshare

Vitesse de lecture


1.0x


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

JavaScript moderne pour les débutants : partie 2

teacher avatar Chris Dixon, Web Developer & Online Teacher

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

      2:23

    • 2.

      Télécharger le dossier de projet

      0:59

    • 3.

      Partagez votre travail sur Skillshare !

      1:09

    • 4.

      Pour les boucles

      10:18

    • 5.

      Pour ...in & pour ..de

      6:25

    • 6.

      Tout en vous amusant...

      5:22

    • 7.

      Si / autres énoncés et nidification

      5:56

    • 8.

      Autre chose si

      4:22

    • 9.

      L'instruction switch

      7:57

    • 10.

      Opérateur conditionnel (ternary)

      4:12

    • 11.

      Type Coersion et conversion

      10:00

    • 12.

      Truthy & Falsey

      4:35

    • 13.

      Chaîne en option

      6:22

    • 14.

      La conception et la modification de nouveaux objets

      5:47

    • 15.

      Fonction constructeur d'objet

      9:21

    • 16.

      Prototypes d'objets

      6:41

    • 17.

      Les propriétés d'objets

      10:09

    • 18.

      La copie des propriétés d'objets

      4:38

    • 19.

      Objets de style CSS

      4:35

    • 20.

      Faire une boucle avec des objets

      9:26

    • 21.

      Objets dynamiques

      5:44

    • 22.

      Types de référence et de primitifs

      5:27

    • 23.

      Comparer les objets

      6:41

    • 24.

      Introduction à la section

      3:24

    • 25.

      Les commandes de l'inscription

      12:30

    • 26.

      Réduire les commandes

      5:24

    • 27.

      Fonction d'aide à l'élément

      6:33

    • 28.

      Choisir l'ordonnance en cours

      9:13

    • 29.

      Définir la pizza actuelle

      5:30

    • 30.

      Les méthodes de partage et de participation

      10:50

    • 31.

      Ajouter des pizzas au four

      9:24

    • 32.

      Démarrer et finir le jeu

      9:09

    • 33.

      Introduction au mathématique

      7:08

    • 34.

      La production de nouvelles pizzas avec les mathématiques

      8:36

    • 35.

      setInterval

      9:17

    • 36.

      setTimeout

      4:47

    • 37.

      Déminage

      3:56

    • 38.

      Introduction à la date du Javascript

      5:26

    • 39.

      Régler l'heure de cuisson

      4:43

    • 40.

      La présentation de la toile et des co-ordinates

      13:03

    • 41.

      La mise en place des ingrédients

      7:45

    • 42.

      Dessin des ingrédients circulaires

      6:38

    • 43.

      Dessiner plusieurs pièces

      13:00

    • 44.

      Déboiser la toile

      4:33

    • 45.

      Pizzas à résider

      2:35

    • 46.

      Les étapes de vérification

      16:23

    • 47.

      Réaliser les commandes

      12:48

    • 48.

      Supprimer les commandes

      3:33

    • 49.

      La mise à jour de l'interface utilisateur et de l'état

      9:55

    • 50.

      Introduction à la portée

      5:49

    • 51.

      Portée de la nidification

      5:35

    • 52.

      Block & Function

      3:35

    • 53.

      La levage

      7:48

    • 54.

      Zone morte temporelle

      5:17

    • 55.

      Les fermetures

      9:34

    • 56.

      Un peu de contours

      6:25

    • 57.

      Fonctions de rappel

      15:20

    • 58.

      Les promesses

      11:23

    • 59.

      Le constructeur promis

      7:51

    • 60.

      Réaliser de multiples promesses

      7:15

    • 61.

      Async / attendre

      6:42

    • 62.

      Réduire plusieurs attentes

      4:02

    • 63.

      La manipulation des erreurs

      8:49

    • 64.

      Il est parti très tôt

      8:01

    • 65.

      Carousel d'image : les images

      9:15

    • 66.

      Carrousel d'image : la conception des flèches

      7:01

    • 67.

      Carrousel d'image - Re-Ordering des images

      8:11

    • 68.

      Carousel d'image :

      4:04

    • 69.

      Suivez-moi sur Skillshare

      0:23

  • --
  • 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.

394

apprenants

13

projets

À propos de ce cours

Bienvenue sur le JavaScript moderne pour les débutants !

Il s'agit de la deuxième partie du cours, en vous appuyant sur les bases que vous avez apprises dans la première partie. Si vous n'avez pas participé à la première partie, n'oubliez pas de vous y consacrer d'abord, sauf si vous avez déjà une expérience JavaScript.

Votre projet de démarrage à partir de la première partie se poursuivra dans ce cours, si vous n'en avez pas, vous pouvez le télécharger ici :

Prenez les fichiers de démarrage ici.

Vous trouverez les étapes du projet Speedy Chef.

Il est difficile d'acquérir n'importe quelle compétence et le Javascript n'est pas une exception !

Javascript a une aussi large gamme de fonctionnalités et de choses qu'il peut faire. Il est parfois en tant que débutant, nous n'avons aucune idée de où commencer.

C'est pourquoi j'ai conçu ce cours…

Ce cours couvre de nombreux sujets JavaScript, y compris les boucles et les relevés conditionnels, un regard approfondi sur les objets, les mathématiques, les dates et les minuteries, et un dessin sur la toile.

C'est tout cela en regardant des exemples et démonstrations réels, en plus de développer un jeu de pizzas pour combiner plusieurs parties de ce que vous avez appris. Ce projet sera raisonnablement vaste, mais nous le repartirons.

Plus tard, nous découvrons quelques-uns des plus délicats composants que sont les JavaScript, la portée, le levage et la fermeture, avant de finaliser deux projets supplémentaires. Nous développons une petite application qui est une application qui vous permettra de vous proposer une offre qui vous permettra de vous proposer une offre en quittant votre site. Avant de suivre le cours avec un carrousel d'image JavaScript pleinement fonctionnel.

Merci de votre intérêt pour ce cours, et je vous verrai dans la première leçon...

Rencontrez votre enseignant·e

Teacher Profile Image

Chris Dixon

Web Developer & Online Teacher

Enseignant·e

Hello, My name is Chris and I am a Web Developer from the UK. I am an experienced trainer leading web development bootcamps and also teaching online courses.

My main areas of interest are Vue.js, Nuxt.js, Shopify, JavaScript, eCommerce, and business. I am passionate about what I do and about teaching others.

Whatever your reason for learning to build websites you have made an excellent career choice.

My personal motivation was to become my own boss and have more freedom and flexibility in my life. I also enjoy the technical challenge it provides and the way it constantly evolves. I built my first website back in 1999 and I have watched the web evolve into what it is today.

I try to make my courses enjoyable and try to remember what it was like when I was lea... Voir le profil complet

Level: Intermediate

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: [MUSIQUE] Bienvenue dans ce cours. Comme nous le savons tous, l'apprentissage de nouvelles compétences peut être difficile et JavaScript ne fait pas exception. JavaScript dispose d'un si large éventail de fonctionnalités et de choses pour lesquelles il peut être utilisé, et cela peut souvent laisser les débutants dans une situation difficile à se demander par où commencer, donc c'est pourquoi j'ai créé ce classe. Il s'agit de la deuxième partie de la classe qui repose sur les fondations que vous avez apprises dans la première partie. Si vous n'avez pas suivi la première partie, assurez-vous de passer par ce cours d'abord, sauf si vous avez déjà une expérience JavaScript et que vous souhaitiez couvrir les sujets de cette section. Si vous n'avez pas suivi un de mes cours auparavant, m'appelle Chris et je crée des sites Web depuis plus de 20 ans. J'enseigne également ces compétences depuis plus de sept ans, les deux cours vidéo ainsi meilleurs camps de démarrage de développement Web. Cette classe contient de nombreux sujets JavaScript, y compris des boucles et des instructions conditionnelles, un aspect profond des objets, des mathématiques, des dates et des minuteurs, ainsi qu'un dessin sur le canevas. Tous ces sujets que j'ai abordés de manière claire et structurée, tout en construisant des projets pratiques au fur et à mesure, y compris des exemples d'utilisation réels et aussi quelques mini-défis y compris des exemples d'utilisation réels et aussi quelques mini-défis avec la construction d'un jeu de pizzas pour combiner nombreuses parties de ce que vous avez appris. Ce projet sera assez important, mais nous allons le décomposer, afin que vous puissiez voir comment toutes les pièces s'adaptent ensemble. Plus tard, nous découvrirons certaines des parties les plus délicates telles que le JavaScript asynchrone, portée, le hissage et les fermetures. Avant de terminer avec deux autres projets finaux , nous aurons une petite application appelée Leaving so soon, qui est une fenêtre contextuelle d'intention de sortie, qui est utilisée pour attirer les visiteurs avec une offre lorsque ils essaient de quitter votre site. Si tous terminent la classe carrousel d'image JavaScript fidèlement fonctionnant. Il inclut un dossier de projet auquel nous ajouterons au fur et à mesure que nous progressons dans cette classe et il sera également développé comme référence utile à l'avenir. Merci de l'intérêt que vous portez à ce cours et je vous verrai dans la première leçon. 2. Dossier de projet Télécharger: Si vous avez déjà terminé la première partie de cette classe, vous pouvez continuer avec exactement les mêmes fichiers de démarrage que ceux utilisés dans la première partie. Cette partie 2 de la classe, nous commencerons à la section numéro 6, jusqu'à la fin. Je vais commencer par la première leçon qui concerne les boucles. Si vous avez ceci, vous êtes tout à fait bon pour la prochaine leçon. Si vous sautez dans la partie 2 sans prendre la partie 1, ce qui est tout à fait très bien aussi, mais vous devrez aller sur github.com et télécharger les fichiers de démarrage que nous allons utiliser tout au long de ce processus classe. Suivez le lien que vous pouvez voir à l'écran ici. Une fois que vous arrivez sur cette page, cliquez sur le bouton charbon vert, puis téléchargez-le sous forme de fichier zip. Ouvrez ce dossier de projet dans votre éditeur de texte préféré. Je vais utiliser Visual Studio Code, mais vous pouvez utiliser ce que vous préférez. C'est tout ce dont vous avez besoin pour commencer , et je vous verrai ensuite. Nous allons commencer par jeter un coup d'œil aux boucles for-loops. 3. Partagez votre travail sur Skillshare !: Lorsque vous suivez un cours, il est très important de ne pas prendre l'habitude de suivre un cours juste pour le plaisir de cocher une autre conférence. Prenez le temps de lire chaque leçon, revoir le code que vous écrivez et de réfléchir à la manière dont vous pourriez aborder ces solutions vous-même. Dans cet esprit, ce cours est basé sur des projets, ce qui vous donne l'opportunité de vraiment créer quelque chose de personnel et d'unique. Vous n'avez pas besoin de trop vous perdre et de éloigner de la classe . Vous pouvez même prendre du recul une fois que vous avez terminé le cours et revenir et apporter des modifications au projet par la suite. Cela vous donnera vraiment une bonne chance de mettre en pratique ce que vous avez appris en classe. N'oubliez pas non plus de partager votre projet ici sur Skillshare et je suis le seul à y jeter un coup d'œil, mais il inspirera également les autres étudiants. Pour plus d'informations sur le projet de classe, rendez-vous dans l'onglet Projet et ressources, où vous pouvez non seulement télécharger votre projet, mais également voir d'autres projets de classe. Dans cet esprit, j'ai hâte de voir ce que vous créerez et téléchargerez ici sur Skillshare. 4. Pour Boucles: Bienvenue de retour. Cette section va porter sur les boucles. Nous allons lancer les choses avec une boucle for-loop. Lorsque nous avons commencé à travailler avec des tableaux plus tôt, nous avons examiné différentes façons de répéter certaines tâches à l'aide de ces boucles. Les types de boucle que nous avons examinés étaient cartographiés, et FoReach, tous deux étaient des méthodes matricielles. Les boucles signifient que nous pouvons répéter les tâches beaucoup plus facilement. Même s'il existe différents types de boucles, ils continuent généralement de répéter une tâche plusieurs fois. Souvent, la principale différence réside dans la façon dont nous demandons à la boucle d'arrêter ces cartes, et les boucles FoReach étaient des méthodes de tableau, mais les boucles ne sont pas exclusivement destinées aux tableaux. Il existe également différents types de boucles que nous pouvons utiliser pour pouvoir passer en boucle à peu près tout ce dont nous avons besoin. Cette vidéo va se concentrer sur une boucle for-loop. Voici à quoi ressemble une boucle for-basique. Il se présente un peu comme une fonction ou une instruction if. Remarquez à l'intérieur des crochets deux points-virgules. Ils sont utilisés pour transmettre les expressions libres qui définissent le fonctionnement de notre boucle. Un exemple très simple ici est simplement de l'utiliser pour augmenter le nombre et nous examinerons quelques meilleurs exemples dans un instant. Mais pour la première expression, elle contient la valeur initiale ou initiale de notre boucle. Si nous voulons simplement commencer par un nombre zéro ou augmenter à chaque fois, nous configurons une variable à zéro, comme ceci. Deuxièmement, nous avons une condition et ici nous verrons que le nombre est inférieur à 10. Cette condition détermine si la boucle doit continuer. Si c'est vrai, la boucle continue. Si la valeur est fausse, la boucle se terminera. Enfin, si nous ne faisons pas quelque chose sur chaque boucle, la deuxième condition sera toujours vraie. Ici, nous augmentons la valeur du nombre d'un sur chaque boucle. Nous pouvons donc vérifier l'état après chacun de ces changements. Pour parcourir cet exemple après l'exécution de chaque boucle, le nombre sera augmenté un jusqu'à ce qu'il atteigne le numéro 10, entraîne la valeur false de la deuxième instruction qui entraîne la valeur false de la deuxième instruction, ce qui entraîne la boucle puis terminez. Dans cet exemple particulier, nous consignerons 10 valeurs, qui seront comprises entre zéro et le numéro neuf. Si la variable est déjà déclarée en dehors de la boucle for-loop, vous pouvez ignorer et inclure simplement les deuxième et troisième instructions, et les choses s'exécuteront toujours de la même manière qu'auparavant. De plus, il convient de noter que vous verrez de nombreux exemples avec le nom de la variable, la lettre i, qui est abréviation de l' initialiseur ou de la valeur initiale. C'est généralement le cas si nous n' utilisons cette variable que dans le cadre de la boucle et que nous n'avons pas besoin de noms de variables descriptifs ailleurs. Notez que nous devons toujours garder les points-virgules en place afin de pouvoir clairement séparer ces trois valeurs en quelques exemples. Jetons un coup d'œil à nos fichiers de démarrage. Pour cette section, accédez à la section numéro 6, qui est des boucles et des conditions. La première leçon, qui est for-loops, saute dans la page d'index, qui est à peu près vide pour l'instant. Ensuite, nous copierons le chemin d'accès à cela, puis le collerons à l'intérieur du navigateur. Nous n'avons pas de contenu pour le moment, juste le titre des boucles for-loops, puis le script vide en bas pour que nous puissions travailler. Allons à l'intérieur de la section script et nous pouvons commencer à créer notre première boucle for-loop. En regardant précédemment, nous utilisons le mot-clé for, crochet démarre nos instructions libres, puis les accolades bouclées. Pour cet exemple, nous allons simuler quelqu'un qui mange une pizza avec 10 tranches différentes. Ensuite, nous déduirons une tranche de pizza après chacune de ces boucles. Tout d'abord, notre initialiseur ou notre variable, que nous appellerons des tranches. Nous allons définir cette valeur sur la valeur initiale de 10 et la prochaine étape, nous continuerons à exécuter la boucle tant que ces tranches sont égales ou supérieures à la valeur d' un point-virgule. Ensuite, nous déduirons la valeur des tranches de la valeur d'une à chaque fois. Maintenant, pour résumer, nous allons commencer par 10 tranches ou la valeur de 10. Ensuite, une fois la boucle terminée, cela déduira une tranche pour qu'elle soit alors égale à neuf, neuf est supérieure ou égale à un, de sorte que la boucle continuera donc à fonctionner. Ensuite, il fonctionnera une deuxième fois. Ensuite, cela déduira les tranches de pizza à huit, puis sept, puis six. Il continuera de fonctionner jusqu'à ce que la valeur soit supérieure ou égale à un. À l'intérieur des accolades, nous ajoutons le code que vous souhaitez exécuter. Prenez un exemple simple, nous pouvons créer un journal de console avec la valeur des tranches. Cela va être déduit de 10 jusqu'à un. Après cela, une deuxième console se connecte avec le texte de chaque tranche. Nous pouvons également ajouter des éléments tels que des instructions conditionnelles à l'intérieur d'ici. Cette instruction conditionnelle va vérifier si les tranches sont égales à la valeur d'une. Si c'est le cas, nous serons en place dans un journal de la console avec le texte d'aucune tranche restante. Sauvegardons cela et passons dans les outils de développement. cliquez avec le bouton droit de la souris et « Inspecter » dans la console. Nous voyons que la valeur de 10 sur la première boucle est ensuite déduite de la valeur d'une à chaque fois. Nous descendons jusqu'à la valeur d' un, puis il prend une note des tranches restantes. Quelque chose que vous pouvez voir, mais probablement pas autant n' est pas une seconde valeur manquante, c' est-à-dire cette condition. Nous devons cependant laisser le point-virgule en place et avant de tester cela, vous remarquerez peut-être déjà un problème. Si vous n'avez aucune condition. Nous n'avons aucun moyen d' arrêter une boucle. Cela va continuer à fonctionner à l'infini. C'est quelque chose dont nous devons faire attention lors de la création de boucles. Nous devons nous assurer que la condition des boucles finit par devenir fausse. Sinon, nous nous retrouverions dans une boucle infinie, ce qui entraînerait le blocage du navigateur. Ne faites pas cela et ne suivez pas cet exemple. Mais je vais vous montrer ce qui se passe dans le navigateur. Si nous sauvegardons cela, rafraîchissez-le. Nous voyons que la boucle s'exécute des milliers de fois, ce qui prend toutes les ressources du navigateur, ce qui provoque un crash éventuel. Pour éviter cet écrasement ou cette boucle infinie, nous devons utiliser manuellement le mot-clé break à l'intérieur de la boucle lorsque nous voulons qu'elle s'arrête. Par exemple, si nous passons à cette section inférieure, nous savons dans l'instruction if qu'il s' agit de la dernière boucle. Ce que nous pouvons faire, c'est que nous pouvons ajouter le mot-clé break. Cela sort ensuite de la boucle , puis arrête l'exécution du code. Nous pouvons tester cela en ouvrant encore une fois le navigateur. Ouvrez la page d'index, puis accédez outils de développement, à la console et à notre boucle, cela fonctionne désormais comme prévu. Une autre chose utile que nous pouvons faire avec boucles for-consiste à créer plusieurs éléments, tels que des éléments de liste. À l'aide d'une boucle, nous pouvons créer, disons, 10 éléments avec beaucoup moins de code que nous ne le ferions si nous l' écrivions 10 fois. Faisons cela juste à l'intérieur du script, créera une constante appelée ul, où nous allons créer une nouvelle liste non ordonnée. Nous le faisons avec Document.CreateElement. Transmission des éléments ul que vous souhaitez créer. Juste avant de commencer à créer les éléments de la liste, nous ajouterons notre liste non ordonnée au corps. Prenez le corps avec Document.Body.AppendChild, en passant notre variable ul. revenant simplement à ce que nous avons examiné précédemment, nous allons modifier notre exemple de pizza et le remplacer par le nom de variable i. Rappelez-vous que c'est une convention de dénomination courante pour une variable à l'intérieur de une boucle. Nous allons initialement définir cette valeur comme une valeur de 1. Nous allons le faire dans le sens inverse d'avant. Nous commencerons par la valeur initiale d'un, puis nous continuerons à exécuter la boucle pendant que je suis inférieur ou égal à la valeur de 10. Par conséquent, nous devons augmenter cela de la valeur d' un sur chaque boucle, ce qui entraînera l'exécution de la boucle 10 fois. Nous pouvons déplacer tous les contenus de l'intérieur ici, puis créer nos éléments de liste. Créons notre élément de liste, nous allons sélectionner le document.CreateElement passe dans l'élément de liste. Stockez-le à l'intérieur d'une constante appelée li. Cela nous donnera alors un élément de liste vide. Nous devons ensuite placer le contenu l'intérieur de la balise d'ouverture et de fermeture. Nous pouvons le faire avec Documents.CreateTextNode, et nous pouvons placer dans n'importe quel exemple de texte que nous voulons faire à l'intérieur d'ici. Plutôt qu'une chaîne normale, je vais insérer une variable à l'aide des backticks. Nous dirons l'élément de liste placé dans notre variable avec le symbole $ et les accolades. Nous savons d'en haut que nous avons une variable appelée i, qui est égale à la valeur d'un. Ensuite, si vous continuez d'augmenter la valeur d'un pour chaque boucle. Nous pouvons vérifier cela en plaçant ça à l'intérieur d'ici. Cela devrait commencer par la valeur de l'élément de liste un, l'élément de liste deux, etc. Tout cela à l'intérieur d'une constante, disons un texte. Ensuite, nous pouvons fusionner ces deux éléments ensemble en accédant au parent, qui est l' élément de liste qui utilise AppendChild. Placez ensuite notre texte à l'intérieur de l'élément de liste. Enfin, lorsque nous créons chacun de ces éléments de liste, nous voulons ensuite nous pousser vers notre liste non ordonnée. De la même manière que nous l'avons fait avec notre article de liste. Nous sélectionnons notre liste non ordonnée AppendChild, où nous transmettons l'élément de notre liste. Jetons un coup d'œil, rafraîchissons le navigateur. Cela doit juste être i pour correspondre à l'actualisation de la variable. Nous voyons maintenant la valeur de l'élément de liste un tout au long de la liste pour lister l'article 10. Comme vous pouvez l'imaginer, si nous avons créé ces 10 fois distinctes, cela entraînerait beaucoup plus de code. L'utilisation de cette boucle en fait un exemple beaucoup plus court. 5. Pour ...in & For...in: Nous allons maintenant couvrir deux autres types de boucles, appelées for-in et for-of. Ils ont l'air assez similaires et ils parcourent tous les deux quelque chose comme vous vous y attendiez, mais la principale différence est ce qu'ils peuvent parcourir. Ouvrons les fichiers de démarrage et voyons ce que nous avons. la barre latérale, passez Dans la barre latérale, passez à la leçon numéro 2 de cette section, qui est for-in et for-of, puis ouvrez-la dans le navigateur. Tout d'abord, nous voyons une section for-in qui contient un objet produit avec diverses propriétés imbriquées à l'intérieur. Comme vous pouvez vous y attendre, c'est ainsi qu'une boucle for-in fonctionne. Nous utilisons ce type de boucle pour parcourir les propriétés à l'intérieur d'un objet, telles que le nom et la taille. Maintenant, il y aura la section for-of, et elle est utilisée pour passer en boucle sur des objets itérables. Un objet itérable est essentiellement certains d'entre eux que nous effectuons une boucle, comme un tableau ou une liste de nœuds. Commençons par le haut avec notre boucle for-in, et nous allons l'utiliser pour passer en boucle sur nos objets produits. Nous pouvons le faire juste en dessous. Cela ressemble un peu à notre boucle for-loop de la vidéo précédente, nous avons configuré le mot-clé for, les crochets puis les accolades. Sauter sur le premier jeu de crochets, et c'est ainsi qu'une boucle for-in fonctionne. Nous avons configuré une variable, et nous appellerons cette propriété car nous parcourons toutes les propriétés de cet objet, qui se trouvent dans notre objet produit. C'est de là que vient le terme for-in, nous avons le mot-clé for, puis le mot-clé in entre crochets. Nous sommes en boucle sur cet objet produit complet , puis nous stockons la valeur de la propriété à l'intérieur de cette constante. Voyons à quoi cela ressemble avec un journal de console de la valeur de notre variable, propriété, l'actualisation, et nous voyons la valeur du SKU, le nom, la taille et la couleur. Cela nous donne la valeur de la clé, mais qu'en est-il de la valeur réelle de la propriété telle que la chemise cool, taille moyenne et le bleu ? Eh bien, nous pouvons également le faire en accédant à notre produit, puis en utilisant les crochets. Jetons un coup d'œil à ce que cela ressemble à l'intérieur d'un journal de console. Nous pouvons utiliser les coches arrière pour insérer une variable, et nous allons commencer par insérer la valeur de la propriété. Ce ne sont que les touches que nous verrons déjà à l'intérieur de la console, mais ajoutez ensuite un deux-points pour séparer cela, puis insérez notre deuxième variable. La deuxième variable sera chacun de ces produits. Nous allons saisir le produit, puis nous pourrons utiliser les crochets pour le réduire à une propriété particulière. Nous transmettons la valeur du SKU, du nom, de la couleur ou de la taille. Si nous l'enregistrons et l' actualisons, nous avons maintenant créé une nouvelle chaîne pour chacune de ces propriétés, qui inclut à la fois la clé et la valeur de la propriété. C'est ainsi qu'une boucle for-in fonctionne sur un objet en boucle. Jetons maintenant un coup d'œil à for-of. Je veux commenter cette section, puis descendre en bas sous nos autorisations. Encore une fois, cela commence par le mot-clé for, les crochets et les accolades, et il prend également en compte une variable. Disons la valeur const, qui sera définie sur chacune des valeurs à l'intérieur du tableau. Cette fois-ci, plutôt que d'utiliser le mot-clé in que nous utilisons, puis transmettez exactement ce que nous voulons parcourir. Dans notre cas, il s'agit du tableau d'autorisations juste en haut. C'est dans les autorisations, puis à l'intérieur des accolades, nous pouvons accéder à notre valeur. Sur la première boucle, la valeur est utilisateur, la seconde boucle est éditeur, puis admin, sauvegarde et actualisation, et il y a nos trois valeurs à l'intérieur de la console. Comme vous pouvez le voir à l'intérieur de ses commentaires en haut, choses comme une liste de nœuds peuvent également être bouclées. N'oubliez pas que lorsque nous utilisons quelque chose comme sélecteur de requêtes pour obtenir plusieurs éléments, une liste de nœuds est ce que nous récupérons. Pour essayer cela, nous avons également besoin de quelques éléments pour passer en boucle. Je vais sortir de ces scripts, créer une liste non ordonnée avec des exemples d' éléments de liste juste à l'intérieur. allons dupliquer deux fois de plus au lieu de tourner les numéros 2 et 3, puis nous pourrons passer en boucle sur nos trois éléments de liste, qui retourneront ensuite une liste de nœuds. Par conséquent, nous pouvons utiliser la boucle for-of. L'étape 1 consiste à accéder aux trois éléments de la liste. Je vais juste au-dessus de notre boucle for, créer un lien d'appel constant, les récupérer avec Document.QuerySelector, en fait, nous avons besoin de QuerySelectorAll puisque nous accédons plusieurs éléments et une fois que vous aurez récupéré notre liste articles. Maintenant, plutôt que d'accéder à nos autorisations, ce que nous allons faire est d'accéder à tous les liens, qui sont nos trois éléments de liste puis de changer le nom de la variable par le lien. La valeur du lien sur notre première boucle est le premier élément de liste, le deuxième élément de liste, puis le troisième. Nous pouvons faire tout ce que nous voulons avec ces liens. Pour cet exemple, je vais accéder à nos liens, puis utiliser AddEventListener. Écoutez un clic sur n'importe lequel d'entre eux. Cela va alors exécuter une fonction, nous allons transmettre les informations sur l'événement , créer une alerte. Pour accéder au contenu de chacun de ces éléments de liste, tels que 1, 2 et 3, nous pouvons le faire en accédant aux informations sur les événements, sélectionnez e. target, qui est les informations à ce sélectionnez e. target, qui est sujet élément de liste particulier sur lequel on a cliqué, puis affiche le code HTML interne de cet élément. Essayons ça. Maintenant, si nous actualisons, avez nos liens gratuits en haut, cliquons sur Numéro 2, il y a le code HTML interne. Le numéro 3 et le numéro 1 fonctionnent également correctement. Il s'agit d'une variance vraiment utile sur la boucle for-loop, que nous pouvons utiliser pour faire une boucle sur des éléments tels que les tableaux, liste de nœuds, ainsi que des objets. 6. Tout le monde est...: À mon avis, alors que les boucles semblent un peu plus simples que les quatre boucles que nous avons regardées auparavant. La configuration de base ressemble à de nombreuses autres choses en JavaScript, telles qu'une fonction de base et des instructions if et même la boucle for. Une boucle While continuera de fonctionner tant qu'une condition est définie sur true. Pour cet exemple, nous avons une variable numérique simple puis la boucle continuera d'être exécutée alors que le nombre est inférieur à 30. Cette vérification est effectuée avant que le code de la boucle ne soit exécuté. Par conséquent, si elle est fausse, la boucle s'arrêtera. Comme pour la boucle for, nous avons également besoin d'un moyen d'arrêter les choses afin qu'elles ne se transforment pas en boucle infinie. Nous le faisons à l'intérieur de la boucle en incrémentant la valeur du nombre d'un sur chaque boucle. Ce qui signifie qu'il fonctionnera 30 fois avant qu'il ne s'arrête. Passons à nos fichiers de démarrage et essayons cela. La prochaine leçon dont nous avons besoin est le numéro 3. Il s'agit de la section de boucle while. Ouvrez-le, et aussi à l'intérieur du navigateur. Comme vous pouvez le constater, nous avons un fichier de démarrage vide avec le script en bas. Ce que nous allons faire ici c'est de configurer quelques variables. Tout d'abord, une constante appelée StadiumCapacity, et définissez cette valeur égale à 100. Il s'agit de la capacité du stade et nous allons ensuite mettre en place une deuxième variable, qui sera pour le nombre de fans auxquels nous sommes actuellement saisis. Puisque cela peut être augmenté, nous devons utiliser le mot-clé et le définir comme égal à la valeur CurrentlyEnted, qui commencera à zéro. Ce que nous voulons faire, c'est continuer à exécuter une boucle alors que la valeur de CurrentlyEnted est inférieure à la StadiumCapacity. Une boucle While est idéale pour cela. Nous avons configuré notre mot-clé while, les crochets, puis les accolades bouclées juste après. Ce que nous allons faire, c'est de maintenir cette boucle exécution alors que la valeur de CurrentlyEnted, qui est zéro, est inférieure à la capacité StadiumCapacity. Fondamentalement, si zéro est inférieur à 100, le code à l'intérieur d' ici s'exécutera. Placer un journal de console avec un texte d'entrée, et nous devrions pouvoir accéder à la console et vérifier cela. Mais juste avant de faire cela, prenons du recul et regardons cette boucle. Si nous y réfléchissons, nous voulons jeter un coup d'œil à notre état où ils sont actuellement entrés est inférieur à la capacité du stade. Pour le moment, nous n'avons aucun moyen de modifier ces deux valeurs variables. Fondamentalement, ce sera toujours la valeur de vrai. Cela entraînera alors une boucle infinie et provoquera à nouveau un plantage à l'intérieur du navigateur. Pour n'exécuter cette boucle while qu' un certain nombre de fois, nous avons besoin d'un moyen d' augmenter la valeur de CurrentlyEnted sur chaque boucle. C'est assez simple. Nous accédons simplement à notre valeur, puis nous utilisons plus plus, ce qui augmentera la valeur d'une sur chaque boucle jusqu'à la valeur de 100. Une fois que cela atteint la valeur de 100, cette condition ne sera plus vraie, ce qui signifie que notre boucle s'arrêtera. Jetons un coup d'œil à l'intérieur du navigateur, rafraîchissons et montons dans la console. Bien et nous voyons que notre texte d'entrée a été répété 100 fois. La variance de cette boucle while est en cours de réalisation. Il s'agit d'une version commutée de cette boucle while. Avant d'entrer dans les diapositives, j'ai mentionné que le code à l'intérieur de cette boucle s' exécutera toujours une fois cette condition vérifiée. Fondamentalement, si cela se traduit par faux, le code à l'intérieur de cette boucle ne s' exécutera jamais même une seule fois. Nous pouvons retourner cela et nous assurer que le code s'exécute au moins une fois, puis effectuer la vérification par la suite. Cela est utile si nous voulons toujours nous assurer que le code s'exécute au moins une fois avant l'arrêt de la boucle. Pour ce faire, juste au-dessus notre section pendant, nous allons créer une section Faire. Nous dirons que oui, ouvrez les accolades bouclées, et comme nous voulons toujours que cela se déroule une fois, nous sautons tout droit dans les accolades bouclées, nous n'avons pas besoin d' ajouter de condition. Ensuite, nous pouvons récupérer notre code dans la boucle while. Découpez ça à sa place. Ajoutez-le dans la section Faire. Je vais retirer les accolades bouclées de la boucle While. Comme vous pouvez le constater, le code se trouve désormais à l'intérieur de la section Faire, ce qui signifie qu'il sera toujours exécuté au moins une fois avant même d' effectuer notre vérification. Notre contrôle est toujours vrai, cela continuera à fonctionner la deuxième fois, dans notre cas, jusqu'à 100. Allons vérifier ça. Nous pouvons enregistrer cela et actualiser le navigateur. Nous avons toujours obtenu exactement les mêmes résultats qu'avant. Nous pouvons tester cela en définissant la valeur CurrentlyEnted sur 100, qui définit ensuite cette valeur sur false. Si nous l'enregistrons et que nous actualisons maintenant, nous voyons la valeur entrée de notre journal de console unique car notre code s'exécute en premier, puis il effectuera la vérification à l'intérieur de la boucle while. agit simplement d'une alternative selon que nous voulons toujours que le code s'exécute en premier ou qu'il teste d'abord la condition avant d'exécuter un code à l'intérieur de notre boucle. 7. Si / Autres Déclarations & Nesting: Pour cette vidéo, accédez à la section des instructions if-else et ouvrez-le également dans le navigateur. Vous pouvez voir en haut que nous avons déjà un objet utilisateur configuré et aussi si une instruction juste en dessous. Nous avons donc utilisé des instructions if quelques fois déjà lors des exemples précédents. Il n'y a pas beaucoup plus à y ajouter que ce que nous avons déjà couvert. Ils exécutent simplement du code entre ces accolades. Si la condition à l'intérieur d' ici est définie pour être vraie. Dans cet exemple, nous avons un objet utilisateur en haut. Cela serait vrai puisque nous avons un objet présent, qui signifie que notre journal de console fonctionnera. Si l'utilisateur a été déconnecté, il peut être défini que notre variable est nulle, comme ceci, de sorte que cet utilisateur soit égal à null, qui entraînerait une fausse valeur et le code à l'intérieur de la case if ne s'exécuterait pas. Nous nous occupons donc de savoir si la condition est vraie. Mais qu'en est-il si nous voulons également gérer si la condition est fausse ? C'est là que d'autres déclarations entrent en jeu. Nous les placons immédiatement après l'instruction if et ce bloc de code exécutera dans tous les cas qui ne sont pas couverts par la section if. Nous avons ces exemples similaires configurés à l'intérieur des fichiers de démarrage et ici nous ne gérons la condition que si l' utilisateur est connecté. Vous vous demandez peut-être pourquoi ne pas simplement gérer la condition de déconnexion en dessous de cela. Ou nous pourrions faire quelque chose comme ça. Nous pourrions créer un journal de console ou n'importe quel code que vous souhaitez, où nous pouvons dire que l' utilisateur est déconnecté. Eh bien, essayons cela et voyons ce qui se passe si nous nous rafraîchissons et sautons dans la console. Ici, nous pouvons voir que le journal de la console a été exécuté deux fois. L'utilisateur est connecté et l' utilisateur est également déconnecté. Il est donc évident que pour quelque chose qui est sensible à la sécurité, comme un utilisateur connecté ou déconnecté, nous voulons qu'une seule de ces conditions s'exécute. Cela, nous pouvons mettre en place nos déclarations if, que nous avons ci-dessus, suivies de la déclaration d'autre. Supprimons le journal de la console. Je place la section autre et j'ajoute notre code à l'intérieur d'ici. Rafraîchissons et nous voyons que l'utilisateur est connecté car nous avons un objet utilisateur présent en haut. Si nous le modifions également pour qu'il s'agisse de l' opposé et que l'utilisateur est égal à une valeur fausse de null. Cela devrait alors être déconnecté de l' utilisateur. Si nous le voulions, nous pourrions également ajouter plusieurs déclarations if à et poussons simplement notre déclaration else vers le bas. Ensuite, entre les deux, nous pouvons ajouter une deuxième déclaration if, comme nous l'avons fait plus haut. Nous pouvons vérifier une deuxième condition, telle qu'un utilisateur ou un rôle, qui est actuellement définie sur admin. Nous pouvons vérifier s'il s'agit d'une valeur particulière et si elle se trouve à l'intérieur des accolades, nous ferons un journal de console, disons, Hey admin, testez ceci, actualisez. Maintenant, nous voyons que l'utilisateur est connecté et qu'il joue également le rôle d'administrateur. Cela fonctionne, mais cela pose également un problème, nous devons être très prudents avec ce type de configuration. Parce que cette instruction else, que nous aurons en bas en bas suit immédiatement la deuxième instruction if. Cela signifie que la section autre ne s' exécutera que si le rôle de l'utilisateur n' est pas défini sur admin, ce qui n'a aucun sens. Nous avions donc un utilisateur tel que null, donc avec l'utilisateur, nous ne sommes pas connectés. Actualisez. Cela va maintenant générer une erreur car nous essayons d'accéder au rôle de point utilisateur, qui n'est plus disponible car nous n'avons plus nos objets utilisateur. Pour ce genre d'utilisation de cet exemple pour le rendre un peu plus logique et plus pratique, nous voulons seulement vérifier si le rôle de l'utilisateur est égal à celui d'administrateur, s'est réellement connecté. Pour ce faire, nous pouvons imbriquer nos déclarations if en coupant la deuxième déclaration if. Nous pouvons coller ça à l'intérieur du premier. Cela nous ramène au premier exemple. Nous avons deux contrôles de premier niveau. Nous avons la déclaration if, l'utilisateur est connecté, suivi de la section autre juste en dessous. Ensuite, l'instruction if qui est imbriquée à l'intérieur ne sera détruite que si l' utilisateur s'est réellement connecté. Si l'utilisateur est connecté, ce journal de console s'exécutera. Ensuite, s'ils sont également connectés en tant que rôle d'administrateur, le deuxième journal de la console s' exécutera également . Essayons ça. Actualisez et l' erreur est maintenant effacée. Nous voyons que l'utilisateur est déconnecté car il est défini sur Null. Reprenons cela, le nom pour être égal à tout ce qui se trouve sur le rôle de retour à l'administrateur. Maintenant que cela est en place, nous avons maintenant un utilisateur. Le premier journal de la console doit donc être exécuté. Nous avons également un rôle d'utilisateur égal à administrateur. Nous devrions maintenant voir deux journaux de console à l'intérieur d'ici. C'est ainsi que nous pouvons utiliser des instructions if else de premier niveau et aussi comment imbriquer une instruction if à l'intérieur. Si vous le vouliez, vous pourriez également aller encore plus loin juste après la section imbriquée if, nous pourrions également placer dans une autre section pour que nous puissions créer un journal de console. Pour cette section, nous savons que l'utilisateur est réellement connecté, mais nous voudrons également vérifier s'il n'est pas administrateur. Donc, ici, cela fonctionnera s'ils sont l'administrateur. Sinon, nous allons simplement dire : Hey utilisateur, rafraîchir. Nous voyons toujours hey admin puisque le rôle est défini sur cela. Mais si nous changeons cela pour être abonné, l'instruction if imbriquée est désormais fausse, ce qui signifie que la section hey user va maintenant s'exécuter. Si vous le voulez. Vous pouvez également aller aussi profondément que nous le voulions en imbriquant plusieurs sections si elles sont également imbriquées. Mais nous devons faire attention à ne pas passer par-dessus bord et à rendre le code difficile à lire et aussi à comprendre pour les autres développeurs. En règle générale, nous pouvons généralement couvrir la plupart des cas d'utilisation sans avoir besoin d'aller plus loin. Donc, si vous constatez que vous êtes peut-être trois ou quatre niveaux de profondeur avec les instructions ou les vérifications, il y a généralement une meilleure façon de faire les choses. 8. Autre si: Dans le dossier de cette leçon, qui est la section else if, vous trouverez juste en dessous du script, nous avons le même exemple de la vidéo précédente. Nous traitons ici deux conditions de premier niveau que nous enregistrons. Tout d'abord, si l'utilisateur est connecté, puis dans section, saisissez ce qui se passe si l'utilisateur n'est pas connecté. Dans la section connectée, nous avons également une section imbriquée si autre. Ajoutez un message d'accueil différent si l'utilisateur est égal à admin. Nous avons deux options au niveau supérieur et deux options imbriquées. Mais qu'en est-il si nous voulions aussi une troisième option ? Pour cela, nous avons aussi si. Jetons un coup d'œil à cela, nous allons simplifier cet exemple en supprimant les instructions imbriquées. À l'intérieur d'ici, nous supprimerons l'imbriqué si autrement nous laisse un simple connecté ou déconnecté. Si vous vous souvenez de la vidéo précédente, nous avons jeté un coup d'œil à la façon de gérer brièvement une troisième condition en ajoutant une deuxième déclaration if, comme ceci. Mais le problème que cela nous pose, c'est que la section autre est maintenant liée à notre deuxième énoncé if. Essentiellement, ce qui signifie que notre première déclaration si est maintenant déconnectée. Si nous voulons toujours garder ces trois éléments connectés sans rapport les uns avec les autres, nous pouvons transformer ce second en un autre endroit. Juste avant la section if, nous pouvons ajouter une deuxième condition à l'intérieur d'ici. Tout d'abord, nous voulons vérifier si l'utilisateur est connecté, puis à l'aide de la double esperluette, nous pouvons également effectuer une seconde vérification. Nous pouvons vérifier si l'utilisateur .role est égal à l'abonné, et si c'est le cas, nous allons ensuite exécuter le code à l'intérieur d'ici. Maintenant, nous allons simplement placer dans un simple journal de console indiquant l'autre si la section a été exécutée, sauvegardez-la, puis sur le navigateur et nous verrons ce qui se passe à l'intérieur d'ici. Nous voyons le texte de l'utilisateur connecté. Vous vous demandez peut-être pourquoi nous voyons le texte du seul utilisateur connecté et non pas aussi de la section autre si s' exécutée car après tout, l'utilisateur est présent et l'utilisateur .role est égal à abonné. La raison est qu' une seule de ces sections sera exécutée. Si la condition est remplie, le code à l'intérieur s' exécutera et il n'ira pas plus loin dans le reste de ces sections. En fait, seul le premier match sera organisé. Si nous voulons qu'il soit plus spécifique avec la première section, nous pourrions également copier cet utilisateur.role déposer ceci dans la première section et nous pouvons également vérifier si cela est égal à admin. Étant donné que notre rôle d'utilisateur est égal à celui d'abonné, il doit désormais être faux. Parce que nulle part ailleurs si la section fonctionne maintenant. Sauvegardons cela et testons cela dans le navigateur. La section autre if va maintenant s'exécuter. Puisqu'il s'agit de notre première section , nous pouvons maintenant faire ce que nous voulons dans chacune de ces sections, nous pouvons afficher et masquer le contenu en fonction du rôle de l'utilisateur. Nous pouvons les rediriger vers une zone de compte. Nous pouvons désactiver les fonctionnalités auxquelles l'utilisateur n'est peut-être pas autorisé à accéder ou tout autre élément auquel vous pourriez penser. Nous pouvons également utiliser plusieurs autres sections si. Si nous voulions vérifier plus que ces trois conditions, nous pourrions également faire la même juste après la section autre if, placée dans une seconde. Il est probablement conditionné juste en haut. Cette fois, nous allons vérifier si l'utilisateur .role est égal à auteur. S'il est placé dans un journal de console, enregistrez-le et comme vous vous y attendez, nous devrions voir le même résultat qu'auparavant puisque nous avons le jeu d' abonnés, ce qui correspond à cette section. Mais si nous changeons maintenant cette offre pour être l'offre, la section if est désormais fausse et la première autre si la section est également fausse et notre nouveau journal de console avec le texte de l'auteur, s' exécuterait maintenant. à l'intérieur de la console. Enfin, si aucune de ces sections, si ou si les sections sont vraies, nous changeons donc pour être un utilisateur, nous devrions maintenant nous rabattre pour utiliser la section autre en bas. 9. L'instruction switch: L'énoncé Switch est un moyen de fournir autant de résultats que nécessaire en fonction d'une seule condition. Nous pouvons également fournir plusieurs résultats avec des déclarations if et des déclarations si autres comme nous l'avons regardé précédemment. Mais comme nous l'avons découvert, nous devons ajouter quelque chose à vérifier pour chacune de ces conditions, par exemple lorsque nous vérifions des éléments tels que le rôle de l'utilisateur pour chacune de ces conditions. Cependant, avec une instruction switch, nous testons simplement la même condition pour chacun d'eux. Juste ici avec notre variable de pizza préférée. L'instruction switch juste en dessous, encore une fois, ressemble dans sa configuration à des éléments comme les instructions vide if et aussi pour les boucles. Nous transmettons ensuite ce que nous voulons vérifier, comme notre variable de pizza préférée. Ensuite, à l'intérieur, nous avons mis en place les différentes étuis pour gérer ce qu'est la pizza préférée. Ici, nous aurons trois cas distincts pour gérer ce qu'il faut faire pour chaque valeur. Nous pouvons avoir autant de cas que nous le voulons. Regardons le premier. Nous vérifions si la pizza préférée est égale au pepperoni. Si c'est le cas, nous exécutons ensuite du code à l'intérieur, comme ce journal de console. Nous fournissons ensuite le mot-clé break pour sortir de l'instruction switch une fois que nous avons une correspondance ce qui empêchera tout le reste du code et toutes les autres vérifications ci-dessous de s'exécuter. Il s'agit du même mot clé que celui utilisé précédemment dans cette section pour éviter que le navigateur ne crée une boucle infinie. Cela continuera d'être exécuté jusqu'à ce qu'une correspondance soit trouvée, mais si elle est introuvable, nous pouvons également ajouter une clause par défaut. Cette opération sera toujours exécutée s' il n'y a pas d'autres matchs. au projet et donnons un coup de fouet. Cette fois, nous sommes dans la section des instructions de commutateur et dans le fichier de démarrage, nous n'aurons qu'un objet utilisateur simple avec la propriété name et le rôle. Nous pouvons configurer une instruction switch pour vérifier le rôle de l'utilisateur et décider s'il peut modifier quelque chose sur notre site. Cela, nous pouvons le démarrer dans une variable appelée CanEdit. Par conséquent, CanEdit sera initialement défini sur la valeur false, de sorte que l'utilisateur ne se verra attribuer aucune autorisation de modification par défaut. Ensuite, nous pouvons utiliser une instruction switch pour vérifier le rôle particulier de l'utilisateur. Si le rôle particulier de l'utilisateur est égal à un niveau supérieur tel que l' administrateur ou même un éditeur, nous pouvons alors définir CanEdit sur true. Comme nous l'avons vu dans les diapositives, configurez nos instructions switch, puis nous transmettrons la condition qui est user.role. Ouvrez les bretelles bouclées, puis nous pourrons ajouter nos étuis à l'intérieur d'ici. Le premier cas sera celui de l'utilisateur. Il s'agit simplement d'un utilisateur connecté régulièrement. Ajoutez le deux-points. Ensuite, nous ajoutons ce que nous voulons faire pour ce cas particulier. Eh bien, dans notre cas, nous voulons que CanEdit soit égal à faux car ils n'ont pas les autorisations d'administrateur ou d' éditeur. Si ce cas particulier est vrai, je ne veux pas utiliser le mot-clé break pour sortir du reste de cette instruction de commutateur. C'est la première section. Ensuite, nous passons au deuxième cas et celui-ci va être abonné. Cela refléterait simplement la même condition que ci-dessus. Nous pouvons définir CanEdit comme égal à false. Ajoutez les mots-clés de rupture. C'est notre deuxième affaire maintenant terminée. La prochaine, nous ajouterons un dossier pour l'éditeur. Et comme cela semble, l' éditeur est un cas où nous voulons permettre à l'utilisateur de pouvoir modifier. Pour cela, nous allons définir notre variable CanEdit sur true, puis sortir de l'instruction switch. Enfin, le dernier cas sera destiné à l'administrateur. Dans l'Admin, nous voulons fournir toutes les autorisations dont ils ont besoin pour modifier notre site. Tout comme ci-dessus, nous allons définir CanEdit pour qu'il soit également égal à vrai, puis nous sortirons de l'instruction switch. Comme nous l'aurions vu dans les diapositives, nous devons également ajouter un cas par défaut, qui sera exécuté si aucun des cas ci-dessus ne correspond. Exemple très simple, il suffit de le placer dans un journal de console et nous dirons que le rôle d'utilisateur est introuvable. Nous allons également définir CanEdit sur false. Maintenant, il nous suffit de faire un test. Lorsque nous avons commencé ici, nous avons le rôle d'utilisateur égal à celui de l'utilisateur. Cela devrait définir CanEdit comme étant égal à false. Essayons cela en descendant vers le bas, nous allons placer dans un journal de console, placer dans la valeur CanEdit. Nous verrons si cela change pour chacun de nos cas. Comme nous le savons, aucun CanEdit ne sera égal à faux puisque nous avons actuellement le rôle d'utilisateur pour être égal à l'utilisateur. Jetons un coup d'œil aux outils de développement dans la console. C'est faux comme prévu. Vérifions notre deuxième condition en basculant le rôle en abonné, actualisant et comme vous vous y attendez, c'est faux. Le troisième est l'éditeur, cela devrait maintenant être vrai. Enfin, nous pouvons tester l'administrateur. C'est également vrai. Juste pour détecter la condition par défaut en bas, nous devrions voir le journal de la console et ils peuvent être égaux à false si nous n'avons pas de correspondance pour l'une de ces quatre conditions. Transformons cela en quelque chose de complètement aléatoire. Nous allons simplement taper n'importe quel rôle aléatoire à l'intérieur d'ici. Rafraîchir C'est faux et le journal de la console est désormais exécuté comme prévu. Juste une chose à surveiller si nous avons plusieurs étuis assortis. Si j'ai deux cas ou plus qui correspondent tous les deux, le premier cas correspondant sera utilisé. Aussi comme raccourci si nous avons plusieurs cas, comme nous l'avons fait ici, qui exécutent le même code à l'intérieur. L'utilisateur définira CanEdit comme égal à false et aussi à l'abonné. Il s'agit d'une section dupliquée, la même pour les deux derniers cas. Ces deux ensembles peuvent modifier pour être égal à vrai. Nous pouvons raccourcir un peu ce code pour le rendre un peu plus simple. Pour les deux premiers, qui sont exactement les mêmes, nous pouvons supprimer le code du premier. Ces deux cas se succèdent immédiatement. Ensuite, ce code sera exécuté pour chacun de ces cas. est exactement la même chose pour ces deux-là en bas. Nous pouvons déplacer le CanEdit et aussi la pause. Ces deux-là sont essentiellement regroupés. Nous pouvons simplement tester cela et si nous actualisons, nous voyons toujours la clause par défaut s'exécuter en bas. Essayons l'éditeur. Cela devrait être vrai. L'administrateur est également vrai. L'utilisateur doit être faux. Enfin, l'abonné. C'est cela pour les instructions de commutateur. Juste une chose rapide avant de passer à autre chose. Si nous oublions de mettre un mot clé break dans l' un de ces cas, tous les cas suivants s'exécuteraient également jusqu'à ce qu'une pause soit finalement trouvée. Par exemple, si nous avions manqué une clause de rupture à l'intérieur de cette section, nous pouvons supprimer cette clause. Si nous avons une correspondance pour l'utilisateur ou l'abonné, CanEdit sera toujours égal à false, mais il exécutera ensuite le code juste en dessous, puis remplacera CanEdit pour qu' il soit égal à vrai. Essayons ça. Nous avons le rôle égal à celui de l'abonné. Rafraîchir Maintenant, l' abonné CanEdit est entré en vigueur, mais le programme a continué à passer à l'éditeur et aussi à la section admin et provoque un remplacement, de sorte que CanEdit est maintenant égal à vrai. 10. Opérateur conditionnel (ternaire): Comme alternative aux if-else que nous avons examinées, Javascript dispose également d'un opérateur conditionnel, souvent appelé opérateur ternaire, car il est composé de trois parties. Comme il fonctionne, comme si c'est le cas, la principale raison pour laquelle il est utilisé est d'offrir une alternative simple ligne. En regardant cet objet utilisateur, nous voudrions peut-être vérifier l'âge de l'utilisateur avant de l'autoriser à entrer. L'opérateur conditionnel peut vous aider dans ce domaine. C'est comme une question. Nous demandons ici si l'âge de l' utilisateur est supérieur ou égal à 18 ans en utilisant le point d'interrogation. Avant, j'ai dit que le ternaire est composé de trois parties. La question n'est que cette première partie. Les deuxième et troisième parties sont ce que nous voulons faire si la question est vraie ou fausse. Si c'est vrai, nous pouvons faire n'importe quoi, mais cet exemple simple n' a que le texte d'entrée. S'il est faux, ce qui est correct pour cet exemple, le code après le deux-points s'exécutera à la place. Passons maintenant aux fichiers de démarrage et nous pouvons jeter un coup d' œil à l' exemple qui se trouve à l'intérieur. Nous avons ici un exemple de la façon dont nous pouvons utiliser une déclaration if pour vérifier si un utilisateur est administrateur qui peut modifier quelque chose sur notre site. L'objet utilisateur a le rôle d'administrateur et nous définissons actuellement la fonctionnalité CanEdit sur false. L'instruction if vérifie si le rôle de l'utilisateur, qui est juste ici, est égal à admin. Dans notre cas, nous pouvons définir la variable CanEdit sur true, ce qui permet à l'utilisateur d' aller de l'avant et publier quelque chose comme un article de blog. Si ce n'est pas le cas, CanEdit sera égal à false, supprimant toutes les autorisations dont ils peuvent disposer. Ce que nous allons faire, c'est convertir cet exemple pour utiliser l'opérateur ternaire, qui va simplifier cet exemple sur une seule ligne. Comme nous l'avons vu dans ces diapositives, la première partie est de poser la question. La question que nous voulons poser est de savoir si l'utilisateur .role est égal à la chaîne d'admin. Utilisez un point d'interrogation, suivi de nos vrais et faux résultats. Si l'utilisateur est égal à admin, nous voulons que ce canEdit soit égal à vrai, comme nous le faisons dans la section true l'instruction if-else. Définissez CanEdit comme étant égal à vrai, puis séparé par deux points, nous ajoutons la fausse instruction dans laquelle nous disons que CanEdit est égal à faux. Parfois, en fonction des paramètres de votre éditeur de texte ou de vos plugins, vous pouvez également voir ces deux instructions encapsulées entre crochets. C'est tout à fait très bien. Ce que je veux faire maintenant, c'est de commenter ou de supprimer les instructions if-else originales, puis nous pouvons enregistrer cela et passer au navigateur, actualiser, et nous voyons que cet exemple est défini sur vrai. Cela est vrai car l' utilisateur .role est égal à admin. Mais si nous changeons cela pour qu'il s'agisse d'autre chose, essayons l'abonné, vous devriez mettre à jour cela pour qu'il s'agisse de la valeur false. Nous pouvons également raccourcir cet exemple encore plus loin en attribuant directement le résultat de cet opérateur ternaire à cette variable. Ce que nous entendons par là, c'est plutôt que d' attribuer CanEdit pour être égal à vrai ou faux Lorsque vous coupez l' opérateur conditionnel complet d'ici, nous pouvons ensuite supprimer l'affectation initiale de false, coller ceci dans. Maintenant, plutôt que de définir notre variable, ce que nous faisons est simplement de définir la valeur vraie true et la valeur fausse sur false. Maintenant, le résultat vrai ou faux sera directement attribué à notre variable CanEdit. Essayons encore une fois. Actuellement, nous avons ce jeu pour être faux, mais si nous le modifions en tant qu'administrateur, c'est désormais vrai. L' opérateur conditionnel et la version if-else sont tous deux parfaitement valides à utiliser. L'opérateur conditionnel, comme nous venons de le voir, est généralement plus court et placé sur une seule ligne. Certains affirment qu'une déclaration if-else est plus claire et plus lisible, mais en fin de compte, c'est votre choix que vous souhaitez utiliser et celui que vous préférez. 11. Type Coersion & Conversion: Dans les prochaines vidéos, nous allons couvrir certains types et aussi des choses vraies ou fausses, qui peuvent vous donner des résultats étranges ou inattendus. En étant conscient de cela, vous pouvez comprendre choses comme pourquoi et si instruction ne fonctionne pas correctement, et vous permettra également de gagner beaucoup de temps lors du débogage. Le premier est la coercition de type. Nous connaissons déjà des types tels que les objets, les chaînes et les booléens. coercition de type concerne la façon dont les valeurs des types de données sont converties en autres types de données. En regardant à l'intérieur du dossier leçons qui est coercition et la comparaison de type, allez dans le index.html où nous avons un exemple simple. Nous avons deux variables en haut avec des nombres , puis nous allons les ajouter ensemble et les stocker à l'intérieur du total. Une chose à remarquer entre ces deux nombres est que le premier est enroulé dans ces citations donc techniquement, il s'agit d'une chaîne. Le second est un nombre, comme on peut s'y attendre. Mais que pensez-vous qu' il se passe lorsque nous ajoutons ces deux éléments ensemble ? Si nous ajoutions des chaînes, nous pouvons savoir à quoi nous attendre, car cela peut être combiné pour faire une phrase ou un mot. Si nous additionnons également deux numéros, ces deux chiffres seront ajoutés ensemble pour obtenir un nouveau total. Mais ici, puisque nous ajoutons une chaîne et un chiffre, que pensez-vous qu'il se passera ? Eh bien, plutôt que de provoquer une erreur, JavaScript est conçu pour choisir un type de données à convertir automatiquement. C'est ce qu'on appelle la coercition. Mais dans cet exemple, il peut choisir de convertir pour qu'il s' deux chaînes ou des nombres. Eh bien, ne devinons pas. Sauvegardons cela et allons dans la console et voyons exactement ce qui va se passer. Passez dans l'onglet de la console et rafraîchissez-vous et nous voyons la valeur de 72. La valeur 72 signifie qu'elle est convertie en chaîne car nous avons la valeur de sept, suivie de la valeur de deux, plutôt que de la valeur de neuf, ce qui se produirait si elles étaient convertis pour les deux en nombres. Cette conversion s'est produite automatiquement pour nous et cela peut être appelé implicitement et cette conversion implicite est ce qu'est la coercition. À ne pas confondre, mais la conversion de type est similaire . Cela fonctionne de la même manière que la coercition en convertissant une valeur d'un type de données à un autre. Mais nous pouvons également le faire nous-mêmes manuellement. Si nous voulions que cela soit converti manuellement en nombre, nous disposons d'une fonction numérique disponible. La façon dont nous pouvons l'utiliser est de couper notre numéro un, qui est une chaîne. Nous pouvons accéder à une fonction numérique, puis placer à l'intérieur de ce que nous voulons convertir en nombre. Ici, nous convertissons une chaîne en nombre. Maintenant, si nous sauvegardons cela, nous devrions voir la valeur de neuf dans la console, ce qui signifie que les deux sont attirés sous forme de chiffres. Pour résumer, la coercition se produit implicitement ou automatiquement. La conversion de type peut également se faire manuellement, comme nous le voyons avec cette fonction numérique. Parfois, ces mots sont utilisés de manière interchangeable, mais c'est la ligne officielle de ces deux mots. Si vous le vouliez, nous pourrions également faire le contraire. Plutôt que de convertir celui-ci en nombre, nous pourrions convertir le second en chaîne. Nous le faisons avec la fonction chaîne. Transmettez le nombre que vous souhaitez convertir en chaîne et cela reviendrait ensuite à la valeur de la chaîne 72. Pour cette raison, il peut être bon de toujours convertir les données entrantes pour correspondent exactement au type de données que nous voulons qu'elles soient. Si, par exemple, nous obtenons des données provenant d'un tiers, comme un serveur ou une API, nous pouvons éliminer les bogues et erreurs en nous assurant que notre type de données est correct. Pour cette raison, vous avez peut-être entendu parler d' outils tels que TypeScript, qui nous oblige à déclarer le type de données que vous souhaitez utiliser à l'avance, ce qui peut donc éliminer toute erreur dans notre code. C'est ainsi que les choses fonctionnent avec l'opérateur plus, mais les autres opérateurs peuvent également nous donner résultats attendus après l'application de la coercition. Nous pouvons également voir cette coercition en action avec l' opérateur supérieur ou inférieur. Voyez que cela modifiera la connexion de la console avec la valeur ou les résultats du numéro un sont supérieurs au numéro deux. Voyons ce qui se passe. Nous obtenons la valeur de vrai. Cela peut sembler un peu étrange car ici, dans le journal de la console, nous comparons toujours une chaîne avec un nombre. Mais dans ce cas, JavaScript les compare comme s'il s' agissait de chiffres. C'est un comportement fou pour les personnes habituées à d'autres langages de programmation, qui est fortement tapé. Cela signifie que les données sont limitées à un certain type et ne sont pas converties. Bien que cette coercition se produise en coulisses, les exemples que nous verrons ont parfois un comportement assez sensé ou prévisible. Mais souvent, nous constatons des résultats étranges comme celui-ci. Nous pouvons également constater des résultats étranges lorsqu'il s'agit d' incrémenter également. Voyez ceci, au lieu d'avoir une constante pour notre chaîne, ce que nous allons faire, c'est changer cela pour être laissé. Par conséquent, nous pouvons mettre à jour cette valeur numéro un. Faisons cela juste en dessous. Nous accéderons à notre variable numéro un, puis utiliserons plus plus pour l'incrémenter de la valeur 1. Console consigne la valeur de notre variable et voyons ce qui se passe à l'intérieur de la console. Rafraîchissez et nous voyons la valeur de huit. Cela peut sembler étrange car nous savons que numéro un est initialement défini comme une chaîne. Techniquement, nous ne devrions pas être en mesure augmenter cela de la valeur d'un, comme nous le ferions avec un chiffre. Ce qui se passe dans les coulisses avec la coercition c'est que le numéro un est converti en nombre, donc nous pouvons utiliser l'incrémenteur. Je pense que vous verriez la valeur de huit dans la console. À titre d'autre exemple, imaginez qu'il s' agit également d'un tableau. Si nous encerclons cela à l'intérieur des crochets contenant notre ficelle à l'intérieur, que pensez-vous qu'il se passerait maintenant dans la console ? Nous continuons d'augmenter cette valeur. Disons cela et voyons ce qui se passe à l'intérieur d'ici. Actualisez. Encore une fois, cela n'a aucun sens. Nous avons toujours la valeur de huit, mais c'est le monde du JavaScript. Et si nous commentions ce plus, plus et que nous ajoutions directement une valeur à ce tableau. Disons que plus 2, enregistrez, rafraîchissez, et nous voyons la valeur de 72. Encore une fois, cela peut sembler un comportement fou, mais ce qui s'est passé en coulisses, comme vous l' avez peut-être deviné, c'est que cela a été converti en chaîne. Si vous vouliez prouver qu'il s' agissait d'une chaîne, ou si nous voulions vérifier deux fois, nous pourrions également utiliser typeof à l'intérieur du journal de la console. Je vais taper le jus avant notre numéro un, sauvegarder ceci et cela produira ensuite le type de données qui est une chaîne. Il y a aussi quelque chose d'étrange. C'est une chaîne comme nous venons de le voir, mais que pensez-vous qu'il se passerait si nous réintroduisons les incréments ? Eh bien, décommentons cela, sauvegardons et actualisons, et nous revenons maintenant à un chiffre. Et si nous supprimons également le typeof et que nous pouvons voir ce qui se passe lorsque nous additionnons les sept et les deux, puis que nous utilisons également l'incrément. Sauvons ça. Cela nous donne maintenant le résultat de la valeur numérique de 73. Ce qui signifie que ce qui se passe l'origine pour le numéro un est notre 7 et 2 sont ajoutés ensemble pour créer une chaîne de 72, comme nous l'avons vu plus tôt. s'agit toujours d'une chaîne, mais lorsqu' elle passe à la ligne suivante, comme nous l'avons vu plus tôt lorsque nous utilisons le plus, elle ajoute ensuite la valeur de 1, ce qui nous donne la valeur de 73 à l'intérieur de la console. En plus de cette folie, l'opérateur de l'égalité introduit également un tout nouveau monde de choses à surveiller. Par exemple, dans notre journal de console, nous pouvons vérifier si 1 est égal à vrai. C'est vrai. Mais qu'en est-il si nous convertissons ce un nombre différent tel que 11 ? Cela nous donne maintenant la valeur de faux. Pour résumer, la valeur d'un était égale à vrai, mais la valeur de 11 était égale à false. Essayons un numéro de plus tel que deux, rafraîchir et c'est aussi la valeur de false. Mais c'est une autre bizarrerie de JavaScript, mais juste avant de nous expliquer, je veux juste ajouter quelques commentaires en bas. Donc vrai est le numéro 1 et 0 est égal à faux. Pour mieux comprendre cela, nous devons comprendre que lorsque vous utilisez le double égal, comme ceci, il s'agit de l'égalité lâche, ce qui signifie que nous ne recherchons aucun type de données, peu probable, triple égal, ce que nous avons déjà vu auparavant. Tout ce que nous faisons, c'est vérifier si deux valeurs sont égales quel que soit le type de données. Puisque nous comparons un nombre ici avec un booléen à droite, nous ne le vérifions pas avec des types égaux. JavaScript se convertira en utilisant la coercition et, dans ce cas, il convertit le booléen en nombre. Comme nous l'avons écrit précédemment, le chiffre un est égal à vrai et JavaScript utilisera le nombre zéro pour être égal à faux. Nous pouvons le tester dans le journal de la console. Nous pouvons vérifier si la valeur d'un est égale à false, ce qui n'est pas vrai. Il devrait nous donner une valeur fausse à l'intérieur de la console. Cependant, si nous le modifions pour qu'il s'agisse de zéro, zéro est égal à faux, comme nous l'avons vu ci-dessous et cela devrait alors avoir pour résultat vrai. C'est beaucoup de bizarrerie à prendre en compte et ça ne s' arrête pas là non plus. JavaScript a tellement de choses que vous devez surveiller. Je ne m'attends pas à ce que vous vous souviez tous d' eux à ce stade. Mais sachant que ce comportement existe et vous donne un bon départ sachant où chercher si vous rencontrez des bogues à l'intérieur de votre code. 12. Truthy & Falsey: Dans de nombreux exemples de cette section et du codage JavaScript en général, nous vérifions si une valeur est vraie ou fausse. Si c'est vrai, nous exécutons du code, et s'il est faux, nous faisons autre chose. Mais il ne s'agit pas seulement d'une valeur booléenne de vrai et de faux, que nous pouvons utiliser, comme nous l'avons vu dans la dernière vidéo, d'autres valeurs peuvent également être jugées vraies et fausses. Par exemple, zéro s'évalue en faux, et le nombre veut être égal à vrai. Il existe également de nombreux autres exemples, tels qu'une chaîne de texte est vraie, et une chaîne vide est à l'opposé de false. C'est ce qu'on appelle la vérité ou le faux. La vérité est quand une valeur est évaluée comme vraie, telle que notre chaîne de textes présente, et fausse lorsqu'une valeur est évaluée à false, telle que notre chaîne vide ou notre nombre zéro. Allez dans notre éditeur, et nous pouvons jeter un coup d'œil à quelques exemples à l'intérieur de notre script vide. Les instructions If s'exécuteront non seulement pour une valeur booléenne de true, mais également pour toute autre valeur véridique. Disons cela en configurant d' abord une instruction if-else vide puis à l'intérieur d'ici, nous allons simplement y placer des journaux de console trop simples. Pour la première section, nous allons évaluer quelque chose pour être vrai, nous transmettrons le texte du vrai V. Dans la section L, nous ferons le contraire. Ajout du texte de Falsey. Bien sûr, cela ne fonctionnera pas pour le moment car nous n' avons aucune condition à l'intérieur de l'instruction if. Mais nous allons commencer par ce que nous savons déjà. Auparavant, nous avons examiné les valeurs de zéro et de 1, où la valeur de zéro est égale à false. Cela serait considéré comme fausse, mais le contraire est vrai avec la valeur d'un. De plus, nous pouvons tester la chaîne que vous avez mentionnée juste avant. Nous avons une chaîne avec du contenu à l'intérieur, comme le texte de hey. Cela permettra également d'évaluer la vérité puisque nous avons une certaine valeur à l'intérieur de la chaîne. Mais si nous devions supprimer cela et avoir une chaîne vide, cela évaluerait en JavaScript la valeur de Falsey. La coercition dont nous avons parlé se produit en coulisses, et des valeurs telles que nos nombres zéro et un ainsi cette valeur de chaîne sont converties pour avoir un équivalent booléen. Nous pouvons déterminer si des choses de ce genre si les instructions ne doivent pas être exécutées. Les valeurs faussement, comme on peut s'y attendre, sont généralement des valeurs vides telles que zéro, sont généralement des valeurs vides telles que zéro, que nous venons de regarder, ainsi que ces chaînes vides. Jetons un coup d'œil à d'autres exemples tels que non. C'est également fausse. Non défini, cela devrait également être fausse. Généralement, tout ce qui n'a pas de valeur actuelle, donc le mot faux. Comme on peut s'y attendre, cela serait également fausse. Enfin, notez le numéro, qui est NaN. C'est également fausse. Nous pouvons considérer à peu près tout le reste comme vrai, comme les chaînes que nous venons de regarder, les tableaux, nombres autres que zéro et, en fait, tout type d'objet tel qu'une fonction, tableau ou un l'objet réel sera véridique. Cela est également vrai que nous utilisions le constructeur ou un type littéral, comme ceci. Nous pourrions utiliser le constructeur. Nous avons examiné des choses comme un nouveau tableau et un nouvel objet dans le passé. Ce sera vrai. Essayons un constructeur de fonctions qui sera aussi vrai, et enfin l'objet. De la même manière si nous voulons utiliser un constructeur comme celui-ci et que nous l'utilisons littéralement comme nous l'avons fait plus couramment dans ces vidéos, comme la création d'un tableau avec des valeurs différentes à l'intérieur. Cela serait vrai, tout comme le constructeur, tout en plaçant un objet dans une police littérale. Cette coercition, combinée à la compréhension de la façon dont les valeurs sont converties pour être véridiques ou fausses, est une bonne chose à comprendre à l'intérieur de JavaScript, car elle peut vraiment vous aider à éviter les problèmes. l'avenir et aide également à résoudre les problèmes de débogage. 13. Chaîne facultative: Cette vidéo va se concentrer sur ce qu'on appelle le chaînage optionnel, introduit en JavaScript dans ES2020. Comme nous le savons déjà, nous devons avoir accès à certains éléments à l'intérieur d'un objet, tels que notre nom et aussi notre rôle d'administrateur. Comme nous le savons également, nous pouvons aller encore plus loin en accédant à des objets imbriqués à l'intérieur d'un objet. Que se passe-t-il lorsque les propriétés à l'intérieur de cette chaîne ne sont pas présentes ? Examinez quelques exemples de chaînage dans la section Événements, où nous accédons à l'objet événement. Nous avons ensuite approfondi les propriétés telles que la cible, le nœud parent, les enfants, puis dans la valeur du texte interne. Si, à un moment quelconque de cette chaîne, une propriété n'existe pas, nous obtiendrons une erreur. Ce n'est pas une mauvaise chose, car nous devrions avoir des erreurs si nous faisons quelque chose de mal. Mais qu'en est-il si la propriété n'est que parfois là et parfois pas ? Un exemple de cela est ce que nous avons déjà utilisé dans le script. Il aura l'utilisateur actuel défini sur un objet utilisateur connecté et nous disposerons toutes les informations dont nous avons besoin, telles que le nom et le rôle. Par conséquent, lorsque nous passons aux instructions if et vérifions si le rôle de l'utilisateur est égal à administrateur. Nous savons que cela devrait fonctionner sans erreur, mais avec les utilisateurs, bien que nous ne les ayons pas toujours pour être connectés. L'utilisateur actuel n'est pas toujours configuré pour être un objet comme celui-ci. Par exemple, si l' utilisateur n'est pas connecté, à la place de cet objet utilisateur nous pouvons voir la valeur null. Maintenant, si nous essayons d'exécuter l'instruction if, nous n'avons pas accès à cette propriété .role. Par conséquent, allons dans la console et voyons ce qui se passe. À l'intérieur de la console, nous voyons ce message d'erreur rouge qui nous indique qu'il y a un problème lors de la lecture de notre rôle. Cela se produit parce que l'utilisateur actuel n'est plus un objet contenant la propriété role, ce qui provoque une erreur. Mais nous avons toujours besoin d'un moyen de maintenir ce rôle actif dans l'énoncé if. Mais une fois que l'utilisateur s'est connecté. C'est ici que le chaînage optionnel entre en jeu. Ce que nous pouvons faire, c'est que nous pouvons insérer un point d'interrogation pour déclarer que la propriété n'est peut-être pas toujours présente. Nous ajoutons cela juste avant .role. Maintenant, si nous sauvegardons cela et actualisons au lieu de l' erreur dans la console, puisqu'elle est maintenant évaluée à false, la section else s'exécutera désormais à l'intérieur de la console. Ce qui se passe ici c'est que nous arrivons aux déclarations if. JavaScript lira ensuite l'utilisateur actuel, qui est la valeur null. Il sait donc ne pas aller plus loin avec le reste de notre chaîne. Il ignore maintenant l' erreur et renvoie plutôt une valeur indéfinie, que nous pouvons vérifier dans le journal de la console. Actuellement, nous savons que la section autre est en cours d'exécution car nous avons vu la valeur de false. Mais ce que nous pouvons faire, c'est que nous pouvons accéder à l'utilisateur actuel, un point d'interrogation car cela ne sera pas toujours présent lors du chaînage optionnel. Ensuite, nous pourrons ajouter la valeur du rôle. Si nous sauvegardons cela et que nous actualisons, nous pouvons maintenant confirmer que nous récupérons la valeur indéfinie. Cela est vraiment utile si nous savons à l'avance une certaine propriété d'objet peut être présente ou non toujours. Il est courant que des objets comme celui-ci se développent au fil du temps et nous ne savons pas toujours comment notre application pourrait se développer à l'avenir. Il se peut que nous ayons besoin d'ajouter des fonctionnalités supplémentaires ou de collecter plus d'informations. Ce chaînage optionnel permet d'éviter toute erreur. Par exemple, à l' avenir, nous devrons peut-être ajouter plus d'informations sur la source d'inscription de l' utilisateur. Nous pourrions ajouter un objet imbriqué à l'intérieur, comme ceci, nous reviendrons à l'objet utilisateur. Reprenons le nom et le rôle. Ensuite, un deuxième objet imbriqué à l'intérieur duquel je vais appeler les données d'inscription, il s'agira d'un objet imbriqué à l'intérieur. Nous allons le placer dans la date. Mais maintenant, une chaîne vide va bien. Cela n'a pas vraiment d'importance et confirme qu'il est égal à vrai. loin encore mesure que notre application s'est développée encore plus, nous devrons peut-être approfondir cet objet. Par exemple, nous pouvons recueillir des informations supplémentaires sur la source d'inscription de l'utilisateur à l'intérieur de cet objet. Nous pouvons également ajouter la source, qui est également un objet dans lequel nous avons vu l'URL de la source d'inscription. Encore une fois, ce n'est qu' un exemple pour que nous puissions ajouter n'importe quoi à l'intérieur de la chaîne sur le navigateur d' où vient l'utilisateur. Nous avons maintenant besoin de chaînes plus longues pour accéder à ces informations imbriquées. Si nous supprimons simplement ces instructions if else, et nous simplifierons cela avec un journal de console. Nous devons d'abord accéder aux objets utilisateur, qui était l'utilisateur actuel. L'objet à l'intérieur duquel était les données d'inscription, donc .signupdata, Par exemple, si nous voulions accéder au navigateur, nous aurions également besoin de sauter dans la source juste avant cela. L'objet source, puis le navigateur, actualisez et cela devrait maintenant être la valeur de Chrome. Mais rappelez-vous dans cet exemple tout cela a été ajouté à l' objet à un stade ultérieur. Certains utilisateurs d' inscription antérieurs ne verront pas les données d'inscription associées à leurs objets. Ce que nous pouvons faire, nous pouvons simuler cela en commentant cette section, ce qui provoquera une erreur, comme nous l'avons déjà vu auparavant. Encore une fois, le chaînage optionnel peut nous aider à résoudre ce problème en permettant à notre code d'échouer silencieusement plutôt que afficher une erreur à l'intérieur de la console. À l'intérieur de l'inscription, les données n' auraient plus accès à la source ou au navigateur. Nous pouvons ajouter le chaînage optionnel à l'intérieur ici, actualiser et maintenant nous voyons les résultats de non définis. Les erreurs globales sont bonnes pour nous informer lorsque nous avons fait quelque chose de mal. Mais dans des cas comme celui-ci, nous savons que nous avons une propriété qui peut être présente ou non, chaînage optionnel peut vraiment nous aider en échouant silencieusement et, par conséquent, nous permettant de gérer le erreurs nous-mêmes. 14. Création et modification de nouveaux objets: peu près tout ce que nous pouvons penser a certaines propriétés peut être un bon cas d'utilisation pour un objet en JavaScript. Par exemple, une personne peut être un objet et les propriétés peuvent être le nom, âge, la taille et toute autre information que nous voulons donner à une personne. Un ordinateur peut également être un objet possédant des propriétés telles que la marque, le modèle, le processeur, l'année de fabrication et la mémoire. Lorsque nous pensons à des objets comme celui-ci, les cas d'utilisation deviennent énormes. Comme pour les tableaux, il existe différentes façons construire un objet, et le style que nous avons examiné jusqu'à présent s'appelle littéral objet. Ceci est utilisé pour créer et définir un nouvel objet avec les accolades, qui inclut certaines propriétés, comme nous l'avons fait ici. les fichiers de démarrage. Passez dans le fichier de cette leçon, qui est le constructeur d'objets, et ouvrez-le dans le navigateur. Comme mentionné précédemment avec les diapositives, nous avons deux façons différentes de créer un objet. Nous avons l'approche littérale, comme nous l'avons utilisée précédemment, et nous avons également une approche appelée constructeur. Le constructeur n'est rien de nouveau. Nous l'avons déjà examiné avec des tableaux. En règle générale, nous avons créé des tableaux en utilisant une approche littérale, telle qu'un tableau de pizzas, et configuré nos propriétés à l'intérieur de ces crochets. En plus de cette approche littérale, nous pouvons également créer un tableau à l'aide du constructeur. Par exemple, si nous voulions un tableau d'ingrédients, nous pouvons le configurer à l'aide du nouveau mot-clé suivi d'un tableau. Il s'agit d'une approche littérale et c'est ainsi que nous pouvons créer un tableau vide avec le constructeur. Nous pouvons ensuite accéder à notre tableau vide et ajouter de nouvelles valeurs à l'aide méthodes telles que push pour ajouter une nouvelle valeur à ce tableau. De la même manière que nos tableaux ici, nous pouvons également faire de même pour d'autres objets. Ce que je vais faire, c'est commenter cette approche littérale et recréer à l'aide du constructeur d'objet. Tout d'abord, nous allons créer une nouvelle variable appelée user pour imiter les objets ci-dessus et la définir comme égale à un nouvel objet. Ce nouvel objet va être un wrapper d' objet vide, puis nous pourrons ensuite pousser nouvelles propriétés vers cet objet. Pour ce faire, nous accédons à notre variable. Ensuite, nous pouvons définir le nom de la propriété directement sur notre objet. Tout d'abord, ce sera la clé, comme nous l'avons fait ici. Ensuite, nous attribuons cela à une certaine valeur. Cela équivaut à une chaîne de Chris. Ensuite, le second concerne le nom de famille, également une chaîne. Le troisième était l'occupation. Ensuite, nous avons le booléen connecté de true pour user.logged.in. Il s'agit d'un booléen, donc nous n'avons pas besoin des devis. Enfin, nous pouvons également attribuer un tableau à la propriété de tous les aliments. Je vais juste copier ce tableau d'en haut. Nous pouvons tester que cela fonctionne maintenant en effectuant un journal de console pour la valeur de l'utilisateur, puis en naviguant dans les outils de développement dans la console. Il y a notre objet avec toutes nos propriétés imbriquées à l'intérieur. Nous pouvons également accéder à des propriétés individuelles à l'aide d'une notation par points. Cela fonctionne exactement comme nous l'avons fait avec l'approche littérale. Nous pouvons utiliser user.first. Cela affichera notre prénom à l'intérieur de la console. En plus de cette notation par points, comme nous l'avons déjà utilisée, nous pouvons également accéder à nos propriétés avec la notation entre crochets. Ce que nous devons faire, c'est d' entourer le nom de notre propriété ces crochets, de supprimer le point. Il doit également s'agir d'une chaîne. Les deux donnent exactement le même résultat. Si nous le voulions, nous pourrions également mettre à jour directement l'une de nos propriétés , donc user.first. Nous pouvons ensuite le réaffecter ou le mettre à jour pour qu'il s'agisse d'une nouvelle valeur. Ensuite, nous pouvons l'imprimer sur la console. Cela nous donnera notre valeur actualisée. En guise de note, si nous avons accidentellement plus d'une propriété en double, comme ici où nous avons le prénom deux fois dans notre code, depuis ES 2015, le dernier utilisé plutôt que de lancer une erreur. De plus, nous pouvons également supprimer n'importe laquelle de ces propriétés à l'aide de l'opérateur de suppression JavaScript. Ce que nous devons faire, c'est ajouter la suppression, qui pointe notre prénom, l'enregistrer et l'actualiser, et nous allons simplement imprimer l'objet utilisateur complet. Ouvrez-le, et cela supprimera maintenant le prénom de notre objet d'utilisation. Il s'agit de deux façons différentes de créer un objet en JavaScript. Personnellement, je préfère l'approche littérale que nous avions au sommet car elle me semble plus propre et simple à utiliser. Mais cela dépend entièrement de vos préférences personnelles. Dans les prochaines vidéos, nous expliquerons comment configurer une fonction semblable à un modèle pour créer plusieurs objets. 15. Fonction constructeur d'objet: Super. Nous sommes maintenant conscients de deux manières différentes de créer des objets à l'intérieur de JavaScript. Si vous sautez dans le fichier de cette leçon, qui est des fonctions de constructeur d'objets, nous voyons que nous avons juste un script vide à l'intérieur d'ici. Les deux manières différentes que nous avons créées sont de créer une nouvelle variable comme celle-ci, puis nous pouvons ajouter nos propriétés directement à l'intérieur des accolades. Sinon, nous pouvons également utiliser un nouvel objet, qui est l' approche constructeur, ce qui nous donnera également un objet vide dans nos propriétés. Ces deux approches fonctionnent bien, mais elles se limitent également à créer un seul objet. Il serait plus utile de disposer un modèle d'objet afin de pouvoir créer plusieurs objets basés sur cette base, chacun présentant les mêmes propriétés et méthodes. Nous pouvons également le faire avec la fonction constructeur. Ce que nous allons faire, c'est que nous supprimerons cela et créerons une nouvelle fonction constructeur. Il est également recommandé de nommer ces fonctions de constructeur avec une majuscule. Nous utilisons dans notre exemple utilisateur, il s'agit d'un U majuscule, puis créons le reste de notre fonction. Le but de cette fonction constructeur pour notre utilisateur est de créer plusieurs utilisateurs à partir de ce modèle. Au sein de notre fonction, nous allons également transmettre certaines valeurs dont nous aurons besoin à l'intérieur d'ici. Le premier, nous allons garder cela assez simple, nous disons simplement le prénom, le nom de famille et l'occupation. Nous reviendrons à cette fonction dans un instant. Mais avant de créer un nouvel objet, comme celui-ci, nous avons utilisé le nouveau mot-clé, puis la fonction objet. Mais maintenant, au lieu de créer un nouvel objet vide, nous voulons créer une nouvelle instance de notre utilisateur. Plutôt que d'un nouvel objet, nous parlerons de nouveau User Capital U, où nous allons transmettre les valeurs réelles que vous souhaitez utiliser pour notre fonction. Nous devons transmettre le prénom, le dernier et l'occupation, et ce seront les trois valeurs dont nous avons besoin pour notre utilisateur. Nous dirons Chris, le nom de famille, et enfin l'occupation. Nous pouvons également dupliquer cela autant de fois que je le souhaite, car comme nous l'avons mentionné, l'objectif de la création de cette fonction constructeur est d'agir comme modèle pour créer autant d'objets que nous le voulons. Nous créons notre deuxième, nous avons un nom différent, et également huit professions différentes. Avec ces deux nouveaux utilisateurs, nous pouvons également stocker cela à l'intérieur de constantes ou variables afin d'y accéder ultérieurement. Donc, dites const chris égal à notre, et le second est égal à Homère. Super. Ce que nous allons maintenant faire est consigner la valeur de l' un de ces nouveaux utilisateurs. Placer un journal de console, la valeur de Homer, puis sauter dans la console. Comme vous pouvez le constater, nous avons un objet utilisateur. Mais si nous ouvrons cela , nous n'avons pas de propriétés à l'intérieur d'ici. Tout ce que nous avons, c'est un objet utilisateur vide. Cela peut être attendu car notre fonction constructeur que nous avons créée précédemment est vide. Nous n'avons pas de code à l'intérieur des accolades. Nous recevons les valeurs à l'intérieur de la fonction , mais nous ne faisons rien avec celles-ci pour l'instant. Pour ce faire, nous devons définir quelque chose qui soit égal à ces trois valeurs. Nous devons définir quelque chose pour être égal à notre premier, certaines choses égales à notre dernière, et quelque chose qui soit égal à notre occupation. Mais que faisons-nous pour les transformer en propriétés de nos objets ? Eh bien, pour définir une propriété, nous devons utiliser ce mot-clé. Pour mieux comprendre ce mot clé, je veux vous ramener rapidement à un fichier antérieur dans ce dossier de projet. Si nous revenons au numéro trois, qui est des fonctions, puis au numéro cinq, qui est une fonction ou une méthode, sautez dans cette page d'index juste ici. À l'intérieur d'ici, vous vous souvenez peut-être que nous avons créé un objet appelé « check recipes ». Les recettes de contrôle avaient certaines propriétés telles que le nombre actuel de recettes, le maximum de recettes, ainsi qu'une méthode appelée recettes restantes, qui a déduit le nombre actuel de recettes de le maximum. N'oubliez pas qu'une méthode n'est qu'une fonction située sur cet objet. Dans cette méthode, nous avons utilisé ce mot-clé pour accéder à d'autres propriétés de cet objet. Nous accédons aux recettes maximales, qui se trouvent sur cet objet et aussi aux recettes actuelles. Ce mot-clé peut être une chose complexe à comprendre en JavaScript, mais dans ces circonstances, il pointera simplement vers l' objet qui appartient ici. Cela signifie que nous pouvons accéder à n'importe quelle autre propriété de cet objet. Dans cette optique, revenons à notre fichier actuel, nous pouvons maintenant ajouter toutes les propriétés exactement de la même manière en utilisant le mot clé, suivi du nom de la propriété. Pour le premier dira ceci .FirstName et aussi la même chose pour les autres aussi, ce .LastName, et enfin, ce .occupation. Cela va maintenant construire nos deux objets utilisateur avec les propriétés que nous passons à l'intérieur. Enregistrez ceci et lorsque notre journal de console est toujours en place, actualisez-le. Notre utilisateur Homer est maintenant construit correctement et nous pouvons également le dupliquer pour notre premier utilisateur. Cela nous donne maintenant deux objets uniques , tous deux basés sur le même modèle. Si nous devons ajouter des propriétés et des méthodes supplémentaires, nous avons également quelques options. Nous pouvons les ajouter directement à l' un de nos objets comme celui-ci. Tout comme nous l'avons regardé sur la vidéo précédente, nous pouvons accéder à notre variable comme Homer. Nous pouvons dire des vies et définir cela à la hauteur de notre valeur. Nous pouvons également ajouter des méthodes à nos objets. Nous pouvons accéder à notre objet, qui est homer, puis nous pouvons lui donner un nom de propriété qui sera nom complet et le définir comme égal à une fonction. La responsabilité de cette fonction va être de renvoyer une nouvelle chaîne, qui est le premier nom ajouté au deuxième nom, alors retournez notre chaîne, qui est Homer.FirstName, ajoutez un vide de l'espace entre les deux , puis ajoutez-le à la fin Homer.LastName. Essayons ça. Tout d'abord, nous allons essayer la propriété Lives. Ajoutez-le à la console, rafraîchissez-le et nous obtenons la valeur de Springfield. Ensuite, nous pourrons essayer notre méthode qui était le nom complet. Rafraîchissez le navigateur. Whoops, nous avons une valeur indéfinie, alors jetons un coup d'œil à ça. Nous avons Homer.Prénom, c'est très bien. Juste une erreur d'orthographe en haut de l'air , alors nous allons changer cela. Maintenant, nous voyons que c'est Homer Simpson , donc cela fonctionne parfaitement. Mais ils ne sont ajoutés qu' à nos objets uniques. Ceux-ci ne sont ajoutés que la grande variable Homère. Si nous avons essayé d'accéder à notre variable Chris et de l'essayer dans la console, nous voyons une erreur à l'intérieur d'ici. Cette approche n'est utile que si vous souhaitez modifier un objet spécifique. Si nous voulons les appliquer à tous les objets créés, nous devons les placer sur la fonction constructeur située en haut. Donc, tout d'abord, nous devons transmettre la propriété des vies à notre fonction, puis nous pouvons les ajouter à nos deux objets ci-dessous. Chris, valeur du Royaume-Uni et Homer, la valeur de Springfield. Nous devons également modifier notre corps fonctionnel. Nous allons dupliquer cela et nous dirons ceci. Les vies sont égales à la valeur des vies que vous transmettez. Nous devons également passer la méthode. La méthode sera toujours la même, elle utilise simplement le prénom et le nom de famille existants . Je vais simplement couper et coller ça dans notre fonction. Coupez ceci, collez-le dans notre fonction. Cette fois, nous allons supprimer Homer, remplacer Homer par le mot clé. Il en va de même à l'intérieur de notre corps fonctionnel. N'oubliez pas que, comme dans l'exemple précédent de la vidéo précédente, ce mot-clé pointera vers n'importe quelle autre propriété de cette fonction utilisateur. Enfin, nous pouvons également supprimer homer.lives. Nous n'avons plus besoin de cela, donc maintenant nous pouvons enregistrer et le rafraîchir. Maintenant, la méthode du nom complet fonctionne pour nos deux objets. 16. Prototypes d'objets: Si vous n'avez pas bien compris le rôle du prototype dans les premières vidéos, j'espère que maintenant le voir en action avec nos propres objets peut aider à faire cliquer certaines choses. Dans le projet de démarrage, nous commençons par la section prototype d'objet avec le même exemple que celui de la vidéo précédente. Nous avons une fonction constructeur pour créer des modèles ou des Blueprints. Cela signifie que nous pouvons créer plusieurs objets avec les mêmes propriétés et méthodes disponibles. Nous avons ensuite examiné comment ajouter des propriétés et des méthodes, tant pour un seul objet que la fonction afin qu'elles s'appliquent à tous les nouveaux objets créés. En plus d'ajouter à la fonction constructeur, nous pouvons également ajouter directement au prototype. Mais avant de faire cela, rafraîchissons d'abord ce que nous savons sur le prototype. En bas, nous réalisons un journal de console avec la valeur Homer, qui a créé un nouvel objet utilisateur à partir de notre constructeur. Si nous ouvrons cela dans le navigateur et sautons dans les outils de développement dans la console, et regardons ce que nous voyons à l'intérieur d'ici. Rafraîchissez et nous voyons notre utilisateur. Ouvrons ça. Il contient nos propriétés. Nous avons le prénom, le nom de famille et toutes les valeurs que vous voyez en bas. Ensuite, en bas, nous avons ce prototype, qui est un maillon vers la chaîne prototype. Ouvre ça. À l'intérieur, nous pouvons voir notre propre constructeur, qui est notre utilisateur. Parallèlement à cela, un deuxième prototype d'objets. Le premier protocole, qui est celui qui est en haut ici, indique nos propres ajouts de prototypes, que nous allons bientôt examiner. Ensuite, le deuxième que nous venons d'ouvrir, a maintenant beaucoup de choses à l'intérieur d'ici, que nous n'avons pas ajoutées nous-mêmes. Nous avons des choses comme ValueOf, ToString. Ce ne sont pas des choses que nous avons créées nous-mêmes. N'oubliez pas que les objets JavaScript héritent des propriétés et des méthodes des objets parents. Tout en haut de cette chaîne d' héritage se trouve l'objet. Consignons maintenant cela à la console pour référence. Juste avec Homer, je vais faire un deuxième journal de console avec la valeur de l'objet. Maintenant, sauvegardons cela et actualisons le navigateur, nous laissant le type d'objet principal côté de notre propre objet de maison. Cette première valeur d'objet est un objet vide, que vous pouvez voir si vous l'ouvrez. Il est vide en ce qui concerne l' absence de propriétés de valeurs à l'intérieur comme nous l'avons ici. Mais le but de cet objet de premier niveau, même s'il est vide, est de contenir les propriétés et méthodes minimales qui se transmettent à d'autres objets via la chaîne prototype. Nous pouvons le voir si nous ouvrons cela. Il contient toutes ces propriétés et méthodes auxquelles nous pouvons désormais accéder via nos propres objets créés. Si nous ouvrons maintenant notre propre objet de maison, passez au prototype. Ensuite, le deuxième prototype à l'intérieur ici, vous pouvez voir que cela a hérité des mêmes propriétés et méthodes de nos objets de premier niveau. Cela signifie maintenant qu' ils peuvent désormais être utilisés dans nos propres objets personnalisés. Comme nous l'avons vu précédemment, c'est pourquoi des méthodes telles que les tableaux personnalisés sont disponibles, par exemple pour chaque push et pop. Nous n'avons pas réellement créé ces méthodes nous-mêmes. Mais au lieu de cela, ils sont hérités de la chaîne prototype. Tous les rayons peuvent les utiliser. Nous ne devrions pas ajouter nos propres propriétés et méthodes à des objets que nous n'avons pas créés nous-mêmes, mais nous pouvons les ajouter à notre propre constructeur personnalisé, tel que cet utilisateur. Nous pouvons le faire en accédant à la propriété prototype de cet utilisateur. Juste en dessous de ça. Faisons de l'espace. Accédez à notre constructeur d'utilisateurs. Ensuite, le prototype. Nous pouvons définir une nouvelle propriété ici, donc n'importe quelle valeur. Il peut s'agir d'autres types de données tels que des chaînes, des nombres ou même des méthodes. Nous pouvons également retirer le premier objet, laissant notre deuxième objet Homer en place. Rafraîchissez, ouvrez ça, sautez dans le prototype. Maintenant, je vais ouvrir ce prototype d'objet. Nous voyons également la propriété personnalisée, que nous venons de définir. Nous voyons que le cool n'est pas placé sur l'objet d'origine à côté du prénom, par exemple. Mais si nous essayons d'y accéder, cool, alors regardez la chaîne de prototypes. Si ce n'était pas sur notre chaîne prototype, que vous voyez ici, elle examinerait encore plus loin la chaîne d'héritage. Nous pouvons tester cela. Allez dans le journal de la console. Maintenant, Homer.cool. N'oubliez pas que le .cool n'est pas disponible sur notre constructeur d'origine. Il va ensuite regarder vers le bas la chaîne des prototypes, se rafraîchir. Nous obtenons la valeur de vrai. Il en va de même pour les méthodes. Nous pouvons également ajouter différentes méthodes au prototype. Plutôt que d'avoir cette méthode disponible sur notre constructeur, ce que je vais faire est de copier ceci et de commenter cela. Collez cela en dehors de notre utilisateur. Cette fois-ci, plutôt que d'accéder à l'objet via cela, nous allons accéder à notre prototype utilisateur.comme nous l'avons fait auparavant. Cette fois, le nom complet sera égal à notre fonction. Essayons cela dans notre journal de console. Cette fois, le nom était FullName. Avec cette méthode, nous devons également y accéder avec les crochets. Cela devrait maintenant renvoyer notre Prénom, l' ajouter à notre nom de famille. Bien. Si vous voulez également vérifier que c'est sur le prototype à côté de cool. Nous pouvons supprimer FullName. Connectez-vous à la console, la valeur d'Homer. Ouvre ça, saute dans le prototype, et nos deux nouvelles éditions sont à l'intérieur d'ici. Pour commencer, le prototype peut sembler complexe, mais il s'agit simplement d'un moyen d'hériter propriétés et des méthodes d'un objet parent, même d'un parent créé comme notre utilisateur, ou de l'objet de niveau supérieur que JavaScript fournit. Pour résumer, le prototype est une propriété sur un objet. Il sera disponible pour être hérité par d'autres objets. Un exemple de cela était notre nom complet et nos ajouts sympas. Ces deux éléments ont été ajoutés à notre prototype, ce qui signifie qu'ils ont été mis à la disposition d'autres objets en héritage, tels que notre utilisateur Homère en bas. 17. Propriétés d'objets Inheriting: Nous avons parlé un peu jusqu'à présent de la façon dont nous disposons cet objet JavaScript parent principal, qui possède un prototype, et de la façon dont on en créerait de nouveaux, ils héritent automatiquement de certaines choses à travers la chaîne de prototypes. Mais que se passe-t-il si nous voulions également autoriser l'héritage de nos propres objets ? Dans un fichier de démarrage, nous avons un exemple d'utilisateur similaire de la vidéo précédente. Nous avons un objet utilisateur, et nous pouvons commencer à réaliser que cet objet utilisateur présente certaines limites pour notre utilisation particulière. Ici, nous créons de vraies personnes comme moi et juste en dessous d'un personnage fictif. Mais si nous y réfléchissons, gens réels et fictifs peuvent avoir besoin de propriétés différentes. Nous pouvons, par exemple, ajouter le nom de l'émission d'où provient le personnage fictif. Mais cela ne s'appliquerait pas à une personne réelle. Il est désormais difficile d' étendre cet objet beaucoup plus loin. Ce que nous pouvons faire, c'est utiliser cet objet utilisateur comme base, y compris uniquement les propriétés minimales qui s'appliquent à la fois à l'utilisateur réel et à l'utilisateur fictif. Ensuite, nous créons deux autres objets, qui hériteront tous deux de cet utilisateur d'origine. Nous avons toujours accès à toutes les choses comme les noms et les professions. Mais il aura également des propriétés spécifiques dont nous avons besoin pour chaque cas d'utilisation. Pour ce faire, nous avons une méthode objet appelée create. Juste avant d'ajouter cela à notre exemple actuel, examinons comment nous pouvons le faire avec un objet autonome normal. abord, ajoutons n'importe quel objet normal en bas. Supprimez notre journal de console pour l'instant, créez un nouvel objet appelé product1. Ouvrez les bretelles bouclées et nous ajouterons nos propriétés. Le titre, encore une fois, c' est assez générique, donc une chemise bleue incroyable. Également la description. Tout simplement une chemise bleue. En tant qu'objet autonome, un objet générique peut s' appliquer à plusieurs chemises bleues. Le titre ainsi que la description conviendront aux autres chemises bleues. Nous pourrions également modifier certains détails tels que la marque ou la taille d'autres produits. Nous pourrions ensuite utiliser cette méthode object.create que nous avons déjà mentionnée pour créer un deuxième produit basé sur cela, installer à l'intérieur d'une variable appelée product2 et le définir comme égal à object.create. À l'intérieur de object.create, nous transmettons notre produit1, ce qui signifie qu'il créera un nouveau produit appelé product2 basé sur notre produit original1. Consignons cela sur cette console, product2, et voyons ce qui se passe à l'intérieur d'ici. Rafraîchir Il suffit de mettre à jour ce lien dans le navigateur. Au départ, nous voyons un objet vide. Nous n'avons pas de propriétés ou méthodes associées à cela. Mais si nous allons de l'avant et ouvrons le prototype qui est joint, nous avons accès à notre titre ainsi qu'à notre description héritée de notre produit1. C'est ainsi que fonctionne la méthode create. Il crée un nouvel objet et utilise l'objet existant que nous transmettons en tant que prototype. Encore une fois, remarquez que nous avons également un deuxième prototype. Nous avons d'abord la nôtre, qui est la description, puis le titre. Plus loin dans la chaîne, nous avons toutes les propriétés et méthodes que nous avons vues précédemment, héritées du haut de la chaîne de l'objet. Comme nous l'avons déjà appris, même si notre propre objet est vide, nous pouvons toujours accéder à ces propriétés héritées de product1 par leur nom. product2, rappelez-vous que c'est complètement vide comme nous venons de le voir dans la console. Nous pouvons accéder aux valeurs héritées telles que title. Nous pouvons également ajouter nos propres propriétés et méthodes, comme vous vous y attendez. Juste en dessous de notre produit2, nous pouvons y accéder par le nom, puis définir nouvelles propriétés telles que la taille, par exemple petite. Connectez-vous à la console, qui met ensuite à jour notre objet. Nous pouvons maintenant supprimer tout cet exemple et utiliser ces connaissances que nous venons d'apprendre. Nous pouvons maintenant essayer d'appliquer le même exemple à notre utilisateur. Mais la principale différence ici est que nous avons une fonction constructeur plutôt qu'un objet réel. Si nous devions faire la même chose qu'auparavant, créons une variable appelée copy, qui est définie sur object.create. Ensuite, si nous essayons de faire une copie de notre utilisateur, voyons ce qui se passe à l'intérieur de la console. Enregistrez et rafraîchissez. La copie est une copie de la fonction, qui n'est pas ce que nous voulons. Ce que nous recherchons, c'est un moyen de créer des fonctions plus constructives qui héritent toutes des propriétés de cet utilisateur. Commençons par le personnage. Juste en dessous de notre utilisateur, créez notre nouveau constructeur d'objets appelé personnage. N'oubliez pas que le but de cette fonction est d'hériter de toutes les propriétés de base de nos objets utilisateur. Nous allons également ajouter des propriétés supplémentaires qui ne s'appliquent qu'à notre personnage. Cette information supplémentaire que nous allons transmettre est celle d'où provient le personnage. Ensuite, comme ci-dessus, nous accéderons à ce .show, définissant cette valeur égale à la valeur transmise à ce constructeur. Maintenant, ce que nous faisons est de créer un nouvel objet personnage avec la propriété show et d' hériter également de toutes ces propriétés. Mais cela, nous devons entrer dans notre personnage et accéder d'abord à notre fonction constructeur utilisateur, laquelle nous pouvons ensuite accéder à une fonction d'appel. Cette méthode d'appel est disponible sur le prototype d'une fonction et permet une fonction appartenant à un objet appelé à l'intérieur d'un autre objet. Cela signifie que nous pouvons maintenant appeler une fonction utilisateur depuis notre fonction de personnage. Cette méthode d'appel n'est pas exclusive à ce cas d'utilisation. Il peut être utilisé chaque fois que je souhaite accéder à une fonction ou à une méthode située sur un autre objet. Cette fonction utilisateur prend également en charge ces quatre paramètres. Nous pouvons les copier et les ajouter à notre personnage. Maintenant, rappelez-vous que Homer est un personnage, donc plutôt que de fonder cela sur le nouvel utilisateur, nous allons baser cela sur le nouveau personnage. Comme quatrième argument que je vais montrer, juste après Springfield, nous pouvons transmettre notre dernière valeur, à savoir les Simpson. Ces cinq valeurs correspondent désormais aux cinq valeurs de caractères transmises à notre constructeur. Essayons ça. Nous pouvons supprimer notre copie d'avant, et nous consignerons la valeur d'Homère. Cela montre maintenant qu'Homère est un objet personnage. Il possède la propriété show avec la valeur des Simpson. Nous savons que homer.show devrait maintenant fonctionner aussi. Mais qu'en est-il des autres propriétés héritées ? Nous pouvions voir avant l'objet Homère qu'il n'avait accès à la propriété show qu'au niveau supérieur. Nous n'avions rien d'autre tel que le FirstName et LastName, l'occupation ou les vies. Essayons ça et voyons ce qui se passe. Tout d'abord, essayez l'occupation. Rafraîchissez et nous récupérons la valeur indéfinie. Essayons encore une fois. homer.lives et cela est également indéfini. Les propriétés héritées ne semblent pas fonctionner ici. Cela est dû au fait que nous manquons certains détails lorsque appelons notre fonction utilisateur à l'intérieur de notre personnage. Tout d'abord, nous devons copier tous ces paramètres transmis et ajouter cela à notre méthode d'appel. Mais en plus de cela, nous devons également transmettre ce mot-clé. Nous avons mentionné précédemment que ce mot clé peut être une chose complexe à comprendre. Nous en aurons plus à ce sujet plus tard. Mais cela signifie essentiellement que lorsque nous exécutons notre fonction, nous pouvons accéder aux valeurs à l'aide de cette fonction. Tout comme nous étions au-dessus. faisant défiler vers le bas, nous essayons toujours de consigner Homer.lives. Rafraîchissons cela et nous avons maintenant la valeur de Springfield. Nous pouvons en essayer un autre, le FirstName. Tout cela fonctionne correctement. Comme récapitulatif, car cela peut être assez déroutant, nous créons un nouvel objet Homère basé sur notre personnage. Cette fonction de constructeur de caractères ne possède qu'une seule propriété, savoir l'affichage auquel appartient le personnage. Mais il hérite également de toutes les propriétés et méthodes de nos objets utilisateur, que nous transmettons ici. En fait, nous n'avons pas non plus besoin d' ajouter ces émissions car elles appartiennent à cette fonction particulière. Avec toute cette complexité, si nous voulons vérifier quel de nos constructeurs a créé un objet particulier, comme Homère, nous pouvons utiliser quelque chose appelé instanceof. Nous pouvons vérifier cela dans le journal de la console. Nous pouvons vérifier si l'objet Homer est une instance de personnage. devrait être la valeur de vrai puisque nous sommes la base de notre nouveau personnage. Mais si nous devions transmettre notre utilisateur, celui-ci sera faux. C'est ainsi que JavaScript fait les choses. Il possède dès le début des objets dont nous pouvons en hériter. En tant que nouveau venu, nous ne savons même pas que cela se passe en coulisses. Mais si nous devions creuser un peu plus profondément comme ça, nous pouvons commencer à comprendre que c'est ainsi que chaque nouvel objet, des objets faisant également référence à d'autres types tels que tableaux et des fonctions et ont un ensemble. de propriétés et de méthodes utiles que nous pouvons utiliser chaque fois que nous créons nos propres objets. Comme nous venons de le dire, nous pouvons également tirer parti de l'héritage de ce prototype par nos propres objets si nécessaire. 18. Copier les propriétés de l'objet: Dans les vidéos précédentes, nous avons approfondi objets avec des constructeurs d'objets, des copies et des prototypes. Mais parfois, nous voulons simplement copier les propriétés d'un objet vers un autre. Il existe plusieurs façons de le faire. Tout d'abord, nous avons le personnage de base avec des informations qui pourraient s'appliquer à tous les nouveaux personnages Simpson que nous créons. Des informations assez génériques, et ci-dessous nous avons également un objet homer avec quelques propriétés qui ne s'appliquent qu'à ce personnage. Pour Homer et pour tous les autres personnages que nous créons, nous devons également fusionner toutes les propriétés du personnage de base. Une façon simple de le faire consiste simplement à référencer ce personnage de base à l'intérieur de l'objet Homère. Nous avons ajouté ceci en tant que propriété, l'avons dans le caractère de base et le tester dans la console. Nous disposons déjà d'un journal de console pour la valeur de Homer. Si nous ouvrons cela, nous avons les quatre propriétés originales et nous voyons également notre caractère de base. Cela fonctionne parfaitement, mais cela crée un objet de personnage de base lequel nous devons nous ouvrir et plonger. Notre personnage de base est imbriqué d'un niveau plus profond que toutes nos autres propriétés. Mais il serait préférable que nous puissions saisir toutes ces propriétés de caractères de base et les mettre efficacement à côté de ce que nous avons déjà. L'une des façons de le faire consiste à utiliser des objets dispersés, que nous avons regardés plus tôt, savoir les trois points. Passer les trois points avant l'objet de notre personnage de base. Maintenant, nous ne voyons plus l'objet du personnage de base lequel nous devons plonger. Au lieu de cela, nous voyons toutes les propriétés des personnages de base à côté de nos propriétés homères. Nous pourrions également utiliser cette technique pour diffuser autant d' objets différents que nous le voulions. Par exemple, si nous avions un personnage d'Homer Simpson doté superpouvoirs pour un épisode particulier, nous pourrions faire quelque chose comme ça. Nous pourrions créer un nouvel objet appelé SuperHomer. SuperHomer aurait également besoin d'hériter du personnage de base et de toutes les informations existantes de Homer. Nous pouvons également supprimer cela. Nous pouvons utiliser la passe de spreads dans ces deux objets. Le personnage de base ainsi que les informations d' homer existantes. En plus de cela, nous pouvons également transmettre nos propres propriétés spécifiques à cet objet unique. Par exemple, nous pourrions définir les pouvoirs pour qu'ils soient égaux à vrai, et cela devrait maintenant afficher un gros objet dans le navigateur. Passons simplement à notre journal de console pour devenir SuperHomer. Rafraîchissez et maintenant nous avons neuf propriétés différentes sur cet objet. Nous avons la chute du personnage de base, du premier plan de l'objet Homère, et aussi des pouvoirs réglés sur vrai. Nous pourrions supprimer ou commenter cet objet, et nous allons maintenant examiner une autre façon de copier propriétés de l'objet vers un nouvel objet. Cela se fait avec une méthode objet appelée assignation. Accédez à notre objet principal, la méthode d'attribution. Cela va prendre en compte deux choses. Tout d'abord, l'objet cible vers lequel vous souhaitez copier. Nous le copierons sur notre objet Homer, et le second est l' objet que vous souhaitez copier. En utilisant notre exemple original pour déplacer toutes les propriétés de notre personnage de base vers Homère. Transmettez cette valeur comme deuxième valeur. Dans le journal de la console pour être plus homer. Sautez dans la console. Cela fusionne désormais toutes les propriétés du personnage de base dans notre objet Homer. Fonctionne efficacement comme l'opérateur de propagation que nous avons examiné auparavant. De plus, si nécessaire, nous pouvons stocker ce nouvel objet dans une variable telle que MergedHomer. Cela devrait également fonctionner exactement de la même manière. Cette technique assignée, ainsi que les précédentes, sont vraiment utiles et quelque chose que vous pouvez souvent utiliser en JavaScript. Il existe de nombreux cas d'utilisation, par exemple si nous avions un utilisateur et une commande, nous voudrions peut-être joindre un objet utilisateur à notre commande avant de l'enregistrer dans la base de données, afin que nous sachions qui a réellement passé la commande. Vous trouverez probablement également nombreux cas d'utilisation. 19. Objets de style CSS: Dans la section DOM, nous avons créé nos propres éléments HTML. Ensuite, nous avons examiné comment ajouter un style CSS à ces éléments à l'aide de JavaScript. Dans le fichier Style, nous avons un exemple de cela en bas, une section d'en-tête simple avec un titre sans hamburgers à la viande. Ensuite, en dessous de cela, dans notre script plusieurs propriétés de style sont appliquées. Cela fonctionne bien comme nous pouvons le voir à l'intérieur du navigateur, mais cela peut être une très longue façon de faire les choses. Il n'est pas non plus réutilisable sur d'autres éléments. Une solution consiste à créer un objet style contenant toutes les propriétés et valeurs CSS dont nous avons besoin. Allons en bas et nous commenterons tous ces styles existants et nous allons recréer à l'intérieur d'un objet style. Stockez-le à l'intérieur d'une variable appelée styles. Dites cela équivaut à un objet, et nous les reproduirons efficacement à l'intérieur d'ici. Tout d'abord, l'affichage est égal à la valeur de flex. Puisqu'il s'agit d'un objet, nous devons le séparer par une virgule et le suivant est JustifyContent. Puisqu'il s'agit de JavaScript, nous devons également faire ce cas camel, JustifyContent et chaque mot après le premier doit commencer par une majuscule. La valeur, cela peut être la même, peut s'agir d'un espace entre les deux. Ensuite, nous avons une valeur de remplissage. Encore une fois sous forme de chaîne, zéro en haut et en bas, et 10 pixels à gauche et à droite. Contexte. Qu' avons-nous ici ? Nous avons une valeur RVB. Nous allons copier ça. Enfin, la couleur. Prenons la valeur que nous avons déjà , collez-les dans. Passons dans le navigateur et rafraîchissons. Nous n'avons pas de style appliqué. Nous avons maintenant besoin d'un moyen d' appliquer réellement l'objet style à notre élément d'en-tête. Tout comme la dernière vidéo, nous pouvons utiliser object.assignation. Cela va copier toutes les propriétés de nos objets de style dans cet élément d'en-tête. En bas de l'objet de script. Assign. Nous voulons les appliquer à l'en-tête. Les propriétés de l'objet que vous souhaitez appliquer sont nos styles. Mais tout comme ça, cela ne fonctionne pas si nous actualisons le navigateur. La raison est comme nous l'avons fait à l'origine, au lieu de les appliquer à l'élément d'en-tête, nous devons les appliquer à header.style, donc à .style et rafraîchir et tout cela devrait maintenant prendre effet dans le navigateur. Pour le moment, vous pouvez être un peu confus quant à la raison pour laquelle une méthode objet telle qu' assignation fonctionne sur un élément tel qu'en-tête. Eh bien, c'est parce que nos éléments, comme beaucoup de choses en JavaScript sont également classés comme des objets. Nous pouvons le voir avec un journal de console. Nous pouvons utiliser l'opérateur typeof et la valeur de l'en-tête. Voyons ensuite ce qui se passe à l'intérieur de la console. Rafraîchissez et vous pouvez voir que l'en-tête, même s'il s'agit d'un élément, est un type d'objet. Lorsque nous créons de nouveaux éléments, nous créons réellement des objets éléments et c'est ainsi que nous pouvons accéder aux propriétés, aux méthodes et aux événements. Nous avons déjà utilisé des propriétés telles que l'accès aux attributs, à la liste des classes et au code HTML interne pour n'en nommer que quelques-unes. Les méthodes que nous avons utilisées incluent queryselector et AddEventListener. Ils sont tous disponibles sur cet objet élément. Mais pourquoi créer un objet style au lieu d'un CSS normal ? Eh bien, le CSS est probablement facile pour de nombreux cas d'utilisation, mais cette méthode a également ses propres utilisations. Le principal pour moi est le fait qu'il est contrôlé par JavaScript. Nous pouvons modifier les valeurs de manière dynamique. Si nous avions un jeu, par exemple, nous pourrions changer l' arrière-plan pour qu'il devienne rouge si la partie était terminée. Nous pouvons accélérer le décompte à rebours au fur et à mesure qu'il se rapproche de la fin et nombreux autres cas d'utilisation exceptionnels en mettant à jour l'une de ces valeurs dynamiquement. 20. Faire une boucle avec des objets: objets peuvent avoir de nombreuses valeurs comme nous savons et, comme pour les tableaux, boucle est un moyen pratique de répéter quelque chose pour chaque propriété. Il existe plusieurs façons différentes d' utiliser pour parcourir des objets, et tout d'abord, nous examinons la boucle for-in. Dans le fichier de cette leçon, nous avons une fonction constructeur en haut, que nous avons déjà vue pour créer un nouvel utilisateur. Notez que les ajouts de prototypes sont commentés et nous verrons pourquoi bientôt. boucle for-in devrait paraître assez familière. Nous avons déjà examiné cela dans la boucle de la section, mais je veux vous montrer quelque chose d'autre lié. En guise de rafraîchissement, c'est comme ça qu'il se trouve à l'intérieur de notre code. Cela commence par le mot-clé for, et pour cet exemple, nous allons passer en boucle sur notre objet Homer. Nous devons créer une variable pour chacune des propriétés à l'intérieur d'ici, donc le prénom, le nom de famille, l'occupation et les vies. C'est à l'intérieur d'une variable ou d'une constante appelée propriété à l'intérieur de notre objet homère. Maintenant, nous allons ouvrir les bretelles bouclées et à l'intérieur ici, nous pouvons faire tout ce que nous voulons avec cette propriété. Mais maintenant, nous allons créer un journal de la console, ouvrir les coches arrière pour pouvoir insérer notre variable de propriété, qui est notre nom de propriété, tel que le prénom, ajouter un deux-points, et ensuite nous pourrions accéder également à la valeur de la propriété. Encore une fois, nous allons insérer cette variable en tant que variable afin d'accéder à notre objet homer complet, et à l'intérieur des crochets, nous transmettrons la propriété dont et à l'intérieur des crochets, nous voulons saisir la valeur. Enregistrez cela, actualisez et nous voyons chacune de ces quatre propriétés à l'intérieur de la console. Nous voyons les noms de propriété réels tels que le prénom, puis nous l'utilisons pour sélectionner la valeur de la propriété à partir de l'objet Homer, tel que Homer. Nous pouvons ensuite utiliser ces valeurs pour construire des éléments afin de les ajouter maintenant au DOM. abord, une liste non ordonnée est requise, que nous pouvons utiliser comme wrapper pour toutes ces valeurs, alors sautez jusqu'à notre section corps en dehors du script, a une liste non ordonnée, et la première étape consiste à saisir une référence à nos éléments. Const ul est incroyablement similaire à Document.QuerySelector, passe dans notre liste non ordonnée. Cela nous donne maintenant deux choses. Nous avons une boucle, donc nous parcourons toutes les propriétés à l'intérieur de notre objet, et maintenant cela nous donne un élément auquel nous attacher cela. Comme il s'agit d'une liste non ordonnée, nous devons créer un nouvel élément de liste pour chacune de ces valeurs. Const li pour notre élément de liste, nous allons le créer avec Document.createElement (). Un élément est en li. N'oubliez pas que lorsque vous créez de nouveaux éléments, il s' agit généralement d'un processus en trois étapes. Nous créons les éléments, nous créons le contenu, tel que le nœud de texte, puis nous les fusionnons ensemble. La deuxième partie concerne le texte qui se trouve à l'intérieur de notre élément de liste. Nous le faisons avec Document.createTextNode (), répliquez ce que nous avons vu dans la console. Il suffit de copier le contenu de l'intérieur d'ici et de le coller à l'intérieur de notre méthode. Supprimez le journal de la console, fusionnez-les ensemble en accédant d'abord à nos éléments et en utilisant la méthode AppendChild. Nous allons passer notre texte. Cela a créé de nouveaux éléments autonomes ou un élément de liste autonome, puis, pour chaque boucle, nous devons fusionner cela ou l'insérer dans notre liste non ordonnée. Comme nous l'avons fait plus haut, nous allons récupérer notre liste non ordonnée et utiliser AppendChild. En lui transmettant l'élément de liste que nous venons créer. Enregistrez et rafraîchissez. Nous y allons et c'est un très bon moyen de structurer nos objets pour les afficher à l'intérieur du navigateur. Mais revenons à ce prototype, que vous avez déjà mentionné, qui est actuellement commenté. Si nous décommentons cela, sauvegardons cela et, à nouveau, actualisez le navigateur. Nous voyons également ces deux valeurs prototypes à l'intérieur d'ici. C'est quelque chose que nous devons surveiller et si nous ne voulons pas parcourir ces prototypes, ce qui est souvent le cas, ce qui est souvent le cas, nous pouvons les éliminer à l'aide d'une méthode d'objet appelée hasOwnProperty (), que nous pouvons utiliser à l'intérieur de la boucle. Passons à notre boucle for-in, et tout en haut, ajoutons une déclaration if. Nous passerons à Homer.HasownProperty (), en passant notre variable de propriété. Ce que nous faisons ici, c'est que nous accédons notre objet Homer complet , puis nous vérifions chaque propriété une par une. Nous vérifions si la propriété particulière appartient à cet objet Homer, ou si elle est héritée via le prototype. Si c'est le cas, nous voulons exécuter notre code ci-dessous. Si ce n'est pas le cas, il s'agit d'une valeur prototype et donc ignorée. Nous pouvons maintenant couper cela hors de sa place et l'ajouter dans nos déclarations if. Rafraîchissez, et c'est un moyen d' ignorer nos valeurs prototypes héritées. Une autre façon de boucler des objets consiste à les convertir en tableaux. Object dispose de certaines méthodes que vous pouvez utiliser pour ce faire, et selon que vous souhaitez accéder à la propriété de l'objet, la valeur des deux sous forme de paire. Commençons par une méthode appelée entrées tout en bas, placons dans un journal de console pour objects.entrées () et notre valeur objet Homer. Testez cela, sautez dans la console, et il revient toujours dans le tableau. Non seulement cela revient dans le tableau, chacune des propriétés est également un tableau. Il contient le nom de la propriété ainsi que la valeur comme vous pouvez le voir ici. Cette méthode n'inclut pas les valeurs prototypes comme pour for in. Si nous utilisions cela, nous pourrions ignorer les déclarations if que nous avons ici. Pour essayer cela, et garder le même exemple, augmentez l'exemple dans l'exemple, puis commentez cela. Collez ceci juste en dessous. Je dois mentionner que nous n'avons pas besoin de cette déclaration si car nous n'avons pas besoin d' éliminer aucun des prototypes hérités. Retirez l'emballage en laissant ces quatre lignes à l'intérieur. Cette fois-ci, plutôt que de boucler notre objet Homer, nous allons maintenant utiliser object.entry. Nous allons déplacer cela, et comme nous l'avons fait dans le journal de la console en remplaçant des objets, des entrées de données avec la valeur Homer. Enregistrez et rafraîchissez. Dans le navigateur, nous voyons les valeurs indéfinies. Cela n'est peut-être pas évident au début de la raison pour laquelle c'est le cas, mais c'est à cause du type de boucle que nous utilisons. Nous utilisons actuellement une boucle for in, qui est utilisée sur les objets. Mais maintenant, nous convertissons Homer en tableau. Cela signifie maintenant que nous devons apporter une petite modification et utiliser plutôt une boucle for, donc changer pour être de, et nous souvenir maintenant de cette propriété, au lieu de renvoyer une seule propriété comme avant, va maintenant pointer vers un tableau qui contient deux valeurs telles que notre prénom et notre homère. Ce que nous pouvons faire au lieu de cela , c'est la structure D en utilisant le tableau, ce qui nous donnera la clé et la valeur. Dans ce cas, la clé est égale au prénom et la valeur sera égale à Homer pour chacun de nos articles. Passe-moi ça. Tout d'abord, la clé, puis transmet également notre valeur. Enregistrez ça. Rechargez. Cela fonctionne de nouveau comme prévu. C'est une très bonne façon de boucler, qui n'implique pas le prototype. Si nous le voulons, nous pouvons également accéder aux clés, toutes les valeurs individuellement . La façon de le faire. Par exemple dans notre journal de console, si nous voulons simplement accéder aux clés telles que le prénom et le nom de famille, nous pouvons utiliser une méthode d'objet appelée keys, où nous transmettons notre objet homer, et il y a nos quatre clés sans les valeurs. Par contre, si nous voulions simplement accéder aux valeurs et non aux clés, nous pouvons utiliser object.values, et cela reviendra à l'intérieur de la console. Ceci est également couramment utilisé dans les instructions if comme celle-ci. Nous pourrions dire si object.keys (), transmettez notre objet et accédez à la propriété length est supérieure à zéro. Nous pouvons ensuite faire quelque chose à l'intérieur d'ici. Cela vérifie si un objet n'est pas vide avant d'exécuter un code, et cela dépend simplement si vous souhaitez accéder à la clé, la valeur ou aux deux. 21. Objets dynamiques: Cette vidéo va convertir la création d'objets plus dynamiques. Par là, je veux dire que la clé et la valeur peuvent être modifiées à l'aide de JavaScript. Lorsque nous créons de nouveaux objets, comme nous l'avons fait avec cet objet de maison, nous utilisons une valeur primitive simple telle que des chaînes, mais nos programmes ne seront pas toujours aussi rigides. se peut également que nous ayons besoin d'insérer des données susceptibles de changer, telles qu'une variable. De plus, même avec les noms de clés tels que FirstName et LastName et occupation. Tout cela peut également être dynamique. Je vais maintenant vous montrer quelques façons de le faire. abord, les méthodes les plus traditionnelles, puis une méthode introduite dans ES2015. Nous commençons par insérer des variables en tant que valeurs, ce qui est assez simple à faire. Créons d'abord une variable appelée FirstName et définissons cette variable sur Homer. Nous pouvons ensuite référencer cette variable dans la valeur de notre propriété lorsque nous créons notre nouvel utilisateur Homer. N'oubliez pas que puisque nous faisons maintenant référence à une variable plutôt qu'à une chaîne, nous devons supprimer les guillemets environnants. Enregistrez cela et rafraîchissez-le. Cela fonctionne comme avant, mais cette fois, nous pointons maintenant vers une variable. Nous savons déjà que nous pouvons ajouter de nouvelles propriétés comme celle-ci. Nous pouvons accéder à notre objet, accéder à la propriété likes et définir cette propriété comme une chaîne. Enregistrez et actualisez, et cela est également ajouté à notre objet. Actuellement, la valeur des J'aime est définie comme une chaîne. Nous voudrions peut-être également que cela soit dynamique. Essayons de définir cela comme une variable plutôt qu'une chaîne. Supprimez les devis. Je vais créer cela comme une variable juste au-dessus, const likes, et insérer notre chaîne dans les coches arrière afin que nous puissions insérer notre variable en passant tous notre Prénom. Dans ce cas, il dira homerlikes, suivi d'une valeur particulière. J'envoie FirstName, un texte de j'aime, et maintenant nos likes à l'intérieur d' ici pointeront vers notre variable, qui est maintenant affichée dans le navigateur. Il prend également en compte notre variable FirstName et la place dans la chaîne. Si nous avions plusieurs likes, nous voudrions peut-être aussi les numéroter. Nous pouvons commencer par créer une valeur initiale. Nous allons dire que le nombre soit égal à la valeur initiale d'un. Ajoutez ensuite cette valeur numérique à notre variable. Comme on peut s'y attendre, nous n' avons que le numéro 1 unique. Si nous devions dupliquer cela et changer cette valeur pour qu'elle soit une deuxième valeur telle que Donuts, nous pourrions incrémenter ce nombre d'un en utilisant plus plus. Cela sera augmenté pour chacune de nos valeurs. N'oubliez pas que tout cela est construit à l'aide notre fonction constructeur d'objets en haut. Nous pouvons également faire tout cela en utilisant l' approche littérale de l'objet. En bas, créons un littéral d'objet, et nous l'appellerons homer2, et définissons cela comme un objet littéral dans lequel nous définissons nos propriétés telles que FirstName ou nous pouvons également utiliser notre Variable FirstName également. Connectez-vous à la console. Comme vous pouvez le constater, notre variable peut également être insérée en utilisant cette approche. Mais cela peut commencer à paraître un peu déroutant car ici, nous pointons vers toutes les variables FirstName, mais aussi le nom de la propriété pointe toujours vers cette variable FirstName. Alors pourquoi considérons-nous cette sortie comme une chaîne plutôt que la valeur de Homer ? Eh bien, pour la clé, nous n'avons pas besoin de mettre ce nom entre guillemets. Il sera toujours affiché sous forme de chaîne. Alors, comment faire pour rendre cette propriété nommée dynamique si nous ne pouvons pas utiliser une variable comme celle-ci ? Eh bien, une option serait simplement de créer un objet vide sans aucune propriété à l'intérieur. Ensuite, nous pourrions ajouter des propriétés comme nous le faisons ci-dessus en utilisant les crochets ou en utilisant une fonctionnalité ES2015 appelée noms de propriétés calculées. Nous pourrions utiliser les crochets directement à l'intérieur de nos objets. Entourez donc notre propriété FirstName avec les crochets, ce qui indique maintenant que le code à l'intérieur de ces crochets ne doit pas être traité comme une chaîne. Au lieu de cela, il est évalué comme une expression JavaScript, ce qui signifie que si nous l'affichons maintenant dans le navigateur, nous voyons maintenant la valeur de Homer, qui est notre variable. Même ce contrôle total sur la clé des propriétés, ainsi que la valeur des propriétés à l'aide de JavaScript. Nous pourrions également extraire nos propriétés comme nous l'avons fait d'en haut. Nous pourrions y accéder sans le préfixe Homer , coller ça dans. La seule différence est que les égaux, nous devons changer cela par deux-points. Nous pouvons également ajouter notre deuxième à Donuts. Ajoutez une virgule, placez deux points. Essayons cela dans le navigateur. Ouvre ça. Ceci est donc maintenant inséré, mais au lieu des valeurs de un et deux, nous voyons les valeurs de deux et trois puisque nous l'avons déjà incrémenté juste au-dessus, nous pouvons commenter celle-ci. Cela nous ramène à notre exemple original. C'est ainsi que nous pouvons utiliser des noms de propriété calculés avec nos objets pour rendre la clé et la valeur plus dynamique à l'aide de JavaScript. 22. Types de référence et primitifs: Nous utilisons beaucoup de variables dans le codage et JavaScript pour stocker nos données. Mais si nous allons un peu plus loin, il y a quelques concepts importants à comprendre et c'est que les valeurs que nous conservons se divisent en deux groupes. Pour mieux comprendre cela, je souhaite d'abord actualiser ce que nous savons déjà sur les types de données. Nous avons des valeurs primitives, qui sont des valeurs simples, telles qu'une chaîne ou un nombre sans méthode. Nous avons également des types d'objets. Ces deux groupes sont directement liés à ce que nous allons examiner maintenant et il s'agit de stocker des types primitifs et de référence. Une variable de chaîne serait primitive, et un type d'objet, tel qu'une variable de tableau serait classé comme type de référence. Ces deux types ont un impact sur le comportement des valeurs lorsque nous les transmettons et les comparons. Jetons d'abord un coup d'œil à notre projet de départ et jetons un coup d'œil aux primitives. Dans le script du fichier de cette leçon, nous allons créer une nouvelle variable appelée Dog et la définir comme égale à une chaîne. Ensuite, créez une deuxième variable appelée NewDog, et nous la définirons comme égale à notre variable chien d'origine. Celui-ci est en fait une copie de notre première variable. Ensuite, nous allons réaffecter NewDog pour qu'il soit autre chose. N'oubliez pas que la façon de procéder consiste à sélectionner notre nom de variable et à le définir comme égal à n'importe quelle nouvelle valeur. La prochaine chose à faire est de faire un test rapide avec un journal de console, commençant par notre première variable chien, puis un deuxième journal de console pour notre nouveau chien. Voyons voir. Eh bien, ça a gelé à l'intérieur de la console. Nous voyons la valeur de Caniche, que vous attendez de notre premier journal de console, et du deuxième journal de console de NewDog. Même si la variable du caniche a été attribuée à l'origine à cette variable, elle a été mise à jour pour être le texte du Labrador. Rien d'inattendu ici, même si nous avons copié une variable à l'origine, la nouvelle variable reste une valeur distincte, complètement indépendante de l'originale. Fondamentalement, nous pouvons modifier le chien d'origine ou le nouveau chien et ils ne se toucheront pas mutuellement. C'est le comportement des primitifs. La variable pointe vers la valeur enregistrée réelle. Le stockage des types d'objets se comporte différemment. Prenons un exemple en utilisant un objet que nous pouvons copier comme nous l'avons fait ici. Tout d'abord, nous allons créer notre variable appelée ordinateur portable 1 et la définir comme un objet, qui est bien sûr un type d'objet. Les propriétés ou les marques, et les données qu'elles contiennent n'ont pas d'importance. Le modèle définit n'importe quelle valeur sous forme de chaîne, puis juste en dessous, nous en ferons une copie, comme nous l' avons fait avec notre NewDog. Celui-ci s'appellera ordinateur portable 2, ce qui est égal à l'ordinateur portable 1. De la même manière que nous l'avons fait tout en haut avec nos primitives, nous mettrons à jour ou réassignerons notre ordinateur portable 2, puis nous ajouterons une nouvelle propriété, telle que la taille. Cette fois pour les journaux de la console, le premier est l'ordinateur portable 1. Je vais également voir quelle est la valeur de l'ordinateur portable 2 . Testez ça. Actualisez. Nous verrons que ces deux valeurs sont exactement les mêmes. Cela peut sembler vraiment étrange car nous avons la propriété de taille sur l'ordinateur portable 1 et l'ordinateur portable 2 même si nous n'avons ajouté cela qu' à notre deuxième variable. signifie que cela semble être un lien entre ordinateur portable 1 et l'ordinateur portable 2. Lorsque nous avons créé nos variables stockées dans une primitive juste au-dessus avec une chaîne, la variable pointe vers la valeur unique réelle stockée en mémoire, et ce sont toutes des valeurs uniques. Toutefois, lorsque nous créons une variable contenant un type d'objet, l'objet est toujours stocké en mémoire. Mais ces variables, telles que l'ordinateur portable 2, contiennent une référence à l'emplacement de cet objet plutôt qu'à la valeur réelle, où le type de référence du nom. Ici, nous créons notre ordinateur portable original, puis chaque fois que nous créons une copie telle que l'ordinateur portable 2, tout pointe vers le même objet original. Comme toutes les copies pointent vers la même valeur, c'est pourquoi, lorsque vous modifiez l'une d'elles, comme ici, l'original sera également mis à jour. D'autres langues nous permettent de modifier ce comportement. Mais avec JavaScript, c'est corrigé. Juste comme un récapitulatif rapide et peut-être clarifier si vous n'êtes pas sûr. Lorsque nous créons une variable à stocker dans une primitive, telle qu'une chaîne, la variable pointe vers une valeur unique réelle stockée en mémoire, ce qui signifie que notre chien et notre NewDog sont complètement valeurs uniques et indépendantes. Toutefois, lorsque nous créons un nouveau type d'objet basé sur un objet d'origine, la version copiée contiendra une référence à l' emplacement de l'objet d'origine en mémoire, où le type de référence du nom. C'est quelque chose dont vous ne vous souciez probablement pas trop jusqu'à ce que nous rencontrions un problème où vous changez un objet et qu'ils changent tous de façon inattendue, et vous ne savez pas ce qui en est la cause. le problème. Dans cette optique, nous allons ensuite voir comment comparer deux objets. 23. Comparaison d'objets: Ce que nous avons appris dans la vidéo précédente, c'est qu'une valeur primitive est unique et stockée par une valeur et un type d'objet est stocké comme référence. Cela nous aidera maintenant à mieux comprendre le comportement que nous allons voir lors de la comparaison de deux objets, c'est qu'à l'intérieur de nos fichiers de démarrage, nous avons deux objets similaires avec les mêmes propriétés. Ils ont tous deux la marque et le modèle ainsi que les mêmes valeurs. Nous allons les utiliser pour comparer la qualité. D'après une supposition raisonnable, vous penseriez que si nous comparons ces deux éléments, ils seront considérés comme une vraie correspondance. Ce serait une hypothèse juste, car les deux ont la même marque et le même modèle. sautant dans la console, si nous faisons une comparaison avec les primitives, c'est assez simple. Si 1 est égal à 1, cela renvoie la valeur true. C'est simple car les primitives ont leur propre valeur unique stockée en mémoire. comparaison des valeurs fonctionne comme vous pouvez vous y attendre. objets sont cependant un peu moins évidents. Comme vous pouvez vous y attendre, comparer le même objet comme celui-ci se traduit par la vraie. Ordinateur portable 1, si nous comparons cela à lui-même, qui est l'ordinateur portable 1, c'est également vrai. Mais si nous changeons l'ordinateur portable 1 pour qu'il soit égal à l'ordinateur portable 2, même si ceux-ci ont tous les deux la même marque et le même modèle, nous récupérons une valeur de faux. Même si ces deux objets ont exactement le même contenu, ils ne sont pas considérés comme égaux. La raison est qu'il s' agit de types de référence. N'oubliez pas qu'une variable de type de référence pointe vers un emplacement en mémoire, non la valeur réelle. Ici, nous ne comparons pas réellement le contenu de ces deux objets. Au lieu de cela, nous comparons deux emplacements de mémoire différents. C'est pourquoi la comparaison est fausse. Je sais que cela peut sembler un peu déroutant, mais c'est exactement comme ça que JavaScript fonctionne. revenant à ce que nous avons regardé dans la vidéo précédente, que pensez-vous qu' il se passera si nous copions un objet ? Par exemple, si nous définissons la constante avec l' ordinateur portable 3 et que nous définissons cette valeur égale à l'ordinateur portable 1. Eh bien, allons tester ça. Nous pouvons vérifier si l'ordinateur portable numéro 1 est égal à l'ordinateur portable 3. N'oubliez pas que nous faisons ici une copie, ce qui donne une valeur vraie. Maintenant, celui-ci revient vrai parce que lorsque nous avons créé l'ordinateur portable 3, nous n'avons pas copié le contenu de l'ordinateur portable 1. Au lieu de cela, l'ordinateur portable 3 pointera maintenant vers notre ordinateur portable 1 d'origine en mémoire. Quelle que soit la façon dont toutes ces variables sont stockées en coulisses, il se peut que nous ayons besoin d'un moyen de comparer les propriétés de deux objets. Nous avons besoin d'un moyen de comparer l' ordinateur portable 1 avec l'ordinateur portable 2, ce qui va se révéler vrai. Une façon de procéder consiste à utiliser une méthode JSON appelée stringify. Nous examinerons plus en détail les données JSON. Stringify est un moyen de convertir un objet en chaîne et cela ressemble à ceci. En analysant JSON, une méthode appelée stringify, nous allons analyser la valeur de l'ordinateur portable 1. Si nous testons cela à l'intérieur de la console, nous pouvons voir que notre objet est en cours de conversion en chaîne. comparaison d'une version à chaîne de l'ordinateur portable 2 avec une version à chaîne de l'ordinateur portable 2 facilitera notre comparaison . Nous ferons de même. Nous allons vérifier si cela est égal à json.stringify. Cette fois, nous analyserons la valeur de l'ordinateur portable 2. Sautez dans la console. Cela est égal à vrai puisque nos deux valeurs de chaîne sont exactement les mêmes. L'un des problèmes liés à l'utilisation de cette méthode est que les propriétés doivent être exactement dans le même ordre pour que cela fonctionne. Si l'ordinateur portable 1 et la marque est notre deuxième propriété, cela se traduirait par faux. Pour résoudre ce problème, nous avons plusieurs façons de vérifier cela. La première, qui n' est vraiment efficace que pour comparer des objets simples comme celui-ci , est que nous pourrions créer une fonction appelée vérifier l'égalité, qui va vérifier manuellement nos deux objets. Lorsque nous appelons cela, nous analysons l'objet 1 et l'objet 2. Ensuite, nous retournerons la valeur de if objet 1. La marque est égale à l'objet 2. C'est notre première comparaison. Ensuite, nous voulons également vérifier si le modèle est également le même. L'esperluette double, vérifiez si object1.model est égal à object2.model. C'est un long chemin. C'est une façon manuelle de faire les choses, mais cela fonctionnerait. Nous pouvons vérifier cela en appelant notre fonction de vérification de l'égalité. Nos deux objets seront l'ordinateur portable 1 et l'ordinateur portable 2, sont les deux que vous voulez comparer. Pour voir quelle est la valeur renvoyée, nous pouvons l'analyser dans notre journal de la console, l'actualiser. L'objet 1 n'est pas défini, j'aurais juste besoin de m' assurer qu'ils ont un j, rafraîchir, et c'est la valeur de true. Maintenant, peu importe le chemin autour nos propriétés dans chacun des objets. Nous pouvons encore faire une comparaison simple ou manuelle de chacun d'entre eux. Une autre option consiste à utiliser des méthodes objet pour accéder aux clés et aux valeurs. Nous les avons déjà examinés dans la vidéo en boucle avec objet. N'oubliez pas que nous accédons à l'objet, un O. Nous pouvons ensuite remonter les clés telles que le modèle et marque ou l'ordinateur portable 1, comme ceci. Il y a un modèle et une marque. Nous pouvons également faire de même pour object.values. En utilisant cette approche, nous pouvons modifier notre fonction de vérification de l'égalité pour toutes les clés et valeurs et vérifier si nous avons une correspondance. Cela signifie également que l'ordre des propriétés n'est pas important comme c'était le cas avec la première méthode stringify. Comme vous pouvez le constater, les types d'objets peuvent être complexes. Si vous ne comprenez pas comment ils fonctionnent en JavaScript, il faut juste un peu d' expérience pour s'y habituer. Mais je ne m'attends pas à ce que vous vous souviez de tout cela pour la première fois. Mais le simple fait d'être conscient de telles choses vous aidera à l'avenir si vous rencontrez des problèmes liés aux objets. 24. Section Introduction: À venir, nous aurons un excellent projet pour vous permettre de travailler et cela vous donnera beaucoup de pratique avec ce que nous avons appris jusqu'à présent. Il s'agit de notre projet nommé Speedy Chef. L'idée est que nous allons cuisiner des pizzas qui passent par commande et essayer d'en obtenir autant que possible, donc avec le chef et nous pouvons commencer le jeu, ce qui va commencer le service pour le ensuite nous pouvons voir nos commandes arriver sur la droite. Lorsque nous voulons commencer à travailler sur une commande, nous cliquons simplement sur l'une d'elles, puis elle passe à la section « Travailler sur », qui nous indique quelles pizzas nous devons faire. Pour cet exemple, nous avons besoin d'un jambon et ananas et de deux poivrons. Actuellement, nous allons commencer par le jambon et l'ananas. Passez en revue les étapes de la méthode juste ici et la première consiste à rouler la pâte. Cliquez sur ce bouton. Nous devons ensuite ajouter notre sauce, notre poivre, notre fromage, ajouter 12 morceaux de jambon. Enfin, 12 morceaux d' ananas et tout cela est mis à jour dans notre section juste ici. Une fois que nous avons terminé, nous pourrons l'ajouter au four et si vous commettez une erreur, nous pouvons également l'ajouter au gaspillage. Cliquez dessus, puis en coulisses, il vérifie également que nous avons tous les bons ingrédients dont nous avons besoin pour notre pizza. Il y a du jambon et de l'ananas qui entrent dans le four. Nous pouvons passer au pepperoni, puis une fois que nous en aurons fini, nous pourrons compléter notre commande et passer à la suivante. Nous devons également rester au courant des choses, car ces ordres continueront d'arriver au fur et à mesure que le temps progresse. Il s'agit d'un projet relativement important par rapport à ce que nous avons construit jusqu'ici. Mais la plupart d'entre vous le saurez déjà. Il s'agit simplement de construire une petite fonctionnalité à la fois et tout ira parfaitement bien. En cours de route, je vais vous confier une série de tâches pour essayer les choses par vous-même, mais ne vous inquiétez pas, vous n' êtes pas seul. Je parcourrai également chaque étape pour que nous puissions comparer et nous souvenir, comme toujours, qu'il existe plusieurs façons d'aborder les choses. Si nous trouvons tous les deux des solutions différentes qui fonctionnent, c'est très bien. À l'intérieur des fichiers de démarrage, nous avons un démarreur de base avec notre page d'index, qui ajoute toute la mise en page initiale dont nous avons besoin. Nous avons également un peu de style dans nos feuilles de style, ce qui signifie simplement que nous pouvons sauter directement dans notre JavaScript et nous concentrer là-dessus. Même si cela ressemble au projet final, rien ne fonctionne encore et nous allons coder tout cela pendant le cours. En guise de démarrage, j'ai également inclus le fichier pizza.svg ainsi qu'un fichier JavaScript lié dans notre page d'index, qui contient trois tableaux. Ces trois rayons vont nous épargner beaucoup de dactylographies. abord, il y a un tableau de pizzas et à l'intérieur, nous avons divers objets de pizza portant le nom de la pizza, une méthode de fabrication de cette pizza ainsi que les étapes requises que nous utilisons dans le projet pour vérifier si le chef a a fait la bonne pizza et a également placé les ingrédients dans le bon ordre. Ensuite, juste en dessous, quelques exemples de commandes pour lancer le jeu et nous les générerons également dynamiquement. Enfin, une liste d'ingrédients dont nous avons besoin dans la cuisine. Super, donc tout cela est maintenant prêt à partir. Ouvrez ce dossier de projet dans le navigateur, puis passez la leçon suivante où nous allons travailler sur liste de ces commandes dans le navigateur. 25. Liste des commandes: Cette vidéo n'aura qu' un seul objectif principal il s'agit de parcourir toutes les commandes et de les afficher dans le navigateur. N'oubliez pas que juste au-dessus, fourni avec ce dossier, est le tableau le plus ancien que nous allons parcourir et afficher dans le navigateur. L'emplacement pour cela se sur le côté droit, dans la section latérale. Dans la page d'index, nous avons deux sections principales. Nous avons cet emballage principal et il contient tout le contenu, qui a le fond blanc. Ensuite, le côté avec l'idée des ordres. Pour l'instant, il n'y a qu' un titre de niveau 3. Mais ce que nous allons faire, c'est de parcourir toutes ces commandes et de les placer dans cette section. Pour ce faire, nous allons créer une fonction appelée CreateOrdersList. Cette fonction va parcourir le tableau des ordres ci-dessus. Pour chacun de ces éléments du tableau, nous allons construire une div, qui ressemble à cette section ici. Certaines parties de cette situation vont être dynamiques. Par exemple, nous aurons le numéro de commande. Cela va être dynamique avec le nom de la pizza et aussi la quantité de chaque ligne. Vous n'avez pas à vous soucier de ces commentaires. Ce ne sont qu' un guide visuel pour nous donner une idée de ce que nous allons faire. Nous commencerons en bas par la création de notre fonction. La fonction s'appelle CreateOrdersList , le mot-clé de fonction. La prochaine chose est de passer en boucle sur chacune de ces commandes. Nous savons comment faire cela. Nous pouvons utiliser une boucle telle que FoReach. Prenez notre tableau de commandes pour Each. N'oubliez pas que FoReach va exécuter une fonction pour chaque élément de notre tableau. Les lieux fonctionnent juste à l'intérieur. Nous allons donner à chacun de ces articles la valeur de la commande. Maintenant, nous devons construire nos éléments comme nous l'avons fait ci-dessus pour chacune de ces commandes. Nous allons commencer par créer ce wrapper principal, qui est la div. Nous ajouterons une classe appelée « wrapper » de commande. Nous allons travailler sur notre contenu à l'intérieur. Nous savons comment créer des éléments. Nous utilisons Document.CreateElements. Comme dans le nom de la balise des éléments, qui est une div à l'intérieur d' une variable ou d'une constante appelée orderwrapper. Ajoutez ensuite le nom de notre classe en sélectionnant le nom de variable OrderWrapper. La propriété appelée ClassName. Comme nous le voyons plus haut, ce sera Order_Wrapper. Nous allons donc simplement ajouter un commentaire. C'est l'emballage principal. Ensuite, nous ajouterons un commentaire. Il va s'agir d' ajouter le numéro de commande. Il s'agit de notre première section à l'intérieur de notre emballage de commande. Il s'agira d'un niveau 4 de notre rubrique. Stockez-le à l'intérieur d'une constante. Je me souviens que lors de la création d' éléments comme ceux-ci, nous devons créer l'élément réel puis le contenu à l'intérieur. Nous avons donc besoin de deux variables. Le premier est OrderNumber L, qui est des éléments d'étagère. Donc Document.CreateElements. Nous avons besoin d'un niveau pour nous diriger. Ensuite, le texte qui va entrer à l'intérieur, et c'est le numéro de commande. Le nom constant du numéro de commande et nous créons avec Document.CreateTextNode. Puisque cela va être dynamique car chaque commande a un numéro différent, que nous allons récupérer à partir de cet identifiant unique. Nous allons placer cela à l'intérieur des backticks pour que cela devienne dynamique. abord, le texte de l'ordre, qui est cette partie juste ici, suivi d'une valeur dynamique. La valeur dynamique peut être insérée à l'aide du symbole dollar et des accolades. abord, nous sélectionnons notre commande individuelle, qui est stockée dans cette variable, puis la propriété d'ID. Comme toujours, lors de la création d'un élément, nous disposons de deux informations autonomes et nous devons les fusionner ensemble. Pour ce faire, accédez au parent, qui est OrderNumberElement.AppendChild, où nous transmettrons notre contenu réel, c' est-à-dire le numéro de commande. Cela nous laisse maintenant notre div, qui est l'emballage. Ensuite, notre premier élément, qui est notre titre de niveau 4, mais nous devons encore ajouter ce titre à notre emballage. Prenez l'Order_Wrapper , puis nous utiliserons à nouveau APendChild, qui prendra en compte notre élément de numéro de commande. Nous avons donc la première section ici, puis la prochaine partie consiste à créer notre propre liste de commandes. Un commentaire rapide, pour que nous sachions ce que nous faisons ici d' une excellente pizza UL pour chaque commande, et de l'emballage donc document.CreateElements. Les éléments étaient une liste non ordonnée. Se place dans une constante appelée liste de pizzas. Cela nous donne maintenant une liste non ordonnée, qui est l' emballage principal de toutes les pizzas. Mais n'oubliez pas que nous pouvons avoir plusieurs articles de liste car chaque commande peut contenir plus d'une pizza. Comme nos commandes contiennent plusieurs pizzas à l'intérieur d'un tableau, nous devons à nouveau faire une boucle comme pour chacune d'elles. Pour ce faire, nous passons à nouveau dans notre ordre individuel. Nous allons sélectionner le tableau , appelé pizzas. Utilisez la boucle for each pour exécuter une fonction pour chaque élément ou chaque pizza à l'intérieur du tableau, stockez-la à l'intérieur d'une variable appelée Pizza. Ensuite, nous pourrons travailler à la construction de chacun de ces éléments. Chacun de ces éléments sera un élément de liste. Mais tout d'abord, nous devons créer ce contenu à l'intérieur. Nous avons la quantité telle qu'une, puis un tiret, puis un élément span suivi du nom de chacune de ces pizzas. Plongez dans notre fonction et pour chacun de ces éléments, nous créerons un élément span pour envelopper notre titre et le stocker dans une constante. Celui-ci est la quantité de commande L, donc Document.CreateElements. Les éléments seront la plage , puis ensuite la quantité de chacun de ces éléments, Document.CreateTextNode. Cette section doit être dynamique ou placée dans les backticks. Insérez une variable. Nous pouvons accéder à la quantité en sélectionnant d' abord notre pizza. Dans chacune de ces pizzas, si nous examinons le tableau, possède une propriété appelée quantity. Nous utiliserons également prochainement le nom de la propriété. Pour celui-ci, il s'agit de pizza.quantity, suivi d'un tiret juste après. En pensant à cela, il peut être un peu plus facile si nous ajoutons simplement cette quantité dans notre période. Plutôt que d'en avoir un à l'extérieur, nous allons peut-être placer cela à l'intérieur d'un élément, plutôt que de l'avoir à l'extérieur seul. ce faire, accédez aux éléments de quantité de commande . AppendChild qui se trouve dans la variable quantité, suivi de notre PizzaName. Pour notre PizzaName, cela doit également être enveloppé dans un élément span , puis le contenu à l'intérieur. Nous devons faire exactement la même chose que juste au-dessus, nous allons créer une constante appelée PizzaNamel document.createelement. Element est une période suivie du PizzaName, que nous devons créer avec le nœud de création de texte, prendre notre pizza individuelle. Ensuite, comme nous l'avons vu précédemment, nous avons la quantité suivie de la propriété name. Nous pouvons y accéder avec pizza.name. Fusionnez ces deux-là ensemble. Pizzanamel.AppendChild n'était pas dans le contenu texte, qui est PizzaName. Super, donc nous avons deux travées distinctes ici. Nous avons notre première période, qui consiste à envelopper notre numéro individuel ou la quantité de pizzas. Ensuite, une deuxième période qui contient notre PizzaName. Ces deux éléments doivent être fusionnés dans un élément de liste. Ensuite, l'élément de liste doit être ajouté à notre parent. Mettons-nous donc au travail. Comme nouveau commentaire juste pour que cela soit clair. Il s'agit de créer un élément de liste. Afficher la quantité et le nom de PizzaName. Premiers éléments stockés dans une constante appelée PizzaItem, Document.CreateElement. Il s'agissait d'un élément de liste. Nous avons l'élément de liste environnant, puis nous devons fusionner nos deux éléments par le haut. La quantité qui est cette variable, ainsi que le PizzaName. Prenons notre pizza Item. Puisque nous ajoutons plusieurs éléments enfants, nous pouvons simplement utiliser append et c'est maintenant notre premier élément, qui était l'élément de quantité de commande. Ensuite, le PizzaName Element. Nous avons presque fini maintenant, notre élément de liste sera créé sans deux éléments de contenu à l'intérieur et nous devons maintenant les ajouter à notre liste non ordonnée. Votre liste de commande est stockée dans la constante appelée PizzAlist. Ajoutez ceci juste en dessous de sa liste. AppendChild n'était pas dans notre pizza. Nous y sommes presque. Nous avons maintenant ajouté nos éléments de liste à notre liste non ordonnée. Mais maintenant, la liste non ordonnée doit également être ajoutée à notre emballage. L'emballage n'est que cette variable d'emballage de commande ici. Mais nous devons ajouter cela en dehors de notre boucle. Assurez-vous de localiser la fin de notre boucle. Ce que j'ai fait juste en dessous de cette ligne ici. Sélectionnez OrderWrapper.AppendChild, en passant dans notre liste de pizzas. C'est maintenant notre commande complète qui est rapidement resserrée. La prochaine étape, ou la dernière étape, consiste maintenant à ajouter ceci à notre page Web. Nous avons besoin des sections de ces deux-là. Cette section est le côté. Nous pouvons saisir cela avec l'idée des commandes. Juste en dessous de notre emballage de commande, utilisez Document.QuerySelector pour récupérer nos commandes.AppendChild n'était pas dans notre emballage de commande. Essayons cela, maintenant nous devons appeler cette fonction pour qu'elle fonctionne. Prenons la liste de trois commandes, appelez-nous en bas, rafraîchissons le navigateur. La bonne nouvelle, c'est que nous pouvons réellement voir les commandes à l'écran, mais cela ne ressemble pas à ce que nous attendons. Jetons un coup d'œil à l'intérieur de notre code et voyons ce que nous devons changer. Il nous manque actuellement la quantité avant le PizzaName, qui est cet élément de liste juste ici. Nous ajoutons le numéro de commande. Je pense que c'est juste la quantité commandée. Cela semble beaucoup mieux maintenant que nous avons le numéro de commande tout en haut, chacune d'entre elles est en ordre, suivie du nom et de la quantité de chacune des pizzas de la commande. Comme vous pouvez le constater, il s'agit d'une fonction assez longue, et idéalement, nous voulons la refactionner en pièces plus petites et plus ciblées, et c'est ce que nous ferons ensuite. 26. Liste des commandes Refactor: Au fur et à mesure que nous écrivons notre code et surtout à mesure que notre projet se développe Nous voulons refactionner régulièrement notre code dans la mesure du possible. Pour le moment, notre code fonctionne parfaitement. C'est ce sur quoi nous voulons nous concentrer au début, mais il est également important de regarder régulièrement les choses et de voir si nous pouvons améliorer les choses. Cette vidéo va nous impliquer refactoriser cette fonction unique dont vous disposez. Décomposez-le en plus petits lorsque c'est possible. Il est judicieux de disposer de fonctions plus petites qui se concentrent sur des tâches individuelles, ce facilite la lisibilité et le débogage. La façon dont vous abordez, c' est que c'est à vous de décider et souvent de vos préférences personnelles. Mais plus on se rapprochera d'une fonction pour le faire en une seule tâche, mieux c'est. La première étape que nous allons faire consiste à supprimer tout le processus de création de commandes de cette fonction et à le placer dans une fonction autonome. Nous retirerons tout le contenu utilisé pour créer notre commande, laissant notre fonction « CreateOrdersList » avec une tâche simple. Cette tâche consiste à parcourir tous les tableaux de commandes, puis à les ajouter à la section de côté. Pour ce faire, créez une nouvelle fonction juste au-dessus. Celui-ci va être appelé à « CreateSingleOrder ». Puisque cette fonction va être répétée pour chaque ordre à l'intérieur du tableau, nous allons également prendre l'ordre en tant que variable descendant et sauterons dans notre fonction. En commençant par « OrderWrapper » à l'intérieur de la boucle, déposez tout le contenu d' ici, jusqu' à l'endroit où nous ajoutons cela à notre « OrderWrapper ». Découpez ça et nous devrions juste rester avec notre boucle. Ensuite, la section où nous ajoutons ceci à côté. Maintenant, c'est découpé. Plongez dans notre « CreateSingleOrder » et collez-le dans. Maintenant, si nous sautons dans notre boucle où nous venons de couper ce code. Nous pouvons maintenant appeler cette «  fonction autonome » appelée « CreateSingleOrder ». « CreateSingleOrder » doit également prendre en compte l'ordre puisque nous le passons ici, qui est ensuite utilisé dans le reste de notre fonction. Maintenant, si vous pensez à cela, c'est simplement appeler aucune fonction. Il ne fait rien avec ça. Tout ce que nous devons faire est de renvoyer l'ordre à partir de cette fonction ci-dessus, stocker à l'intérieur d' une variable, puis de l' ajouter au DOM. Nous allons d'abord récupérer notre OrderWrapper, qui est la section de commande complète, et nous le retournerons de notre fonction. Cette valeur de retour peut ensuite être stockée à l'intérieur d'une variable appelée « SingleOrder ». La commande unique peut désormais être ajoutée à notre barre latérale. Essayons ceci, « Enregistrer » et « Rafraîchir », et tout fonctionne toujours comme avant mais cette fonction est encore assez longue. Nous pouvons également réduire la taille de ces deux personnes. Encore une fois, la façon dont vous répartissez cela dépend de vos préférences personnelles. Mais ce que je vais faire, c'est d'externaliser la création « PizzAlist » à une nouvelle fonction et cela pourrait également être utilisé à l'avenir. La section PizzAlist est cette boucle. Nous devons également saisir la liste de commandes unique, laquelle nous stockons cela à l'intérieur, donc copiez ceci et également la boucle. Ensuite, créez notre fonction et juste au-dessus de « CreateListOfPizzas ». Je voulais juste prendre les pizzas. Ensuite, « Coller » dans notre nouvelle section. Assurez-vous simplement que la section correcte est collée à l'intérieur, c' est-à-dire notre liste non ordonnée, suivie de nos quatre boucles de chaque boucle. Dans un moment où nous aurons l'occasion d'appeler cette fonction. N'oubliez pas que cela va prendre toutes nos pizzas, donc nous n'avons pas besoin de cette section de commande. Nous pouvons appeler directement nos pizzas et c'est variable. Maintenant, nous pouvons appeler cette fonction à partir de l'endroit où nous venons de couper ce code.Le nom de la fonction était « CreateListOfPizzas ». Cela doit être passé toutes les pizzas pour cette commande, que nous pouvons d'abord récupérer de notre commande et chaque commande a la propriété de pizzas. Comme nous l'avons fait ci-dessous, nous devons stocker cela à l'intérieur d' une variable et retourner quelque chose pour notre fonction. La chose dont nous devons revenir à la toute fin, c'est notre « Pizzalist ». La valeur renvoyée peut ensuite être stockée à l'intérieur d'une constante. Si nous appelons cela constant « PizzAlist ». Il s'associe également parfaitement à notre nom de variable que nous avons utilisé auparavant, qui est ensuite ajouté à notre « OrderWrapper ». Donnez-lui un « Sauvegarde » et essayez-le, « Rafraîchir » et toutes les commandes fonctionnent toujours comme prévu. Les fonctions de refactorisation comme celle-ci ne sont peut-être pas toujours faites pour vous et vous pouvez décider jusqu'où vous voulez aller. Rien ne change en ce qui concerne la façon dont le projet fonctionne. Nous ne voyons toujours que les commandes à l'écran, mais nous avons maintenant trois fonctions claires avec une tâche spécifique. Nous avons tout en haut, « CreateListOfPizzas », qui revient de cette fonction. Cette liste de pizzas est ensuite ajoutée au DOM lorsque nous créons notre commande unique et une « commande unique » est ensuite bouclée dans notre dernière fonction , puis ajoutée au DOM. 27. Fonction d'aide d'élément: Un autre refacteur que nous pouvons faire pour nous sauver beaucoup de code est de regarder ce que nous répétons actuellement dans nos fonctions et de voir s'il existe un moyen de l'externaliser dans une fonction réutilisable. Si nous examinons notre code à ce stade précoce, et que nous passerons à la fonction CreateListOfPizzas. Nous avons déjà certaines choses que nous répétons actuellement. Nous répétons la création de ces éléments en trois étapes. Fait partie de la quantité. Nous créons un élément de span. Nous créons le TextNode, puis nous fusionnons ces deux-là ensemble. Nous faisons de même pour notre PizzaName. Nous sommes en train de créer un élément. Nous créons un TextNode pour le contenu, les fusionnons ensemble, nous allons un peu plus loin pour créer SingleOrder. Nous faisons également une chose similaire ici, nous créons notre élément de texte, qui se trouve dans un wrapper de niveau 4. Nous créons le contenu, puis nous les ajoutons ensemble, et tout va bien. C'est quelque chose que nous devons faire pour créer nos éléments. Pour chaque fois que nous créons un nouvel élément dans l' une de ces fonctions, il s'agit d'un processus en trois parties qui prend trois lignes de code. Ce serait bien de créer une fonction d'assistance pour réduire la quantité de code, et ce sera la tâche de cette vidéo. Nous allons créer une fonction d'assistance qui va prendre le nom de l'élément. Il s'agit de la section Créer des éléments. Vous allez prendre en compte le contenu, qui est le TextNode, les fusionnera ensemble, ce qui est généralement notre troisième ligne, puis nous retournerons ce nouvel élément à l'appel de notre fonction. Mettons-nous au travail. Créez une nouvelle fonction qui va vous aider avec cette fonction appelée BuildElement. BuildElement doit également prendre en compte deux choses. Il doit prendre le nom des éléments tels que le h4 et aussi le contenu qui s'y trouve. transmettrons cela lorsque nous appelons cette fonction, et la première sera ElementName et la seconde est ElementContent. L'intérieur de la fonction va être assez familier d'après ce que nous avons déjà fait, et en fait, nous pouvons copier n'importe lequel de ces exemples. Résolution de création d'un seul ordre. Disposez des trois lignes de code où nous créons l'élément, nous créons le contenu et nous les fusionnons ensemble. Si vous le souhaitez, nous pouvons copier les trois lignes, les coller à l'intérieur. Ensuite, nous devons rendre cela un peu plus générique. En commençant par la première constante. C'est pour l'élément. Le second concerne le contenu, puis à l'intérieur de ces deux crochets, nous pouvons transmettre les données qui sont transmises à toutes les fonctions. Le premier concerne ElementName et le second, nous pouvons supprimer ce que nous avons actuellement , placé dans ElementContent. Modifiez les noms des variables. Celui-ci sera Element.AppendChild, transmettant le contenu à cet élément. La dernière chose que nous devons faire, nous sommes en train de créer un élément. Nous devons également le renvoyer de notre fonction, il est accessible dans notre code. Retourne les éléments complets une fois qu'ils ont été fusionnés, et cette fonction peut maintenant remplacer l'une de ces trois lignes de code qui crée un élément. Si nous saisissons le nom de notre fonction ainsi que les crochets avec le contenu, nous pouvons maintenant remplacer n'importe laquelle de ces sections juste au-dessus. Nous commencerons par CreateSingleOrder, pour tous les éléments du numéro de commande, le numéro de commande, puis la troisième ligne qui fusionne les deux ensemble. Je vais remplacer cela par notre fonction ElementName. Il s'agit d'un h4. Pour le contenu, nous pouvons le remplacer par exactement le même contenu que celui que nous avons utilisé juste au-dessus. Prends ça et colle ça à l'intérieur. Gardez notre nom cohérent puisque nous utilisons actuellement une constante appelée OrderNumberel, et nous y accédons juste ci-dessous, devons également stocker cela à l'intérieur d'une constante portant le même nom. ce qui se passe ici, c'est que nous construisons nos éléments à l'intérieur de notre nouvelle fonction. Nous le renvoyons ensuite de la fonction, qui est ensuite stockée à l'intérieur de cette constante, que nous pouvons ensuite utiliser dans le reste de notre code, juste en dessous. Si vous le souhaitez, nous pouvons supprimer les lignes de code existantes gratuites, puis passer à notre première fonction, CreateListOfPizzas. Nous avons les trois lignes juste ici. Je vais commenter cela afin que nous puissions l'utiliser comme référence. Nous devons passer notre fonction BuildElement, en transmettant nos deux valeurs. La première valeur est notre portée. Le second copiera notre littéral de gabarit . Maintenant, c'est dans. Aussi pour cela en bas, nous avons utilisé dans le nom constant d'origine de l'élément OrderQuantity. Nous pouvons le copier et le stocker dans la valeur de retour. Supprimez ces trois lignes si vous le souhaitez. Ensuite, le nom de la pizza. Ces trois lignes sortent. Nous allons créer notre constante, qui est le même nom que PizzaNameel. La fonction Order est également prise dans un élément span, et le contenu est pizza.name. Enlevez-les. Les deux sont les mêmes, il faut juste que nous changions. Celui-ci devrait être le PizzaNameel. Nous allons amener celui-ci. Bien. Maintenant, sauvegardons cela et revenons sur le navigateur et nous pouvons tester. Tout fonctionne toujours bien. sautant dans la console, nous ne voyons aucune erreur à l'intérieur d'ici. Notre barre latérale affiche les commandes générées sur la droite. Nous avons les numéros de commande, les noms des pizzas et aussi les quantités. Tout cela semble maintenant fonctionner correctement, et j'espère que vous pourrez voir les avantages de faire des choses comme celle-ci. Même si notre fonction a pris quelques lignes de code, chaque nouvel élément que nous créons réduira trois lignes de code en une seule. Nous pouvons également l'utiliser de nombreuses autres fois dans le futur pendant notre projet pour enregistrer encore plus de code. Il ne s'agit pas seulement de lisibilité et d'organisation. Une seule ligne comme celle-ci signifie moins de risques d'erreurs de frappe, ainsi qu'une augmentation de la vitesse à mesure que notre programme augmente. 28. Sélection De L'ordre En Cours: Nous avons quelques ordres sur la droite, et bientôt nous en créerons de nouveaux au hasard. Juste avant de passer à ce sujet, je veux vous montrer comment les choses vont fonctionner afin que vous puissiez imaginer ce que nous allons faire. Une fois le jeu commencé, nos commandes commenceront à apparaître sur la droite. Le chef qui est le joueur cliquera ensuite sur un ordre pour commencer à travailler, qui déplacera ensuite cet ordre dans la section Travail sur. C'est sur cette section que nous allons nous concentrer maintenant. Plus tard, nous irons encore plus loin en cliquant sur une pizza particulière dans la section « Travailler sur ». Ensuite, cela affichera la méthode et la définira également comme la pizza actuellement à l'intérieur de la cuisine. Maintenant, nous pouvons simplement nous concentrer sur le fait de cliquer sur une commande et de la déplacer dans la section Travail sur. Comme vous l'avez peut-être deviné, pour ce faire, nous allons créer une nouvelle fonction juste au-dessus de notre liste de création de commandes. Il s'agit d'une nouvelle fonction appelée SelectCurrentOrder. Pour appeler cette fonction, nous devons écouter un clic sur l'une de ces commandes. Pour ce faire, nous devons passer à notre fonction CreateSingleOrder. Si nous examinons cette section, nous devons ajouter un écouteur d' événements à chacune de ces commandes. Nous pouvons cliquer dessus, puis déplacer cet ordre dans la bonne section. Juste en dessous de l'endroit où nous ajoutons cette classe. Prenez l'emballage de commande, qui est la div entourant chacune de ces commandes. Ajoutez un écouteur d'événements. Cela va maintenant écouter un clic qui déclenchera notre nouvelle fonction appelée SelectCurrentOrder, nous donne le test en effectuant un journal de console à l'intérieur de notre nouvelle fonction. Transmettez les informations de l'événement afin que nous puissions obtenir les éléments corrects sur lesquels on clique. Ensuite, nous enregistrons cela avec e.target. Jetons un coup d'œil à cela dans la console. Ce que nous devons maintenant faire, c'est cliquer sur l'une de nos commandes. Vous voyez la Margherita. Nous voyons le jambon et l'ananas. Ce n'est pas exactement ce que nous voulons. Nous pouvons cliquer sur n'importe quel numéro de commande, n'importe lequel dans le contenu. Mais ce que nous voulons faire, c'est de rendre l'ensemble de la section de commande active pour qu'il ne s'agisse que d'une seule zone cliquable. Mieux comprendre cela, passons dans l' onglet Eléments et jetons un coup d'œil. Maintenant, nous allons passer dans la section de côté qui contient nos commandes et cliquer sur l'une de ces divs avec la classe d'emballage de commande. Ce que nous voulons, c'est pouvoir uniquement cliquer sur cette div avec la classe d'enveloppe de commande et ignorer tous les clics qui se trouvent sur les éléments imbriqués. Pour ce faire, vous pouvez maintenant écouter un clic sur l'un de ces éléments imbriqués, tels que les éléments de la liste ou l'en-tête de niveau quatre. Montez ensuite l'arborescence des éléments jusqu'à ce qu'il trouve la première div avec la classe d'emballage de commande. Pour ce faire, nous pouvons écouter exactement quel élément a été cliqué, comme la liste non ordonnée. Ensuite, nous pouvons continuer à remonter la chaîne pour vérifier si l'élément parent est cet emballage de commande. Il existe plusieurs façons de le faire. Nous pourrions stocker une référence à l'élément enfant sur lequel on a cliqué, comme notre liste non ordonnée. Ensuite, nous pouvons continuer à vérifier à l'intérieur de cette boucle si l'élément parent est cet emballage de commande. Ou un moyen simple consiste à utiliser une méthode d'élément appelée la plus proche. La méthode la plus proche prendra un élément tel que celui sur lequel nous cliquons. Ensuite, il va continuer à grimper vers la racine du document à travers tous les nœuds parents jusqu'à ce qu'il atteigne une correspondance de sélecteur. Le sélecteur peut être une classe, un ID, un nom d'élément. Tout comme nous pouvons le faire avec le sélecteur de requêtes. Jetons un coup d' œil à la façon de faire cela dans notre fonction. abord, nous allons commencer une référence à nos éléments sur lesquels on clique, c'est-à-dire e.target. Ensuite, nous trouverons les éléments parents les plus proches avec cette classe d'enveloppe de commande. Nous pouvons le faire en accédant à l'élément sur lequel on clique, appelez la méthode appelée la plus proche. Eh bien, nous passons à la requête que nous recherchons. Dans notre cas, nous voulons rechercher l'order_wrapper. Comme il s'agit d'une classe, nous ajoutons le point en tant que préfixe. C'est à l'intérieur d'une constante appelée OrderWrapper. Ensuite, nous pouvons vérifier cela en connectant cela à la console. Maintenant, si nous nous actualisons et que nous pouvons essayer de cliquer sur l'une de ces commandes. Assurez-vous que l' onglet Console est sélectionné. Si nous essayons de cliquer sur quoi que ce soit à l'extérieur, nous ne voyons rien dans la console qui est attendu par le titre de pizza. Cela revient vers l'emballage de commande des parents. Nous pouvons ouvrir cela et vérifier qu'il s'agit de la commande 1. Essayons une autre chose. Il s'agit de l'ordre 3 et de l'ordre 2. Bien maintenant, quelle que soit partie de la commande sur laquelle nous cliquons, elle monte toujours jusqu'à l'emballage de commande des parents, pour saisir le contenu complet de cette commande. En utilisant cette méthode, si aucune correspondance n'est trouvée, nous récupérerons une valeur nulle. Nous pouvons également vérifier cela avant d'ajouter notre commande dans la section Travailler sur. Juste en dessous de l'endroit où nous sélectionnons notre emballage de commande, ajoutez une déclaration if où nous passons dans notre emballage de commande, nous pouvons vérifier si ce n' est pas égal à null. Si nous avons réussi à cliquer sur un emballage de commande, nous devons maintenant récupérer cet emballage de commande et déplacer dans notre section Travail sur. étape 1 consiste à saisir une section de travail et à stocker à l'intérieur d'une constante appelée OrderDiv. Cela équivaut à document. QuerySelector, et le sélecteur de requêtes dont nous avons besoin comme idée de travailler. Ensuite, en utilisant l'ajout d'un enfant, nous pouvons ajouter notre emballage de commande. L'OrderDiv. AppendChild passe dans notre enveloppe de commande sur laquelle on a cliqué. C'est génial, essayons ça . Nous pouvons fermer la console et essayer n'importe laquelle de ces commandes. Essayons le numéro 3 et cela apparaît maintenant dans les sections puisque nous l'avons ajouté en tant qu'éléments enfants Ordre 2, Ordre 1, et tout cela fonctionne très bien. Cependant, nous voulons uniquement pouvoir travailler sur une seule commande à la fois. Nous avons besoin d'un moyen de vérifier s'il n'y a qu'une seule commande sélectionnée et passée dans cette div. Une façon de procéder consiste à accéder d' abord à la section Working on et nous pouvons vérifier quels éléments enfants sont imbriqués à l'intérieur. Voyez qu'il est préférable de saisir une référence à notre div place à l'intérieur d'un journal de console. Ensuite, nous pourrons enchaîner sur le bout. Les enfants. Sautez dans la console. Cliquez sur l'une de nos commandes pour l'ajouter à la section. Si nous regardons de près, la première chose que nous avons est une collection HTML avec un en-tête de niveau 3. Après cela, nous avons notre div avec la classe d'emballage de commande, que nous venons d'ajouter. Nous pouvons également le confirmer si nous accédons à notre page d'index qui fonctionne sur la section ne comporte qu' un seul titre de niveau 3. Dans cette optique, le nombre d' éléments enfants peut désormais être utilisé pour arrêter la fonction. Si le nombre d' éléments enfants est supérieur à un est-à-dire que nous avons notre en-tête de niveau 3 suivi de l'une de nos commandes, nous pouvons le refaire dans notre fonction de commande actuelle sélectionnée. Supprimez le journal de la console, remplacez-le par une instruction if. Nous pouvons vérifier si les enfants. la longueur est supérieure à un. Si c'est le cas, nous retournerons simplement modifier cette fonction. Nous pouvons également retirer les accolades courbes et les remplacer par notre déclaration de retour. Essayons ça. Enregistrez et rafraîchissez. Je clique sur le premier ordre, cela fonctionne bien. Maintenant, nous ne pouvons pas ajouter d'autres commandes. La dernière chose à faire, c'est que nous voulons passer de l'ordre dans la section Working on est également de supprimer l'écouteur d'événements. Nous n'avons plus besoin que cette section soit cliquable, nous pouvons donc la supprimer de notre emballage de commande. Nous pouvons le faire juste avant ajouter à notre section div. En accédant aux éléments stockés dans enveloppe de commande appelée RemoveEventListener. L'écouteur que nous voulons supprimer est celui événements de clic suivis de SelectCurrentOrder qui correspond à notre écouteur d'événements. possible, les écouteurs d'événements comme celui-ci doivent être supprimés lorsqu'ils ne sont plus nécessaires. Cela contribue à maintenir les performances , car le navigateur n' a plus besoin d'effectuer une tâche inutile, mais également d'éliminer les comportements inattendus. Ensuite, nous aborderons la sélection de la pizza laquelle nous allons travailler à sur laquelle nous allons travailler à l'intérieur de la cuisine. 29. Définissez La Pizza Actuelle: Regardez le flux de notre projet, nous avons déjà fait la première étape qui consistait à déplacer l' ordre sélectionné sur lequel nous cliquons vers la section Commande dans la section Travailler. Ensuite, nous devons pouvoir sélectionner la pizza sur laquelle travailler en cliquant dessus. Cette pizza sélectionnée doit ensuite apparaître dans la cuisine et afficher la méthode, toutes les étapes pour la créer. Si vous jetez un coup d'œil ici, j'ai créé quelques étapes que nous allons utiliser pour atteindre cet objectif en haut qui est de rendre les noms de pizzas cliquables puis de les déplacer dans la cuisine. Si vous le souhaitez, vous pouvez suivre ces cinq étapes et essayer de recréer cela vous-même ou si vous le préférez, vous pouvez suivre avec moi. Tout d'abord pour pouvoir cliquer sur ces pizzas, étape 1 comprend l' ajout d'une classe de nom de pizza à chacun de ces articles. Passons à la fonction de CreateListOfPizza , nous allons localiser cela. Et c'est là que nous créons chacune de nos pizzas à l'intérieur des éléments de span. Juste avant de procéder à des ajouts, nous ajouterons notre classe en sélectionnant la variable d'élément de nom de pizza. Sélectionnez la ClassList, la méthode appelée add, où, sous forme de chaîne, nous transmettrons le nom de pizza_name. C'est l'étape 1, prise en charge . Allons faire défiler vers le bas. étape 2 consiste à localiser la fonction SelectCurrentOrder. Puisque nous avons peut-être plusieurs pizzas, nous devons sélectionner tous les éléments de span. Et n'oubliez pas que si nous avons plusieurs éléments, nous devons utiliser un QuerySelectorAll. Nous pouvons saisir tous ces éléments en utilisant cette classe de noms de pizza que nous venons d'ajouter. Localisons donc cette fonction SelectCurrentOrder, puis en haut, nous utiliserons QuerySelectorAll pour saisir tous ces éléments de pizza, stocker dans une variable appelée pizzas Document.QuerySelectorAll. Nous pouvons les saisir avec le nouveau nom de classe que nous venons de créer, qui était pizza_name. N'oubliez pas que l'objectif est de pouvoir cliquer sur l'un de nos noms de pizza, comme notre jambon et notre ananas ou tous les pepperoni. Nous pouvons donc maintenant cliquer gratuitement sur n'importe lequel de ces noms. Alors, prenez notre variable, qui est des pizzas. Nous pouvons utiliser FoReach pour exécuter une fonction pour chacun de ces éléments. Chacune des pizzas individuelles stockera sur une variable de pizza, puis nous pourrons ajouter un EventListener à chacune de ces pizzas, donc Pizzas.AddEventListener. L'événement sera un clic, qui exécutera ensuite une fonction que nous n'avons pas encore créée appelée SetCurrentPizza. D'accord ? Créons donc cette fonction en bas, la fonction SetCurrentPizza. Puisque nous déclenchons cela à l'aide d'un événement de clic, nous pouvons également transmettre les informations de l' événement à notre variable et vérifier que cela fonctionne avec un journal de console. Ainsi, pour saisir les éléments sur lesquels vous avez cliqué, comme le jambon et l' ananas ou le pepperoni. Pour saisir le texte, nous pouvons le faire avec e.target dans une propriété appelée InnerText, vérifier si tout fonctionne correctement. Essayons cela, sautons dans la console et rafraîchissons. La première chose à faire est donc de cliquer sur l'une de nos commandes, ouops il y a une erreur sur EventListener. Jetons un coup d'œil à ce qui pourrait causer cela. Nous avons une variable inutilisée, donc cela a juste besoin d'un s, car cela contient plusieurs pizzas. Essayons ça maintenant. Nous pouvons cliquer sur notre commande. Cela fonctionne très bien. Maintenant, si nous cliquons sur le texte du jambon et de l'ananas, nous le voyons dans la console, Pepperoni. Bien, c'est exactement ce que nous voulons. Maintenant, si nous revenons à notre SetCurrentPizza, évidemment, l'objectif n'est pas de l'enregistrer sur la console, ce que nous voulons faire est d' enregistrer le nom de la pizza dans une variable, puis de l'ajouter simplement après notre texte de Current making. Si nous sautons dans la page d'index et que nous localisons cette section, nous pouvons voir juste après que nous avons une plage avec l'ID de current_pizza. Nous allons donc stocker ce texte dans une variable, puis le placer dans cette période. Faisons cela à l'intérieur de notre fonction avec un journal de console et stockons cela à l'intérieur d'une constante appelée PizzaName. Saisissez notre zone d'étendue avec Document.QuerySelector. Utilisez #, car il s'agissait de l'ID de current_pizza. Définissez l'InnerText pour cet élément égal à notre variable ci-dessus. Essayons ça. Nous n'avons plus besoin de la console. Déplacez l'une de ces commandes vers la section Travailler sur. Cliquez sur « Pepperoni » et voici notre texte « Jambon et ananas » ainsi que la « Margherita ». Ensuite, nous allons utiliser cet élément sélectionné pour afficher les étapes requises à l'intérieur de la section Méthode. 30. Méthodes de partage et de participation: Auparavant, nous avons défini le nom actuel de la pizza à l'intérieur de la cuisine lorsque vous avez cliqué dessus. Nous allons maintenant afficher la méthode de fabrication de cette pizza à l'intérieur de la section Méthodes. La méthode consiste en toutes les étapes nécessaires à la création de chaque pizza. Nous avons ceci en haut de notre fichier JavaScript. À l'intérieur de notre page d'index, nous pouvons accéder à tous les tableaux de pizzas, et il y a le nom de pizza que vous avez déjà utilisé, ainsi que la méthode. Si nous prenons cette méthode Margherita comme exemple, il y aura trois étapes. La première consiste à rouler la pâte, la seconde consiste à ajouter la sauce et la troisième est garnie de fromage. Nous allons valider que le chef a terminé les étapes ultérieurement en utilisant les étapes requises, mais pour l'instant, tout ce que nous voulons faire est de nous concentrer sur affichage de cette méthode à l'intérieur du navigateur. Comme vous pouvez le constater, cette méthode n'est une seule chaîne de texte, et ce que nous allons faire dans cette vidéo, c'est de diviser chacune de ces étapes pour les afficher dans le navigateur. Nous avons donc besoin de l'étape 1, de l'étape 2 et de l'étape 3 pour les afficher de manière formatée. Pour ce faire, nous pourrions passer à notre fonction pizza actuelle, mais pour garder les choses plus propres et plus abstraites, je vais créer une nouvelle fonction en bas. Plongez jusqu'au fond de notre projet. Il s'agit d'une nouvelle fonction appelée DisplayMethod. Cela va également devoir saisir nom de la pizza afin que nous sachions quelle méthode nous devons obtenir, alors transmettez-le dans notre fonction, et nous devons appeler cette fonction chaque fois que nous définissons la pizza actuelle, dire, cette fonction juste au-dessus lorsque nous cliquons sur la pizza, et cela est affiché à l'intérieur d'ici. Lorsque vous cliquez dessus, nous savons sur quelle pizza devra travailler. C'est logique d' appeler notre fonction de l'intérieur de là. Faisons ça. Nous appellerons notre fonction, qui est DisplayMethod, et n'oubliez pas que cela doit également prendre en compte le nom de pizza actuel, que vous avez stocké à l'intérieur de cette variable. Vers notre page d'index, il y a déjà une section appelée méthode, que vous pouvez voir ici. Ceci a l'ID de la méthode un niveau 3 en haut, puis nous avons deux sections. Nous avons le nom de la pizza suivi la méthode que nous allons bientôt insérer. Comme vous pouvez l'imaginer, c'est la section avec laquelle nous allons travailler. Nous pouvons commencer par la première section qui est le nom de la pizza. notre fonction, nous avons déjà le nom de la pizza afin que nous puissions utiliser documents.querySelector ('nom_pizza_') .innerHTML qui aurait vu que le contenu du texte intérieur sera égal à notre variable, qui est PizzaName. Avant d'aller plus loin, essayez-le dans le navigateur, j'ai besoin de rafraîchir et de passer une commande dans la section Travail sur. Cliquez sur « Pizza » et nous pouvons voir notre nom de pizza ici. Cela est également mis à jour lorsque nous cliquons sur différents. La prochaine étape de notre page d' index consiste à saisir notre méthode de pizza et à placer une méthode à l'intérieur d'ici. N'oubliez pas que notre objet pizza possède cette propriété de méthode à laquelle nous pouvons accéder, et pour le trouver, nous pouvons utiliser la méthode Erase find est find méthode que nous pouvons utiliser pour filtrer ce particulier porté par le nom de pizza que nous avons déjà, puis nous pouvons sélectionner la méthode pour chacune d'elles. Retour à notre fonction méthode bravo full pizzas array, qui est trouver, et trouver va exécuter une fonction pour chaque valeur à l'intérieur de notre tableau de pizzas, et vous pouvez placer une fonction irrégulière si vous le souhaitez, mais comme cela va être une simple déclaration, je l'ajouterai sur sa propre ligne avec une fonction flèche. Cette fonction va prendre en compte la pizza individuelle, puis accéder au nom de chaque pizza sur la boucle, et nous pouvons vérifier si cela est égal à notre nom de pizza, qui est transmis à cette fonction. Le nom de pizza cliqué actuel est égal à n'importe lequel de nos noms de pizza dans le tableau Nous stockerons cette pizza sélectionnée à l'intérieur d'une variable ou d'une constante appelée SelectedPizza. Ensuite, nous allons faire un journal de la console et vérifier que tout fonctionne bien, la constante de SelectedPizza, et nous allons le rafraîchir dans le navigateur. Je saute à la console. d'abord, cliquez sur « Oder », sélectionnez l'une des pizzas. C'est du jambon et de l'ananas, et nous pouvons voir que l' objet complet parmi les ananas a été retourné. Essayons encore une fois. Le pepperoni. Super, donc tout fonctionne et nous pouvons maintenant filtrer cela pour ne renvoyer que la méthode. Essayez encore une fois. Les étapes dont nous avons besoin à l'intérieur, et elles sont différentes pour chacune d'elles. Excellent, donc cela renvoie maintenant une chaîne de texte, et nous devons diviser cette chaîne et afficher chaque étape en tant qu'élément de liste. Pour cela, JavaScript dispose d'une méthode de chaîne intégrée appelée split, dont les chaînes héritent par le biais de la chaîne prototype. Cette méthode va prendre notre chaîne unique, que nous avons maintenant, divisera à un certain point que nous spécifions, puis retournera un nouveau tableau contenant toutes ces sous-chaînes. C'est comme ça que cela se présente dans notre code. C'est notre méthode, donc nous pouvons simplement supprimer ceci de la chaîne de journaux de la console à la fin, la méthode de partage JavaScript, et nous voulons passer dans quelle section de la chaîne nous voulons diviser cette part, et ensuite dans notre cas, un arrêt complet est idéal, et c'est parce que si nous regardons notre corde, chacune de ces étapes que nous avons finit par un arrêt complet. C'est parfait pour briser notre chaîne, et rappelez-vous que cela retournera un nouveau tableau, que nous pourrons stocker à l'intérieur d'une constante. Enfin, avant d' aller plus loin, nous allons faire un journal de console qui transmet notre constante, qui est MethodSteps. Essayons ça. Sélectionnez une commande, sélectionnez la pizza et cela renvoie maintenant un nouveau tableau avec toutes nos étapes en place. Nous pouvons également faire le contraire si nous le voulions, c'est-à-dire prendre un tableau de valeurs comme nous l' avons trouvé ici et les convertir en une seule chaîne. Nous pouvons le faire avec la méthode appelée join. N'oubliez pas que MethodSteps est un tableau. Nous pouvons faire l'inverse en passant la méthode de jointure. Join se compose d'une seule chaîne. Nous pouvons tester cela en cliquant sur une pizza. Faites revenir une chaîne unique vers et chaque valeur est séparée par une virgule. Si nous le voulions, nous pourrions changer ce séparateur pour qu'il s' agisse d'un autre personnage, tel qu'un tiret. Essayez-le. Maintenant, il y a un tiret entre chacune de ces valeurs. Cela est utile si vous devez joindre un tableau de valeurs en une seule chaîne. Nous savons maintenant que nous pouvons parcourir les tableaux et faire quelque chose avec chaque valeur, et dans le code HTML, nous avons défini le nom de la pizza avec cette section ici, et l'étape suivante consiste à saisir Votre deuxième plongée avec l'id de PizzaMethod. Je place nos valeurs de tableau. Prenez ceci avec Documents.QuerySelector ('#pizza_method') .HTML interne et ici je vais juste définir cela pour qu'il soit égal à une chaîne vide. Si une méthode a déjà été définie précédemment, nous pouvons l'effacer avant d'ajouter notre nouvelle méthode. Ensuite, nous énumérerons nos étapes en saisissant notre tableau, qui est MethodSteps. Puisque vous avez plusieurs valeurs, nous parcourrons chacune d'entre elles avec une boucle pour chaque boucle, qui exécute une fonction pour chaque valeur. Nous pouvons résoudre chacune de ces valeurs dans la variable appelée méthode. Construisez ensuite nos éléments. Installez cela à l'intérieur d'une constante appelée éléments. Nous avons documents.CreateElements ainsi les éléments que vous souhaitez créer. Je vais choisir un élément p, et ensuite le contenu du texte, Document.CreateTextNode, et le contenu que vous souhaitez transmettre est le texte de notre méthode. Placer dans la méthode à l'intérieur fusionne Elements.AppendChild passant dans notre texte. La dernière étape consiste à saisir à nouveau notre section Méthode de pizza. Nous allons donc copier ceci, coller cela dans, puis nous pourrons l'ajouter à l'aide l'AppendChild en passant nos éléments. Nous allons enregistrer cela et actualiser, sélectionner une nouvelle commande. Pepperoni. On y va. Il y a notre titre de pizza ainsi les étapes requises pour chacune des pizzas. Bien. Tout cela fonctionne maintenant et a l'air bien. Il n'y a qu'un petit facteur que nous pouvons faire. N'oubliez pas que nous avons créé un nouvel élément de texte juste ici, mais nous avons également une fonction d'assistance appelée BuildElements, qui prend en compte le nom de notre élément, le contenu et la valeur nouvellement construite. Revenons à notre boucle. Nous pouvons stocker cela à l'intérieur d' une constante appelée étapes. Cette valeur est égale à la valeur renvoyée de notre fonction BuildElement. Passer les éléments p. Ensuite, le contenu, qui est la méthode que nous allons déplacer ces trois lignes suivantes et passer dans nos étapes. Essayons cela, sélectionnez une nouvelle commande. Tout cela fonctionne exactement de la même manière, mais nous avons enregistré quelques lignes de code. C'est une autre bonne étape pour notre projet, et si vous êtes un débutant, je sais que cela peut se passer beaucoup ici, mais ce qui est important à retenir, c'est que nous avons déjà couvert la majorité des ce que nous faisons ici. C'est juste le cas de la décomposer en tâches plus petites, s' assurant que chaque étape fonctionne en cours de route. 31. Ajouter Des Pizzas Au Four: La dernière étape du déplacement de cette pizza est de la déplacer de la cuisine à notre four. Nous n'avons pas encore créé la pizza, mais nous examinerons bientôt comment procéder tout en vérifiant que nous avons utilisé les bons ingrédients. Mais pour l'instant, nous pouvons utiliser ce nom de pizzaName que nous avons et le déplacer jusqu'à la section du four. Maintenant, notre four va être un réseau pour stocker plusieurs pizzas, nous aurons également besoin d'autres variables. Créons ces deux fonctions bien en haut, et juste en dessous de nos ingrédients, créons notre four avec le mot-clé let, qui sera au départ un tableau vide. Après cela, nous devons définir le nombre maximum de pizzas qui s'adapteront à notre four, c'est-à-dire le fourCapacité. Je vais aller pour une valeur de six. Ensuite, nous devons suivre les pizzas que nous avons préparées pour une commande particulière. Si vous prenez l'Ordre 3 par exemple, il est écrit quatre pizzas, Ordre 2 a trois pizzas et nous devons garder une trace du nombre que nous avons fabriqué actuellement. laissez Pizzas Completedfor Order, qui sera initialement zéro. Maintenant que nous en disposons, nous pouvons créer notre première fonction qui sera utilisée pour pousser la pizza vers notre nouvelle gamme de fours. En bas, créez une fonction appelée AddToOven. Pour l'instant, ce four va prendre le PizzaName actuel. Nous pouvons le récupérer dans notre cuisine si nous allons sur notre page d'index. Jusqu'au coin cuisine, rappelez-vous que nous avons cette plage avec l'ID de current_pizza, et cela stocke notre nom de pizza. Saisissez cela avec Document.QuerySelector ID, qui est current_pizza. Ensuite, InnerText. Stockez-le à l'intérieur d'une constante appelée PizzaName. N'oubliez pas que nous n'avons pas toujours une pizza sélectionnée. Actuellement, nous avons la valeur du jambon et de l'ananas, mais si nous rafraîchissons , cet élément est souvent vide. Pour vérifier cela, nous allons placer une déclaration if. Nous pouvons vérifier si le PizzaName est présent. Si c'est le cas, nous ajouterons cela au four avec la méthode array appelée push, transmettrons le PizzaName puis un journal de console temporaire pour vérifier que tout fonctionne. Voyons la console, sautons dans le navigateur. Nous pouvons vérifier ce journal juste une seconde, mais nous devons d' abord appeler cette fonction. Nous appellerons cette fonction en ajoutant un écouteur de clic au bouton que nous avons déjà, qui se trouve à l'intérieur de notre section cuisine et juste en dessous de notre pizza actuelle. Disposez de ce bouton pour AddToOven. Il possède actuellement une classe, mais nous pouvons ajouter un ID. Sélectionnez cet AddToOven , puis saisissez ce four dans notre script. Documents.QuerySelector, la valeur ID de AddToOven, puis nous pouvons ajouter un écouteur d' événements. L'écouteur d'événements écoutera un clic sur ce bouton, qui exécutera une fonction appelée AddToOven. Nous allons essayer ça. Avec la console ouverte, cliquez sur l'une de nos commandes. Sélectionnez la pizza. Actuellement, nous prenons du jambon et de l'ananas, et déclenchez notre auditeur de clic avec four et nous voyons que le jambon et l'ananas sont poussés à la liste. Nous allons essayer le pepperoni. Cliquez dessus, et encore une fois, cela continue d'ajouter des pizzas à notre four. Super. Maintenant que nous savons que cela fonctionne, nous pouvons l'étendre un peu en ajoutant un PizzaName au four. Actuellement, nous ne voyons que l'intérieur de la baie, mais nous devons également le lister dans la section four. En plus d'énumérer le PizzaName, nous pouvons également définir l'heure qui a été mise dans le four. C'est parce que plus tard, nous ajouterons également un temps de cuisson. Pour cela, créez un nouvel objet et nous le faisons à l'intérieur de nos déclarations if. Juste au-dessus de l'endroit où il pousse vers le four, nous allons créer un objet appelé PizzaForOven. La première propriété est PizzaName qui est stockée dans la variable PizzaName, que vous possédez déjà, puis une propriété appelée TimeAdded. Pour l'instant, une simple valeur de place-holder est bonne, nous y reviendrons plus tard. Pour l'instant, la dernière étape consiste à mettre la constante de pizza au four dans notre méthode de poussée. Juste avant de tester cela, n'oubliez pas que nous avons ajouté une variable appelée PizzasCompletedForOrder. Nous pouvons augmenter cette valeur d'une valeur de 1. Il suffit de vérifier que tout fonctionne à l'intérieur de la console. Nous avons une pizza, ajoutez-la au four et il y a notre nouvel objet. Le four est maintenant en train d'obtenir les pizzas comme on peut le voir. Ensuite, une fonction pour parcourir cette baie et les afficher dans la section four. Juste après avoir poussé notre nouvelle pizza au four, nous allons appeler une nouvelle fonction appelée DisplayOvenItems. Nous l'appelons chaque fois que nous créons une nouvelle pizza et l'ajoutons au four, ce qui va mettre à jour l'interface utilisateur. Nous n'avons pas encore créé cela, alors ajoutons cela juste au-dessus. Pour commencer à l'intérieur de la page d'index, nous devons saisir notre section four et si nous regardons un peu notre code, nous avons l'emballage de four qui a le titre de niveau 3 , puis cette div vide avec l'ID du four, et c'est ici que nous ajoutons nos nouvelles pizzas. Nous pouvons saisir ce document.QuerySelector, l'ID du four, puis nous allons d'abord définir une chaîne vide. Cela nettoie notre four avant de le mettre à jour. Enveloppez notre réseau de fours, et comme ce n'est pas un tableau, nous pouvons utiliser FoReach. Nous exécutons une fonction pour chaque valeur à l'intérieur de là, chaque valeur sera une pizza particulière que nous envelopperons dans une div. const PizzaDiv est incroyablement similaire à Document.CreateElement, crée notre section div. Nous ajouterons une classe à cela pour notre style, donc Pizzadiv.className est égal à pizza_div. N'oubliez pas qu'à l'intérieur de nos fichiers de démarrage, nous avons également une image SVG pour notre pizza. Il sera utilisé pour afficher à l'intérieur du four chaque fois que nous ajoutons une nouvelle pizza au four. Ce que nous pouvons faire, c'est que nous allons traiter cela comme une image ou créer un nouvel élément d'image. Nous avons Document.CreateElement, les éléments d'image avec IMG. Ensuite, nous pouvons définir la propriété source pour qu'elle soit égale à notre SVG. Celui-ci s'appelle pizza.svg, et il se trouve également dans le même dossier mais nous pouvons y référencer par son nom. Nous avons un emballage avec un cours, nous avons une image, nous aurons également besoin du nom de la pizza. Pour ce faire, nous pouvons utiliser notre fonction appelée BuildElement pour créer ces photos et stocker la valeur de retour dans une constante appelée PizzaName. Notre fonction d'assistance, qui est BuildElement, il peut s'agir d'un élément p et puisque le PizzaName sera une variable, nous l'insérerons dans les coches arrière, avec tout le symbole et ensuite calibrez cela et n'oubliez pas que chacun de nos articles de four est stocké dans cette variable de pizza afin que nous puissions accéder à la pizza ou au nom. Ce sont tous les éléments dont nous avons besoin. Maintenant, il ne s'agit que de les ajouter à notre emballage PizzaDiv. Nous allons sélectionner cette PizzaDiv. Nous pouvons utiliser append pour ajouter plusieurs valeurs, ajouter une nouvelle image sur PizzaName. La dernière section est maintenant ajoutée à notre four. Comme ci-dessus, nous utiliserons QuerySelector pour saisir notre four, AppendChild, en le plaçant dans notre PizzaDiv. Cela se passe un peu là, mais rafraîchissons et testons tout cela fonctionne. Placer dans un nouvel ordre, sélectionner la pizza, ajouter le pepperoni au four. Voici notre image que nous avons créée ici, ainsi que notre nom de pizza ci-dessous, jambon et ananas. Super, et tout cela fonctionne maintenant. Comme mentionné précédemment, nous devons encore revenir pour créer réellement des pizzas, mais nous savons maintenant que cette étape est prête quand nous le faisons. 32. Commencer Et Terminer Le Jeu: Cette leçon, j'ai résolu quelques étapes pour essayer les choses vous-même. Ce que nous visons à couvrir, c'est la création de deux fonctions. Une fonction sera utilisée pour démarrer le jeu et l'autre pour y mettre fin. Ces fonctions vont être appelées à partir de nos boutons HTML, que nous pouvons voir dans notre index. Il s'agit de la section de contrôle du jeu où nous avons nos deux boutons. L'idée derrière ces deux boutons est de nettoyer l'interface utilisateur, ne montrer que les bonnes choses, telles que l'affichage du bouton de fin de jeu uniquement lorsque le jeu est en cours d'exécution. Nous utilisons le bouton Démarrer le jeu pour commencer les commandes qui arrivent et ainsi de suite. Ces fonctions seront également utiles ultérieurement lorsque nous ajouterons à notre projet des éléments tels que les statistiques et les minuteurs. Ce que nous devons faire, c'est d'abord créer nos deux fonctions appelées StartOfGame et EndofGame. Ensuite, nous pouvons les appeler en ajoutant un écouteur d'événements des deux boutons que nous venons de regarder. Nous allons créer une nouvelle variable, qui est lancée, qui sera booléenne. Ce booléen sera vrai lorsque nous commencerons le jeu et faux lorsque nous terminerons le jeu. Nous effectuerons une vérification conditionnelle à l'intérieur de StartOfGame pour revenir à cette fonction si cette variable de démarrage du jeu est vraie. Étape 5, rappelez-vous que toutes les commandes ont cette classe de order_wrapper. Je vais effacer toutes ces commandes dans notre fonction StartOfGame. Puisque nous n'avons pas encore commencé le jeu et CreateOrdersList est responsable de la création de ces commandes. Nous pouvons également déplacer cela à l'intérieur de notre fonction StartOfGame sur le CSS. Lorsque le jeu démarre, nous afficherons le bouton de fin et masquons le bouton d'arrêt, puis ferons l'inverse lorsque la partie est terminée. Sans oublier que notre bouton de fin de jeu doit également être supprimé ou masqué lorsque le jeu se charge initialement. Comme toujours, vous pouvez les essayer vous-même ou suivre si vous préférez. En bas, rappelez-vous que la première étape consiste à créer nos fonctions. La première fonction était StartOfGame. Ensuite, notre fonction EndFGame aussi. Ces deux fonctions doivent être appelées en cliquant sur les deux boutons de notre code HTML. Pour ce faire, nous allons saisir nos boutons de début et de fin, et en ajoutant un écouteur d'événements pour appeler ces fonctions. Ces boutons, à l'idée de bouton de début et de fin. Nous pouvons les saisir maintenant avec le sélecteur document.query. Voici le hash. Tout d'abord, le bouton Démarrer. Ajoutez un écouteur d'événement pour un événement de clic, qui va déclencher une fonction appelée StartOfGame. Dupliquez ceci. Le second concerne l'EndBTN, qui déclenche la fonction correspondante. Déplacez également notre écouteur d' événements par le haut pour les regrouper. En fait, il faut simplement ajouter un écouteur d' événements pour s'assurer que cela est terminé. Ensuite, avant d'aller plus loin, nous pouvons ajouter un journal de console à chacune de ces fonctions pour vérifier qu'elles fonctionnent correctement. Le premier est le début. Le deuxième pour la fin. Ensuite, sautez dans la console. Il suffit de séparer les minutes, donc nous allons juste rattacher. On y va. Retournez dans la console et nos deux boutons en haut. Start déclenche un journal de console et finit également les travaux. C'est l'étape 1 et l'étape 2 prise en charge. La prochaine consiste à créer un booléen lancé par GameStarted. Faisons cela en haut et dans le reste de nos variables. Laissez GameStarted, qui sera initialement faux. Nous pouvons mettre à jour cette variable à partir de nos deux fonctions. Supprimez les journaux de la console et lorsque nous démarrons le jeu, GameStarted sera égal à vrai. Ensuite, à l'intérieur de la fonction EndOfGame, GameStarted sera égal à false. Maintenant, quand, si ce jeu est démarré ou non, il sera vraiment utile et en particulier pour la fonction StartOfGame, nous allons effectuer des travaux de nettoyage tels que la suppression de tout autre jeu existant commandes. Nous ne voulons pas l' utiliser pour lancer accidentellement ce milieu de jeu. Nous pouvons revenir à cette fonction si c'est vrai. Si GameStarted est égal à vrai, nous retournerons tous à cette fonction avant d'exécuter d'autres codes. Après cela, nous pouvons passer à la suppression toutes les commandes du jeu précédent. Prenons nos commandes et stockons cela à l'intérieur d' une constante avec Document.getElementByClassName. Nous utilisons ici le nom de classe car rappelez-vous que nous avons cette classe de order_wrapper. Passez ça entre parenthèses. Ensuite, nous pourrons passer en boucle et supprimer toutes ces commandes. Si nous accédons à l' objet tableau principal avec un A majuscule, nous pouvons alors avoir accès à une méthode appelée de pour créer un tableau à partir de tous ces éléments. Lorsque vous utilisez GetElementsByClassName, une collection HTML sera renvoyée. Ensuite, nous pouvons l'utiliser pour créer un nouveau tableau à partir de ces commandes. La méthode from, passer les ordres. Maintenant, nous avons converti ce tableau en tableau. Nous pouvons utiliser des méthodes de tableau telles que FoReach pour exécuter une fonction pour chacune d'entre elles. En passant la fonction, chaque commande stockera dans la variable de commande. Accédez à cette commande individuelle, puis appelez la méthode JavaScript remove. Cela permet de supprimer ces commandes lorsque nous commençons une partie, mais nous devons également les créer en premier lieu. Actuellement, nous avons une fonction appelée CreateOdersList. Si on fait défiler vers le haut pour trouver ça. Pour obtenir cette fonction, il est responsable de la création de toutes nos commandes. Il serait logique d'appeler cela lorsque le jeu a commencé. Actuellement, si nous effectuons une recherche pour cela, nous pouvons voir que cela est simplement appelé de l'intérieur de notre programme. Au lieu d'appeler cela dès qu'il est chargé, nous allons couper cela à sa place, puis déplacer vers notre nouvelle fonction StartOfGame. Désormais, toutes les commandes ne doivent s' afficher que lorsque l'utilisateur clique sur ce bouton de démarrage. Gardons ça et essayons ça. Maintenant, puisque nous avons déplacé notre appel de fonction, nous ne voyons pas les ordres, comme start. Ils apparaissent maintenant dans la barre latérale. Les commandes s'affichent et nous savons que cet appel de fonction fonctionne correctement. Mais nous ne pouvons pas savoir si les commandes précédentes ont été effacées. Où nous avons utilisé order.remove. Cela n'a pas beaucoup d'importance pour le moment puisque tous les ordres de la même chose. Mais plus tard, nous générerons des ordres aléatoires qui seront différents. titre de mesure temporaire pour tester cela, commentez notre appel de fonction. Ensuite, nous pouvons ajouter des éléments temporaires dans notre code HTML et vérifier qu'il est supprimé. Dans la section de l'ordre des éléments P. N'oubliez pas que tous ces éléments ont la classe order_wrapper placée dans n'importe quel texte à l'intérieur. Maintenant, si nous sauvegardons cela, actualisez, nous pouvons voir toute la course. Cliquez sur Démarrer. Cet élément a maintenant été supprimé. Super, nous savons maintenant que cela fonctionne. Nous pouvons supprimer nos éléments temporaires et rétablir notre appel de fonction. Ensuite, l'étape suivante est les numéros 7 et 8. Il s'agit d'utiliser la propriété style pour afficher et masquer ces deux boutons. Au StartOfGame, en haut de la fonction, utilisez Document.QuerySelector. Saisissez d'abord notre bouton Démarrer. Accédez à la propriété style de l'affichage. Nous pouvons masquer cela en définissant cette valeur comme une valeur CSS nulle. Dupliquer, puis pour le bouton de fin, nous le rétablirons en définissant cette valeur sur Inline. Copiez les deux. Plongez dans la fonction EndFGame et collez-les dans. Nous pourrions alors inverser les valeurs de ces deux éléments. Le bouton d'arrêt s' affiche avec une valeur inline, puis le bouton de fin peut être supprimé sans aucun. Essayons ça. Rafraîchir Cliquez sur Démarrer, et cela supprime le bouton de fin. Cliquez sur Fin et le bouton Démarrer s' affiche. Vous remarquerez également que dès le chargement de la page, ces deux boutons s'affichent. Puisque le jeu n'a pas encore commencé, nous voulons uniquement afficher le bouton Démarrer. Nous allons déplacer cela en définissant la propriété style de l' affichage pour qu'elle soit égale à aucune. Pour cela, nous avons déjà le code comme deuxième valeur à l'intérieur d'ici. Copiez ceci et nous pourrons l' appeler en haut de notre code. N'importe où autour des variables, c'est très bien. Rafraîchir Le bouton de fin a été retiré. Nous démarrons et nous ne voyons que le bouton de fin. Maintenant, je suis dans le jeu. Nous ne voyons que le bouton d'arrêt. 33. Introduction Au Math Javascript: Dans cette section, nous allons poursuivre notre projet Speedy Chef, mais nous allons nous concentrer sur les mathématiques, la date et l'heure pratiques de fonctionnalités proposées par JavaScript. À partir de bientôt, nous allons voir comment utiliser mathématiques JavaScript pour générer des pizzas et des commandes aléatoires. Actuellement, avec ce tableau d' ordres que nous avons, nous ne générons que ces trois mêmes commandes chaque fois que le jeu commence, mais nous pouvons en générer de nouveaux avec plus de hasard. Ces commandes continueront d' arriver au fur et à mesure que le jeu est en cours d'exécution. Nous aurons différentes quantités de pizzas ainsi que différents types de pizzas pour chaque commande. Pour ce faire, nous avons besoin de deux nouvelles fonctions tout en bas. Le premier va s'appeler GeneratNewOrder. Cela sera responsable de la création d' une nouvelle commande avec un numéro de commande. Je vais analyser ça , générer un nouvel ordre. Ensuite, cette deuxième fonction va s'appeler GeneraNewPizza, et GeneraNewPizza créera des pizzas aléatoires, qui seront appelées à partir de notre fonction de commande. Testez cela à l'aide d'un journal de console, en analysant l'objet mathématique JavaScript. Juste avant de pouvoir voir cela, nous devons appeler notre fonction. Alors saisissez ceci, puis appelez cette fonction n'importe où ci-dessous. Rafraîchissez, ouvrez cela, et cela revient beaucoup à l'intérieur d'ici. Nous avons beaucoup de propriétés et de méthodes différentes, et je ne suis pas mathématicien, donc une partie de cela est au-delà de ma connaissance. Mais vous n'avez pas besoin d'être génial en maths pour pouvoir en utiliser une partie. Tout est là pour nous aider. Il existe certaines constantes que nous pouvons utiliser, telles que la valeur de Pi, que vous connaissez peut-être. Nous avons quelque chose appelé Random si nous faisons défiler vers le bas, ce qui est une méthode. C'est ce qui génère un nouveau nombre aléatoire compris entre zéro et un. Nous avons quelque chose appelé Ceil and Floor à arrondir ou à arrondir et nous allons les examiner dans quelques instants. Il existe une méthode pour arrondir au numéro le plus proche. Nous pouvons trouver le plus petit et le plus grand nombre avec min et max, ainsi que beaucoup d'autres. Revenons à la fonction et voyons comment nous pouvons les utiliser. Plongez dans GenerateNewOrder, et juste en dessous de notre journal de console, changeons cela par Math.Random, qui est l'une des méthodes que nous venons de voir dans le navigateur. Essayons ça. Comme mentionné précédemment, cela générera un nouveau nombre compris entre zéro et un. Par conséquent, zéro est inclus, mais la valeur d'un ne l'est pas. Nous allons seulement atteindre la valeur de 0,999 récurrents. Souvent, nous avons besoin que ce nombre soit différent, comme la valeur de 0 à 10, 1-50, 0-100, etc. Pour ce faire, nous ne pouvons analyser dans aucune plage de math.Random. Au lieu de cela, nous devons multiplier cela par le montant que nous voulons le multiplier. Si je multiplie cela par la valeur de 100, cela nous donnera une valeur comprise entre zéro et 99. Rappelez-vous que zéro et un est le math.Random original. Même le fait de multiplier ce 0 par 100 nous donnera toujours 0. Puisque 0,99 est la valeur la plus élevée, multiplier cette valeur par 100 nous donnera la valeur jusqu'à 99. Économisez. Nous laissant des numéros plus importants à l'intérieur de la console. Rangons-le à l'intérieur d'une constante. Je peux extraire ça de notre journal de console, const aléatoire. Ensuite, nous pourrons arrondir ce nombre aléatoire au nombre entier le plus proche. C'était un exemple. Plutôt que d'obtenir 53,4, nous pouvons arrondir cela à 54. Nous le faisons en accédant à l'objet mathématique JavaScript, une méthode que nous venons de voir à l'intérieur de la console appelée un ceil, où nous analysons nos constantes aléatoires. Maintenant, chaque fois que nous actualiserons cela, il arrondit cela au nombre entier le plus proche. Nous avons eu beaucoup de chance là-bas parce que nous avons la valeur de 100 dans la console. Cela est dû au fait que la constante aléatoire d' origine nous donnera un nombre tel que 99,9. Ensuite, cela arrondira ce montant à 100. Avec cet arrondi, tous les nombres commençant par zéro seront arrondis à un. Cela devrait nous donner un chiffre compris entre 1 et 100. Nous pouvons arrondir en changeant de plafond en plancher. Mais vous ne remarquerez pas beaucoup de différence à l'intérieur de la console. Mais cela sera arrondi plutôt que d'arrondir même un nombre entier compris entre 0 et 99. Également mentionné lorsque nous avons regardé l'objet mathématique, il y avait les méthodes min et max dans la console. Commençons par trouver la plus grande valeur numérique. Pour ce faire, nous allons créer une nouvelle constante appelée plus haut et égale à Math.max. Math.max va prendre en compte plusieurs valeurs. Nous allons aller pour 1, 77 et 34. Il suffit d'analyser tous les nombres aléatoires à l'intérieur d'ici, puis de le connecter à la console. Dans mon cas, 77 est la valeur la plus élevée à l'intérieur d'ici. Il est renvoyé dans la console. Comme on peut s'y attendre de la même manière, nous pouvons également stocker la valeur la plus basse. Nous avons Math.min. Connectez-vous à n'importe quel numéro à l'intérieur d'ici. Consignez celle-ci à la console et elle devrait renvoyer la valeur d'un. Ce n'est pas toujours pratique d'insérer nos nombres à l'intérieur de la fonction max ou min. Ces numéros sont souvent stockés à l'intérieur d'un tableau. Ensuite, nous devons accéder à ce tableau et déterminer quelle est la valeur la plus élevée et la plus basse. Eh bien, pour dire cela, créez une nouvelle constante appelée nombres et stockez-la dans un tableau. Les numéros enregistrés sont corrects. Comptez ces derniers . Tout d'abord, peut-être pour reproduire ce que nous avions plus haut avec notre plus haut, puis analyser nos nombres en math.max. Faisons cela et voyons ce qui se passe. Console consigne la valeur la plus élevée. Vous vous attendez peut-être à obtenir la valeur de 77. Eh bien, si nous sauvegardons cela et nous actualisons, nous voyons la valeur d'un nombre non présent dans la console. La raison pour laquelle nous comprenons cela est parce qu'à l'intérieur d' ici, nous analysons dans un tableau plutôt que les valeurs réelles contenues à l'intérieur. Pour extraire les valeurs de ce tableau et les comparer, nous devons utiliser la méthode de propagation JavaScript basée sur les trois points. Rafraîchissez, en nous laissant la valeur correcte. De plus, si vous le souhaitez, cela peut également être utilisé avec Math.min. Il fonctionne exactement de la même manière et c'est d'autres méthodes et propriétés disponibles sur cet objet mathématique, comme nous l'avons vu plus tôt dans la console, en fonction de vos besoins particuliers. Nous allons maintenant mettre cela en pratique en générant des pizzas aléatoires et des commandes. 34. Générer de nouvelles pizzas avec des mathématiques: Nous pouvons utiliser ce que nous savons maintenant sur JavaScript Math pour générer des pizzas et des commandes aléatoires. abord, effacons notre fonction de génération de nouvelle commande de la vidéo précédente et commençons à générer de nouvelles pizzas. Nous utilisons cette fonction pour générer une pizza aléatoire à partir de notre gamme de pizzas. Pour commencer, nous allons créer un nombre aléatoire compris entre un et trois, afin de générer la quantité de chaque pizza. N'oubliez pas de créer un nouveau numéro aléatoire, nous utilisons Math.Random. Cela générera un nombre aléatoire compris entre zéro et un. Mais nous voulons aussi que cela se situe entre un et trois. La première étape consiste à utiliser Math.ceil pour arrondir cette valeur , couper cela. Nous utilisons Math.ceil et à l'intérieur des crochets passent ce nombre aléatoire. Avec cette valeur comprise entre zéro et un, cela va toujours arrondir cela à la valeur d'un. Mais nous voulons la valeur de 1-3, qui signifie que nous devons multiplier cette valeur renvoyée par 3, stocker à l'intérieur de la constante appelée quantité. Ensuite, faites un journal de console pour vérifier que cela fonctionne. Dites ceci, et nous devons consoler consigner cette valeur en appelant à générer une nouvelle pizza. Modifications, actualisez 1, 3 et 2. Il semble que ce soit tous les chiffres dont nous avons besoin dans notre gamme. Il s'agit de notre quantité aléatoire, mais nous devrons également choisir une pizza aléatoire. Juste avant de le faire , en fin de compte, ce que nous voulons viser , c'est de créer un nouvel objet de pizza, Const Pizza. Cette pizza doit prendre en compte la quantité que vous avez déjà créée juste au-dessus et nous aurons également besoin d'un nom de pizza. Il s'agit d'une étape que nous devons maintenant créer. Commentez cela afin que nous n'obtenions aucune erreur. Nous prenons constamment pour stocker cela, pour tous au hasard des pizzas. Ceci va sélectionner une pizza aléatoire dans notre gamme de pizzas. N'oubliez pas que les tableaux commencent toujours à la valeur zéro et qu'ils doivent aller jusqu'à la fin de notre tableau. Nous allons maintenant prendre ça avec des pizzas. Longueur. À l'aide d'un exemple similaire ci-dessus, nous allons copier ceci sans point-virgule et le transmettre. Comme nous le savons, cela retournera une valeur de 1-3, mais nous avons besoin d'une valeur de zéro jusqu' à pizzas.length. Pour obtenir zéro, nous utilisons Math.Floor, qui nous donnera actuellement la valeur de 0-2. Mais plutôt que de multiplier cela par 3, nous allons multiplier cela par la valeur de pizzas.length. Cela signifie également que si nous ajoutons de nouvelles pizzas à l'avenir, cela sera également pris en charge. Maintenant, revenons à cette propriété de nom, nous pouvons définir cela comme égal à notre pizza aléatoire. Mais n'oubliez pas que notre pizza aléatoire en choisit une dans le tableau. Si nous examinons le tableau, il contient un objet portant le nom, la méthode et les étapes requises. Nous n'avons qu'à accéder à la propriété name, pouvoir accéder à RandomPizza.Name. Enfin, puisque le travail de générer de nouvelles pizzas est de générer de nouvelles pizzas. C'est ce que nous avons fait avec cet objet, afin que nous puissions revenir de notre fonction. Bien, essayons ça. Plutôt que de l'appeler directement en bas, placez cela dans un journal de console, générez une nouvelle pizza. Appelez cette fonction, rafraîchissez-vous comme premier objet. Nous avons une quantité aléatoire de trois et le nom de jambon et d'ananas. Encore une fois, un végétarien , deux végétariens et un poulet. Il s'agit en fait de la moitié du travail accompli pour générer notre nouvelle commande. Nous avons toutes les pizzas de retour. Mais plutôt que de se connecter à la console, cette valeur, nous devons appeler cela depuis génère un nouvel ordre. Plongez dans cette fonction et nous commencerons par créer une nouvelle variable de pizzas et la définir comme égale à un tableau vide. Ce tableau de pizzas vides sera utilisé pour créer un nombre aléatoire d' articles pour notre commande. Parce que rappelez-vous, même si elle génère de nouvelles pizzas, elle génère plusieurs valeurs, ce n'est qu'une seule ligne. Par là, si nous nous rafraîchissons, redémarre. Ce que je veux dire par là, si nous cliquons sur l'une de nos commandes, c'est par exemple que nous ne produisons qu'en une seule ligne, comme un jambon et un ananas ou deux poivrons. Pizzas va stocker une panoplie de tous ces articles. Dans ce jeu, je vais limiter le nombre de lignes à cinq, donc nous n'avons pas trop de commandes énormes. Nous savons déjà comment générer un nouveau nombre compris entre un et trois. Copions ceci, stockons cela à l'intérieur d'une constante appelée article de commande, plutôt que la valeur de trois, change à cinq, nous étant donné un nombre compris entre un et cinq, que vous pouvez modifier si vous préférez. Nous savons maintenant que nous avons un nombre aléatoire compris entre un et cinq. Ensuite, nous allons créer une boucle pour pousser chacune de nos commandes générées à partir de cette fonction dans notre tableau de pizzas. Nous allons répéter cette opération pour la valeur de l'article commandé. Passez dans une boucle for, je serai initialement réglé sur une. La boucle continuera à fonctionner là où i est inférieur ou égal à la valeur ci-dessus de l'article de commande, donc c'est 1-5. Ensuite, après chaque boucle, nous allons incrémenter i avec i plus plus. Pour notre tableau de pizzas vides, utilisez la méthode push pour ajouter une nouvelle valeur. La nouvelle valeur à pousser est cette valeur qui est renvoyée à partir de la génération d'une nouvelle pizza. Nous devrions maintenant avoir un tableau de pizzas, qui est défini sur un certain nombre de lignes entre un et cinq, puis les objets de pizza aléatoires à l'intérieur. Cela nous laisse maintenant notre gamme de pizzas pour la commande, mais nous devons maintenant construire nos objets de commande. Cela crée une nouvelle constante pour stocker cela, appelée nouvel ordre, qu'il s'agisse d'un objet. Chaque commande a besoin d'un identifiant unique. Nous pourrions aller de l'avant et générer un long nombre aléatoire ou une chaîne. Dans ce cas, un numéro de commande simple est correct. Ce que je vais faire est juste en dehors de cette fonction, crée une nouvelle variable appelée numéro de commande et la définir égale à la longueur des points de notre tableau de commandes. Si notre nombre actuel de commandes est de trois, cela renvoie la valeur de trois. Mais puisque nous créons une nouvelle commande à la fin de ce tableau, nous ajouterons plus un à la fin. Il devrait toujours y avoir une commande de plus que le nombre de commandes que nous avons. Par conséquent, ce sera unique. Nous pouvons transmettre cela comme ID, placer dans le tableau de pizzas d'en haut. Que voulons-nous réellement faire avec cette nouvelle commande ? Eh bien, en haut, rappelez-vous que nous avons notre tableau de commandes qui contient les trois exemples de commandes. Nous devons aller jusqu'au bout de ce tableau. C'est assez simple. Nous récupérerons nos commandes. Push place dans notre nouvelle commande, puis augmenterons notre numéro de commande pour la prochaine fois, alors ajoutez le numéro de commande plus plus. Cela doit toujours être unique. Prenons notre fonction de génération de nouvelle commande, et nous appellerons cela tout en bas et essayerons cela. Enregistrez et rafraîchissez. Cliquez sur « Démarrer ». Ensuite, nous avons nos trois commandes originales de notre tableau de commandes, puis une commande aléatoire en bas. Nous avons le prochain numéro d'index de l'ordre quatre. Nous avons un nombre aléatoire de pizzas et un nom aléatoire. Rafraîchissons et essayons encore une fois. Commandez quatre, celui-ci est un peu plus long et il y a quatre lignes distinctes. N'oubliez pas que nous pourrions avoir jusqu'à cinq lignes. C'est un bon progrès avec notre jeu et nous allons nous appuyer sur cela dans la prochaine leçon et générer de nouvelles commandes après un certain délai et revisiter JavaScript Math, où nous allons regarder dessiné avec Le Canvas. 35. setInterval: Nous savons que nos commandes fonctionnent et génèrent également de manière aléatoire dès le début du jeu. Mais nous voulons également qu'ils continuent de venir tout au long du match. Mais ce JavaScript nous fournit une méthode appelée SetInterval, et SetInterval exécute une fonction après un certain délai. Il est disponible sur l'objet fenêtre, nous pouvons donc simplement l' appeler seul. Appelez donc SetInterval, et SetInterval va prendre en compte deux choses. abord, nous transmettons une fonction que vous souhaitez exécuter, et nous pourrions transmettre une nouvelle fonction directement comme celle-ci, ou nous pourrions référencer une fonction existante par son nom. La fonction que nous voulons exécuter est GenerateNewOrder, alors transmettez-la sans crochets, et nous pouvons maintenant supprimer cela juste au-dessus. Séparez-le par une virgule. Nous passons un délai, et c'est le délai entre chaque appel de fonction. Il est également en millisecondes, donc 3 000 millisecondes équivaut à 3 secondes. Cette fonction sera appelée toutes les trois secondes. Nous vérifions que cela fonctionne, passons à notre fonction GenerateNewOrder et nous pouvons transmettre un journal de console, placer dans le tableau des commandes. Rafraîchissez le navigateur. Au bout de trois secondes, nous devrions voir un journal de console contenant quatre commandes. Trois secondes plus tard, nous voyons cinq commandes, six commandes, etc. Bien. Maintenant, nous savons que cela fonctionne. Auparavant, nous avons créé une fonction appelée CreateOrdersList. Jetons un coup d'œil à cela. Faites défiler vers le haut et nous voilà. C'est notre fonction ici. Cette fonction a pris le tableau de commandes. Nous avons ensuite passé en boucle chacune de nos commandes et l'avons placé dans notre section des commandes. ne nous reste plus qu'à appeler cette fonction chaque fois que nous générons une nouvelle commande. Au lieu de notre journal de console, que nous les avons précédemment placés, dans le répertoire de génération d'une nouvelle commande, supprimez le journal de la console et remplacez-le par CreateOrdersList. Disons cela et voyons où cela nous mène. Rafraîchissez le navigateur. Au bout de trois secondes, nous voyons passer nos commandes. Nous avons le numéro 1 jusqu'à quatre, puis les secondes plus tard, nous recevons un nouveau lot de commandes. Le problème ici, c'est que nous n'ajoutons pas seulement les nouvelles commandes qui ont été générées, mais nous ajoutons également les commandes existantes. Cela nous laisse maintenant deux problèmes que nous devons résoudre. La première est que les commandes arrivent avant même d' appuyer sur le bouton « Démarrer » en haut. La deuxième, comme nous venons de le voir, il suffit d' ajouter les nouvelles commandes plutôt que d' ajouter toutes les commandes existantes. Corrigez ce problème, nous pouvons effacer toutes les commandes avant d' ajouter nos nouvelles commandes à cette section. Cela peut être fait en accédant à la fonction CreateOrdersList et effacant la section Order avant d'ajouter les nouvelles. Revenons à CreateOrdersList. Nous voilà au sommet. Avant d'ajouter nos commandes dans cette section, nous allons effacer ce problème avec Documents.QuerySelector. Saisissez notre section Commandes, HTML interne et définissez-la sur une chaîne vide. Essayons ça. Rafraîchissez, donnez trois secondes. Il y a nos quatre premières commandes. Commande 5, ça a l'air bien. Commande 6, super. Ils sont tous en train d' arriver, mais plutôt que d'ajouter toutes les commandes existantes, nous l'ajoutons à la fin de celles qui existent déjà. La prochaine chose que nous voulons résoudre est ajouter ces commandes à la barre latérale uniquement après avoir cliqué sur le bouton « Démarrer ». Pour cela, plutôt que appeler directement notre SetInterval en bas, nous pouvons le supprimer, le quitter et l' envelopper dans une fonction appelée OrderSimer. Replacez ça à l'intérieur. N'oubliez pas que lorsque nous cliquons sur le bouton Démarrer, cela déclenche notre fonction appelée StartOfGame. Si nous trouvons cela juste ici, nous pouvons alors appeler notre fonction, qui était OrderStimer. Disons ceci et essayons ça. abord, rafraîchissez-vous et donnez trois secondes et nous ne devrions pas voir de commandes maintenant dans la barre latérale. Bien. Cela a stoppé la charge initiale. Cliquez sur le bouton « Démarrer ». Maintenant, notre ordre commence à passer. SetInterval est également utile pour créer un compte à rebours pour le jeu, sorte qu'il ne fonctionne que pendant un certain temps. Dès que vous cliquez sur « Démarrer », nous commencerons un compte à rebours à partir d'un certain nombre de secondes. Pour cela, nous avons besoin de certaines variables pour suivre cette situation. Sautez jusqu'au sommet où nous avons le reste de nos variables. Le premier sera une constante appelée GameLength. Définissez cette valeur sur n'importe quel nombre de secondes que vous souhaitez. Le mien sera 300, et le second utilisant le mot-clé let, puisque nous allons mettre à jour cela, sera égal au CountDownTime. Le compte à rebours va commencer à la longueur de jeu initiale. Ensuite, nous allons le réduire d'une seconde avec SetInterval. Au départ, nous allons définir cette valeur égale à GameLength, puis nous le réduirons au fur et à mesure que le jeu se déroule. Nous devons également l'afficher à l'écran. Nous pouvons le faire avec Document.QuerySelector. Nous devons trouver une section qui se trouve en haut à côté de nos boutons. Il s'agit de la section de contrôle du jeu où nous avons les boutons de début et de fin de jeu, et nous avons également une plage avec l'ID de GameLength. Transmettez-le, définissez l'InnerText. Puisque nous insérons la variable GameLength, nous avons besoin des backticks indiquant que la longueur du jeu est insérée dans la variable, qui est notre numéro GameLength, suivi du texte des secondes. Rechargez et voici notre texte en haut. Nous devons maintenant faire deux choses. La première consiste à créer une fonction permettant de déduire cette variable d'une seconde. Ensuite, nous pouvons appeler cette fonction une fois par seconde en utilisant SetInterval. abord en bas, créez notre nouvelle fonction appelée CountDowntimer, qui sera responsable de saisir notre variable, c'est-à-dire le compte à responsable de saisir notre variable, rebours Time et de la déduire d'une seconde. Chaque fois que nous faisons cela, nous devons également saisir les mêmes éléments haut et les mettre à jour avec cette nouvelle période. Tout comme nous l'avons fait en haut, nous utilisons Document.QuerySelector, le passons dans la même section, qui était GameLength, l'InnerText , ouvrez les backticks. Cette fois, nous dirons que le temps restant est égal à notre variable juste au-dessus. Cette fonction ne fait rien seule. Il est simplement responsable de sélectionner notre variable CountDownTime , puis de la déduire en une seconde. Pour également attribuer cela à la variable existante, nous devons également placer une valeur égale, puis cela ajoute cela au DOM. Cette fonction est responsable de la déduction en une seconde, mais nous devons toujours appeler cette fonction toutes les secondes. Pour ce faire, nous allons entrer dans notre fonction de démarrage du jeu. En bas, nous allons définir Interval une fois de plus, passer notre fonction, qui est le CountDowntimer, qui s'exécutera toutes les secondes. Essayons ça. Rafraîchissez-vous et nous verrons notre texte en haut. Vous pouvez commencer. Ensuite, notre minuteur commence à compter. Cependant, si nous recommençons cela une fois de plus, vous remarquerez un petit problème. Si nous regardons de près, le compte à rebours ne commence pas avant la première seconde. Nous allons cliquer. Nous devons attendre une seconde avant le compte à rebours. Cela se produit car SetInterval n' appelle pas la fonction immédiatement. Au lieu de cela, il attend d' abord le délai , puis appelle cela par la suite. C'est une solution assez simple. Tout ce que nous devons faire, c'est de saisir notre compte à rebours et appeler une fois juste avant le démarrage de notre minuteur. Maintenant, si nous nous actualisons, cliquez sur « Démarrer », notre minuteur commence immédiatement. C'est ainsi que nous pouvons utiliser SetInterval, qui est une méthode très utile pour apprendre, tout comme une autre fonction de synchronisation appelée SetTimeout. C'est ce que nous allons couvrir ensuite. 36. setTimeout: SetInterval que nous venons de regarder appelle à plusieurs reprises une fonction ou exécute code avec un délai entre chaque appel. Une autre méthode de synchronisation disponible s' appelle SetTimeout. SetTimeout pour exécuter une fonction ou un code une fois après un délai. Nous pouvons l'utiliser pour exécuter la fonction EndofGame une fois le minuteur activé. Il ressemble à SetInterval. Jetons un coup d'œil à cela tout en bas. Celui-ci est SetTimeout, qui, comme SetInterval, prend également en compte deux choses. abord, c'est le code que nous voulons exécuter et, dans notre cas, nous voulons exécuter la fonction EndFGame. Séparez-le par une virgule, le délai avant de réexécuter cette fonction en millisecondes. 2000 est donc un délai de deux secondes. Nous pouvons tester ce travail en sautant dans la fonction EndFGame et en vous connectant à la console. N'importe quel texte, essayez-le. Allons-y pour la fin. Ouvrez la console. Cela nous donne deux secondes et notre fonction est maintenant appelée. Mais nous voulons que cette fonction soit exécutée à la fin de la partie. Nous pouvons donc définir le délai pour qu'il soit identique à la durée du jeu. Nous l'avons stocké à l'intérieur d'une variable tout en haut, appelée durée du jeu, actuellement fixée à 300 secondes. C'est ainsi que cela fonctionne plutôt que de devoir attendre 300 secondes pour notre appel de fonction, je dépose cela à une petite valeur telle que trois. Tout en bas, nous pouvons maintenant définir ce délai comme étant notre délai. Comme nous le savons, la durée du jeu est trois secondes avec un délai de temps en millisecondes, qui signifie que nous devons convertir cela en multipliant cela par 1000. Bon, essayons encore une fois, rafraîchissez-vous, et après trois secondes, notre fonction a été appelée. Donc, un peu de nettoyage avant de passer à autre chose, nous supprimerons notre journal de console et la fonction de fin de jeu. Restaurez la durée du jeu à 300 secondes. Bien. Cela fonctionne maintenant bien, mais pour éviter que ce code exécute lorsque le jeu n'est pas démarré, nous pouvons l' intégrer dans une fonction. Créez donc une fonction appelée GameTimer, mettez-la à l'intérieur et cette fonction peut maintenant être appelée au début du jeu. Alors, accédez à notre fonction de début de jeu , appelez notre GameTimer. Toujours dans cette fonction, nous pouvons transmettre un message à l'utilisateur. Donc, ce que nous allons faire, c'est que si nous regardons ces messages, nous allons envoyer un message pour dire : « Chef, nos premières commandes arrivent dès le début du jeu. » Nous utilisons SetTimeout, puis effacons cela après un certain nombre de secondes. Le message n'est donc pas toujours présent. Pour commencer tout en bas, nous allons saisir la section avec le sélecteur de requêtes. Voyons ce qu'est le sélecteur de cette partie dans la zone de message et nous avons ce p avec l'ID du message. Il s'agit d'un ID, alors utilisez un hachage, sélectionnez le contenu InnerText. Mon message va être : « Chef, nos premières commandes arrivent. » Ensuite, juste après, nous allons exécuter une fonction au bout trois secondes pour supprimer ce message de l'écran. Une fois de plus, nous pouvons utiliser SetTimeout. Comme nous l'avons déjà appris, SetTimeout et SetInterval peuvent appeler une fonction par son nom ou transmettre directement une fonction. Nous pouvons copier cette ligne de code, la coller dans. En fait, juste avant de faire cela, nous allons retirer ces crochets. Ce paramètre doit être défini sur égal car InnerText est une propriété plutôt qu'une méthode. Il en va de même pour notre deuxième. Définissons celle-ci comme une chaîne vide , puis juste après nos crochets ou les accolades, nous pouvons ajouter le délai de 3000 millisecondes. Rafraîchissez, cliquez sur « Démarrer » et notre message est maintenant placé dans la zone des messages, et trois secondes plus tard, il a été supprimé. Bien. Il s'agit donc d'une introduction aux minuteurs JavaScript utilisant SetInterval et SetTimeout. Vous pouvez voir à quel point il peut être utile dans des projets comme celui-ci. Nous avons également d'autres minuteurs à ajouter très bientôt. Mais ensuite, nous examinerons comment effacer ces minuteurs lorsqu'ils ne sont plus nécessaires. 37. Minuterie de compensation: Nous avons maintenant couvert ces deux minuteurs qui étaient SetTimeout et SetInterval de ces méthodes. Vous avez également un compte clair partie 2 de ClearTimeOut et ClearInterval. Ces méthodes claires arrêteront les minuteurs lorsque nous n'en avons plus besoin, ce qui est utile lorsque le jeu est terminé. Nous pouvons arrêter des choses comme le compte à rebours, afin de pouvoir redémarrer en cas de besoin. Ne pas utiliser inutilement les ressources du navigateur. Pour pouvoir effacer une minuterie, nous devons d'abord stocker la minuterie d'origine dans une variable. Tout d'abord, nous aurons notre OrderStimer, qui contient notre SetInterval. Nous y faisons référence dans une variable appelée OrderTimerRef, qui est égale à une chaîne vide. Maintenant, pour cette fonction suivante, nous avons le CountDownTimer, et à l'intérieur, il ne contient pas de délai d'expiration directement. Mais si nous y jetons d'abord un coup d'œil, celui-ci est appelé en utilisant SetInterval. Nous allons placer disponible juste au-dessus de cela. Celui-ci est le CountDownTimerRef. Également une chaîne vide. dernier est le GameTimerRef. Remarquez ici comment nous avons déclaré ces variables laissées en dehors de chaque fonction. En effet, si nous les déclarons dans la fonction, nous ne pourrons plus y accéder plus tard dans d'autres parties de notre code. Nous devrons y accéder pour dégager les minuteurs. Nous aborderons cette question plus en détail dans une section ultérieure. Ce premier sera égal à notre SetInterval. La référence du minuteur de jeu est égale à notre SetTimeout. Sachez également que celui-ci du milieu, le CountDownTimerRef, ne contient pas directement notre délai d'attente. Ce que nous pouvons faire, c'est passer à notre fonction, qui est ce StartOfGame, et la configurer là. Donc, cette fonction StartOfGame. Définissez CountDownTimeRef comme égal à SetInterval. Ils sont maintenant stockés dans des variables. Juste avant d'éclaircir cela, nous devons d'abord prouver qu'ils sont en cours d'exécution. journal de la console peut nous aider avec cela dans notre fonction GenerateNewOrder. Fonction GenerateNewOrder, placer dans un journal de console. En fait, c'est très bien à l'intérieur d'ici, comme l'ordre. [inaudible] le navigateur et actualisez. Commencez le jeu. Notre minuteur commence à compter à rebours. Nous voyons que notre message a été supprimé au bout de trois secondes. Nos commandes continuent d'arriver, ainsi que notre journal de console ici également. Mais vous remarquerez que si nous cliquons sur « Fin », arrêtez notre jeu, notre minuteur compte à rebours, nos commandes continuent d'arriver. Pour résoudre ce problème, nous pouvons effacer tous ces minuteurs lorsque nous appelons la fonction EndFGame. Jetez un coup d'œil à cela, puis à l'intérieur, nous appelons la méthode ClearInterval, analysant dans notre OrderTimerRef. Le second est également un intervalle, pourquoi nous utilisons ClearInterval. Il s'agit du compte à rebours Ref. Pour le troisième, notre minuteur de jeu était un délai d'attente. Nous utilisons donc ClearTimeOut pour celui-ci. Essayez encore une fois. Actualisez. Commence notre jeu. Voyez le compte à rebours, nous voyons les ordres. Cliquez sur le bouton « Fin ». Tout a maintenant été arrêté. Si nous cliquons à nouveau sur le bouton « Démarrer », tout se poursuit là où nous nous sommes arrêtés. Nous voyons que le minuteur continue à partir de l'endroit où il a été mis en pause, et les commandes continuent également d'arriver là où elles se sont arrêtées. Mais c'est très bien, nous allons faire quelques travaux de nettoyage très bientôt pour résoudre ces problèmes. L'essentiel ici, c'est que nos minuteurs peuvent maintenant être arrêtés, alors qu'ils ne sont plus nécessaires. 38. Introduction À La Date Du Javascript: De nombreuses applications et sites Web nécessitent de connaître la date actuelle. Nous pouvons suivre la date d'inscription d'un utilisateur, l'heure entre deux événements et bien plus encore, mais ce code JavaScript contient des objets intégrés qui peuvent nous aider. Pour commencer, nous pouvons appeler la date en tant que fonction, comme ceci, avec les crochets. Stockez-le ensuite à l'intérieur d'une variable, cette date égale à notre fonction de date. Essayons ensuite avec un journal de console. Placez la variable de date et voyez ce qui se passe. Rafraîchir et entrer dans la console, qui retournera ensuite la date actuelle et l'heure sous forme de chaîne, tout comme la fonction constructeur, que nous avons examinée plus tôt lors de la création d'un comme la fonction constructeur, que nous avons examinée plus tôt lors de la création d' nouveau objets que j'ai placés dans le nouveau mot-clé. Avec la nouvelle date, nous pouvons également transmettre certaines valeurs pour créer une date différente. Passez entre parenthèses pour pouvoir passer dans l'année, le numéro d'index du mois en cours, le jour, les heures, les minutes, les secondes et les millisecondes. Nous plaçons n'importe quelle année que nous voulons, puis l'indice du mois, qui commence également à zéro. janvier est nul et le 11 décembre. Ensuite, la date. Enregistrez et actualisez-le à l'intérieur de la console. Cela reflète maintenant une date que nous venons de placer. Cela signifie que cette fonction constructeur nous donne la possibilité d'obtenir la date actuelle ou de définir n'importe quelle date que nous voulons, comme ceci. Il peut être difficile de travailler avec des valeurs de date comme celle-ci. Si nous voulons comparer deux dates différentes, ce que nous devrons peut-être faire est de prendre la chaîne actuelle comme nous l'avons dans la console, diviser notre chaîne, puis comparer chaque pièce. Comme vous pouvez l'imaginer, ce n' est pas une tâche facile. Un autre format de date consiste à utiliser une méthode appelée maintenant. Nous pouvons déplacer le contenu à partir de la date. Avec le nouveau mot-clé, appelez-le maintenant méthode. Essayons cela et voyons ce qui se passe dans la console. Cela nous donne un numéro étrange. Cela peut paraître un peu étrange, mais c'est un nombre en millisecondes depuis le 1er janvier 1970 UTC. Si nous continuons de nous rafraîchir, chaque fois que nous le faisons, ce nombre continuera d'augmenter. Bien que ce n'est toujours pas idéal, il peut s'agir d'un moyen plus simple de comparer les dates ou les heures. Par exemple, lorsqu'un utilisateur s' inscrit à notre site Web, nous pouvons utiliser Date.Now pour stocker l' heure actuelle en millisecondes. Ensuite, lors de futures visites, nous pourrons connaître l' heure actuelle et comparer la différence entre ces deux chiffres. Les millisecondes doivent également être converties en secondes, minutes et jours, selon ce que vous devez en faire. Nous allons examiner cela plus en détail dans une vidéo à venir. Le prototype disponible sur les dates est une gamme de méthodes que nous pouvons également utiliser pour définir la date. Jetons un coup d'œil à ces derniers dans la console. Nous pourrions déplacer la méthode maintenant. Accédez à l'objet prototype, actualisez-le et ouvrez-le. Comme nous venons de le voir, nous avons la fonction de constructeur de date et beaucoup plus de cas d'utilisation, comme obtenir les heures, obtenir la date complète, obtenir le jour. Nous avons également les fixateurs, afin que nous puissions définir la date actuelle, nous pouvons définir l'heure. Je ne vais pas passer en revue tous ces éléments car ils sont très spécifiques à différents cas d'utilisation, mais cela fonctionne comme n' importe quelle autre méthode. Utilisez-les car les méthodes se trouvent sur des objets. Nous devons à nouveau utiliser le nouveau mot-clé pour créer un nouvel objet date. Supprimons cela, placons entre crochets, ajoutons le nouveau mot-clé. L'une des méthodes que nous venons de voir dans la console était GetMonth. Nous avons cela sur notre variable de date. Voyons ce qui est retourné à l'intérieur de la console. Cela renvoie la date du mois en cours. Encore une fois, cela commence par zéro, donc janvier est zéro, et février est le numéro 1, etc. GetDay renvoie la date de la semaine en cours. Essayons ça. GetDay. C'est ce que vous avez déjà vu avec le prototype. Nous avons également accès à certaines méthodes qui définissent également la date. Nous aurons peut-être un événement que nous aurons déjà enregistré et que nous voudrions peut-être changer le mois ou l'année, ce que nous pourrions faire comme ça. Ici, nous avons la date actuelle de base. Enlevons simplement ça. Ensuite, nous allons changer le mois en cours par tout ce que vous voulez. Stockez-nous cela à l'intérieur d' une constante appelée date de mise à jour. Prenez notre variable de date actuelle, accédez à l'une de nos méthodes définies telles que SetMonth, placez un numéro d'index 11, qui sera en décembre. Ensuite, un deuxième journal de console juste dessous, encore une fois avec la date. Nous devrions pouvoir voir la version mise à jour avec notre deuxième journal. Rafraîchissez ça. Nous commençons par mars, puis nous fixons notre mois en décembre. Il s'agit d'une introduction basique à la date JavaScript. Ensuite, nous utiliserons cette date et cette heure à l'intérieur de notre projet, garderons une trace de la durée des pizzas au four. 39. Régler Le Temps De Cuisson: Ce que nous avons appris dans la vidéo précédente, la tâche consiste maintenant à définir le temps de cuisson de la pizza à l'aide de la date JavaScript. Nous allons déplacer les exemples de la vidéo précédente. Maintenant, dans la fonction Ajouter au four, nous avons créé une date d'espace réservé très tôt. Jetons un coup d'œil à cette fonction, au four. Ici, nous définissons l'heure ajoutée pour être une chaîne. Cela peut désormais être mis à jour pour utiliser dynamiquement la date actuelle. Comme nous l'avons vu, nous accédons à l'objet date et à la méthode appelée maintenant. N'oubliez pas que date.now sera en millisecondes, sorte que nous pouvons le retirer du four après qu' un certain nombre de millisecondes se soient écoulées. Mais avant de le faire, nous devons définir le temps de cuisson que nous voulons appliquer. Cette variable est parfaite, alors passez au reste des variables. Configurez une constante appelée temps de cuisson, qui est égale à 20 secondes. Maintenant, tout en bas de notre script, nous pouvons placer ici une nouvelle fonction qui va boucler toutes les pizzas à l'intérieur du four une fois par seconde. Nous retirerons ensuite toutes les pizzas qui étaient en cours de cuisson. Fonction, vérifiez le four. Pour vérifier le four une fois par seconde, nous pouvons utiliser un intervalle défini. Si vous le souhaitez, vous pouvez créer une fonction autonome distincte ou nous pouvons la placer directement dans la fonction. Cette fonction va passer en boucle sur tous les éléments à l'intérieur de notre réseau de fours. Ce réseau de four est stocké dans la variable du four, boucle en utilisant pour chacun d'eux. Encore une fois, pour chacun d'entre eux, prend une fonction qui a accès à chacune de nos pizzas individuelles au four. À la fin de nos crochets d' intervalle définis, nous pouvons placer un délai entre chacun de nos appels de fonction, qui sera à chaque seconde. Pour chaque article ou chaque pizza à l'intérieur de notre boucle, face à une déclaration if. Cette instruction if va vérifier le décalage horaire toutes les secondes. On peut dire si la date, mais maintenant, qui est l' heure actuelle en millisecondes , déduisez le temps de cuisson. N'oubliez pas que le temps de cuisson est exprimé en millisecondes. Convertissons cela, multiplions cela par 1000. Dans son calcul actuel nous donnera le temps d'il y a 20 secondes. Nous pouvons vérifier si cette valeur est supérieure à la propriété pizza.time ajoutée actuelle. Si c'est le cas, cela fait plus de 20 secondes et nous devrons le retirer du four. Accédez à notre four. La méthode shift, qui va supprimer le 1er élément de notre tableau. Nous devons également accéder au 1er article car rappelez-vous que le 1er article sera au four le plus longtemps. Ce sera toujours le prochain à supprimer. Après avoir retiré cet élément de la baie, nous devrons réinitialiser contenu du four avec la fonction, qui est l'affichage d'un élément, ce qui permettra de redessiner efficacement le four. Nous pouvons également suivre ici le nombre de pizzas que nous avons cuisinées, en augmentant une variable. La variable des pizzas complètes, et augmente avec plus plus. Nous n'avons pas encore créé cela, donc nous sautons au sommet avec le reste de nos variables. Laissez les pizzas complétées commencer à zéro, et cette section sera utile plus tard lorsque nous ajouterons le début de notre jeu. Enfin, nous avons créé cette fonction, mais nous ne l'avons pas encore appelée. Ce que nous devons faire, c'est appeler notre fonction de four à contrôle lorsque nous commençons le jeu. sautant à la fonction de début de jeu, place en bas. Essayons ça. Rafraîchissez la page. Début du jeu. Cliquez sur n'importe quelle commande, ajoutez-le au four, ajoutez-en quelques autres. Donnez 20 secondes, et notre pizza devrait alors commencer à être retirée. Le premier est parti, ou le deuxième juste après. Suivi de nos deux dernières pizzas. 40. Introduction À La Toile & Co-Ordinates: Nous pouvons toujours rester dans notre projet pour celui-ci et jeter un coup d'œil à quelques exemples en bas. Cette vidéo abordera certains éléments de base de la toile. Ensuite, dans le reste de cette section, nous dessinerons nos pizzas et montrerons les différentes garnitures au fur et à mesure que nous les ajouterons. abord, abordons une partie essentielle et c'est pour comprendre l'utilisation de coordonnées. Il existe un élément HTML appelé Canvas qui nous permet d'y dessiner en utilisant JavaScript. Nous définissons la largeur et la hauteur du canevas, puis nous pouvons parcourir cette grille de type pixel à l'aide de coordonnées. L'axe des X s'étend de gauche à droite, et l'axe Y va de haut en bas. En utilisant ces positions x et y, nous pouvons nous déplacer vers n'importe quel emplacement de la toile et x,0, y,0 est le coin supérieur gauche. Nous pouvons ensuite traverser ou descendre n'importe quel montant que nous voulons, comme nous le voyons dans cet exemple, où x est égal à 10 et y est la valeur de 3. Nous verrons bientôt comment la compréhension ces coordonnées est essentielle pour dessiner sur la toile. Revenons à notre projet et dans notre fichier HTML. Nous avons déjà configuré des éléments de canevas. Si nous jetons un coup d'œil à notre coin cuisine, ayez ces éléments de toile avec l'ID de la zone pizza. Il a une largeur de 250 et une hauteur de 250 pixels. Plongez dans notre script et passons au bas de notre script. Créez une constante appelée canevas pour le stocker à l'intérieur de. Comme tous les autres éléments, nous pouvons utiliser quelque chose comme document.queryselector. Comme nous venons de le voir, nous pouvons transmettre une pièce d'identité. Celui-ci est égal à pizza_area. Ensuite, nous pouvons appeler une méthode appelée GetContext. Prenez notre variable, appelez la méthode GetContext. Passage d'une chaîne de 2D. Dans ce contexte, il s'agit d'un objet contenant des propriétés et des méthodes que nous pouvons utiliser pour dessiner sur le canevas. Nous n'aurons besoin que des fonctionnalités 2D pour ces exemples. Installez-le à l'intérieur d'une variable ou d'une constante, généralement appelée CTX, mais cela peut être nommé tout ce que vous voulez. Lorsque vous utilisez le canevas, deux concepts importants à comprendre sont le contour et le remplissage. Le trait est comme un trait de crayon ou un contour et le remplissage, tout comme il le sonne, remplit une forme d'une couleur unie. Pour dessiner un rectangle, nous avons StrokeRect et également la méthode FillRect. Jetons un coup d'œil à StrokeRect pour commencer. Bien que les entités dessinées soient disponibles dans le contexte. Pour dessiner le contour d'un rectangle, nous allons utiliser StrokeRect, puis nous transmettons quatre valeurs. Les deux premiers, comme nous l'avons vu dans les diapositives, sont les emplacements x et y du coin supérieur gauche de notre rectangle. Si nous voulons que cela commence en haut à gauche, nous le définissons à 0,0. Ensuite, nous avons la largeur et la hauteur du rectangle que vous souhaitez dessiner. Il peut s'agir d'un rectangle ou de dessiner un carré si nous transmettons des valeurs égales. Jetons un coup d'œil à ça. Nous allons le dire et sauter dans le navigateur, le rafraîchir et nous verrons le contour de notre carré 200 pixels par 200 pixels. En plus de transmettre des valeurs codées en dur comme ceci. Nous pouvons également accéder à notre variable canevas par le haut. Transmettez-le et accédez à la propriété width. Nous avons déjà mis ces deux éléments à l'intérieur de nos éléments. Nous avons 250 pixels pour ces deux valeurs. Nous pouvons les insérer sous forme de variables. Essayez-le, rafraîchissez-le et comme il s'agit de 250 pixels, c'est maintenant un peu plus grand que ce que nous avions initialement. L'utilisation de ces variables est vraiment utile et nous pouvons également fournir des calculs en fonction de leur taille. Par exemple, si nous voulons que ce soit seulement la moitié de la largeur de la toile, nous pourrions le diviser par 2. Si vous voulez qu'il s'agisse d'un rectangle solide ou d'un carré solide, nous pouvons changer le trait en FillRect. Cela remplira la couleur noire par défaut. Le noir standard n'a généralement pas fière allure, et nous pouvons également changer cette couleur. allons dupliquer nos rectangles et nous ferons du premier un trait, et le second, nous allons simplement rendre cela un peu différent. Allons-y pour 100 par 100. Places, 20 pixels en haut à gauche du canevas. Nous avons maintenant un trait et un rectangle rempli. Nous pouvons fournir des couleurs différentes pour chacune d' elles, en commençant par le trait. Encore une fois, accédez au contexte. Puisque nous utilisons un trait et passons dans le StrokeStyle. Définissez cette valeur égale à une valeur de type CSS, telle que verte. Je vais voir que la couleur verte a pris effet. Juste au-dessus de notre rectangle rempli. Nous pouvons également accéder au contexte et fournir la propriété appelée FillStyle pour affecter ce deuxième carré. C'est égal à n'importe quelle autre couleur. Enregistrez cela et rafraîchissez-le. C'est ainsi que nous pouvons définir différentes couleurs pour chacune de nos formes. Cette API dispose également d'une méthode d'arc pour aider à dessiner des arcs et des cercles. Comme toujours, nous y accédons dans le contexte ctx.arc. Contrairement aux carrés que nous venons de dessiner tous les rectangles où l'emplacement de départ est basé en haut à gauche, avec un cercle, cela est basé sur le centre. Nous pouvons accéder à la largeur du canevas pour l'axe X. Divisez-le par 2 à des endroits situés au milieu de la toile et également la même pour la hauteur. C'est le point de départ de notre cercle, mais nous devons encore fournir des informations supplémentaires. Le prochain est le rayon de notre cercle. Si vous n'êtes pas familier avec les rayons, il s'agit essentiellement de la moitié de la largeur du cercle. La valeur du point central vers l'extérieur. Allons-y pour 100. Ensuite, les deux dernières valeurs au début et à l'angle de fin. Ces valeurs sont exprimées en radians plutôt qu'en degrés. Pour commencer, nous allons ajouter un angle de départ de zéro, puis l'angle de fin, une valeur de deux radians. Enregistrons cela et voyons ce qui se passe à l'intérieur du navigateur. Si nous le rechargeons, nous ne voyons aucun dessin sur la toile. C'est parce que nous devons dire si nous voulons qu'il s'agisse d'une ligne de trait ou d'un remplissage solide comme nous l'avons fait ci-dessus. Juste après, accédez au contexte. Tenez la méthode de remplissage, rafraîchissez-vous, en nous laissant une belle courbe ressemblant à un sourire. Ou nous pouvons simplement faire la ligne avec un trait avec ctx.stroke. Vous pouvez également voir que maintenant nous faisons la ligne de trait. Cela héritera également du style de trait vert. Pour faire un cercle complet en radians, nous devons multiplier cette valeur de 2 par math.pie qui est l' équivalent de 360 degrés. Il y a notre cercle vert et comme vous pouvez le constater maintenant, nous avons un cercle complet. Il est également placé au centre de la toile en raison de nos emplacements x et y. Juste avant de dessiner cela sur le canevas à l'aide d'un trait ou d'un remplissage, nous pouvons également définir des propriétés supplémentaires telles que la largeur de la ligne et la couleur. Commençons par la propriété largeur de ligne, que nous allons définir sur cinq pixels. Le StrokeStyle est également disponible dans le contexte. Il s'agit de la même valeur que celle que nous avons utilisée ci-dessus pour définir cette valeur en vert. Mais maintenant, nous allons remplacer cette couleur pour qu'elle soit différente. Avant, j'ai mentionné qu'il s'agit d'une propriété semblable à CSS En plus d'utiliser simplement les mots comme vert ou rose vif, nous pouvons également passer des choses comme la valeur x et définir cette couleur comme une couleur différente. Je vais aller pour F5cf89. Essayez-le, en nous laissant une ligne de 5 pixels d' une couleur différente. En plus de ces méthodes pour dessiner des formes prédéfinies, nous pouvons également dessiner des lignes à main levée comme un outil crayon si vous avez utilisé une application de dessin par le passé. Pour le démontrer, nous pouvons reproduire ce rectangle extérieur vert ou ce carré et dessiner cette main libre. Nous pouvons commenter le premier rectangle, qui est ces deux lignes ici. Dessinez cela nous-mêmes en utilisant des coordonnées. Ils sont tous disponibles dans le contexte. La première méthode va être MoveTo. MoveTo est essentiellement comme ramasser notre crayon, le déplacer vers une certaine partie du papier dont nous voulons commencer. Cela déplacera nos coordonnées sans tracer de ligne. Tout comme notre carré d'origine, cela commencera en haut à gauche de la toile. Pour dessiner, nous utilisons la méthode appelée LineTo, qui va tracer une ligne de crayon de notre emplacement de départ à emplacement que nous avons placé à l'intérieur d'ici. Tout comme ci-dessus, nous pouvons placer des valeurs codées en dur comme celle-ci ou accéder aux variables telles que canvas.width et canvas.height. Faites en sorte que cela soit une largeur totale de la toile à traverser , accédez au canvas.width. Puisque nous ne voulons pas descendre sur l'axe des X, nous pouvons laisser cette valeur à zéro. Rafraîchissons. Nous ne voyons pas encore la ligne à l'écran car nous devons appeler ctx.stroke pour dessiner cela sur le canevas. C'est notre première partie de notre place. La prochaine partie consiste à descendre et à dessiner cette ligne verticale à partir de notre position actuelle, accéder à ctx, à la LineTo. Nous voulons toujours rester sur le côté droit auquel nous pouvons accéder avec une largeur de 250 ou, encore une fois, en utilisant la propriété canvas.widthproperty. Passez-le, canvas.width. Ensuite, pour descendre au bas de la toile, on peut y accéder avec toile.height. Dupliquez ceci. Nous resterons à la même hauteur de 250. Mais maintenant, nous devons passer à gauche, c' est-à-dire la valeur X de zéro. Enregistrer, rafraîchir. Encore une fois à faire. Mais maintenant, nous devons nous déplacer vers le coin supérieur gauche, soit la position de 0,0. Bien. Ceci est maintenant au carré sur le canevas, nous pouvons également ajouter une méthode au tout début, maintenir le chemin de début, également disponible dans le contexte. Nous allons le placer au tout début juste avant de commencer à dessiner notre forme. Cela est utile car il efface tous les chemins existants d'en haut, de sorte que nous n'avons aucun conflit. Cela signifie également que la position de départ est mémorisée. Nous pouvons utiliser un chemin fermé pour revenir à cet endroit à n'importe quel moment. Pour voir cela, nous pouvons supprimer notre dernière ligne, rafraîchir. Plutôt que de dessiner cela manuellement, nous pouvons maintenant revenir à notre emplacement de départ avec ctx.closepath. Il devrait fonctionner exactement comme avant, revenant à l'emplacement d'origine. En plus de créer des carrés, des rectangles, des cercles et des dessins à main levée, nous pouvons également écrire du texte sur le canevas. abord, nous pouvons définir la police que nous voulons utiliser, ctx.font, et la définir comme étant égale à une chaîne. La chaîne peut prendre en compte la taille des polices ainsi que la famille de polices. La méthode pour dessiner notre texte est CTX.FillText. Comme vous l'avez probablement deviné, il existe également une méthode StrokeText correspondante. La première valeur est une chaîne de notre texte, je dis juste Canvas API. Ensuite, un emplacement x et y, qui est la ligne de base de notre texte, donc 20 et 200, Enregistrer et actualiser. Il y a notre texte et il est également rose car il héritera la propriété FillStyle précédente, qui aura d'en haut. Canvas peut également être utilisé pour beaucoup d'autres choses, ainsi que d'autres méthodes que nous pouvons explorer et nous pouvons même ajouter des images au canevas que nous pouvons éditer en accédant aux pixels. Dans les prochaines vidéos, nous allons utiliser une toile pour créer les pizzas et afficher également les garnitures que nous avons ajoutées dans la cuisine. 41. Configuration Des Ingrédients: En haut de la section script, nous avons un tableau d'ingrédients contenant quelques ingrédients dont nous avons besoin pour fabriquer des pizzas. Ces cordes correspondent toutes aux ingrédients nécessaires dans les étapes requises d'en haut. Donc, si nous allons à la baie de pizzas, nous voyons le tableau des étapes requises. Il contient les cordes qui correspondent à nos ingrédients. Si vous modifiez l'une de ces pizzas pour utiliser différents ingrédients, assurez-vous que la gamme d' ingrédients est également mise à jour pour correspondre. Ce sera très important bientôt. Ce que nous allons faire dans cette vidéo, c'est de parcourir tous ces ingrédients, puis de les afficher sous forme de boutons dans la cuisine. Une fois qu'une pizza a été sélectionnée, le chef peut suivre cette méthode et préparer la pizza à l'aide de ces boutons. En utilisant également la toile, chaque bouton attirera les ingrédients sur la pizza. Défilons maintenant vers le bas de notre projet et nettoyons les exemples de la vidéo précédente. Nous n'avons donc besoin de rien de tel que le texte. Nous n'avons pas besoin de la section à main levée. Nous n'avons pas besoin du cercle. Vous n'avez besoin d'aucun de ces carrés ou rectangles. Mais nous devons garder l' accès à notre canevas, ainsi qu'au contexte 2D. Après cela, créez une nouvelle fonction appelée ListIngredients, qui parcourt tous les tableaux d' ingrédients d'en haut, et l'affichera dans le navigateur. Pour accéder à notre gamme d'ingrédients. Puisqu'il s'agit d'un tableau, nous pouvons utiliser la méthode FoReach, qui exécute une fonction pour chacune de ces valeurs. Cette fonction va également prendre en compte un ingrédient correspondant à chaque valeur de tableau. Ensuite, nous devons créer un élément de bouton pour chacun de ces ingrédients. que nous puissions en créer un manuellement ou nous souvenir, nous avons également accès à notre fonction d'assistance appelée BuildElement. Cela prend deux choses. Le premier est le type d' éléments que nous voulons créer, un bouton. Le second est le contenu texte à afficher. Ce sont les ingrédients de notre gamme, stockez-les à l'intérieur d'une constante appelée IngredientElement. Ensuite, pour notre style, nous pouvons également ajouter une classe appelée ingrédient pour accéder à nos constantes et ajouter le nom de classe de l'ingrédient. La dernière étape consiste à ajouter ceci au DOM, Documents.QuerySelector. Le sélecteur de requêtes dont nous avons besoin. Jetons un coup d'œil à la page d'index. Nous avons besoin de cette plongée avec des ingrédients. À l'intérieur, nous allons placer tout le contenu de notre tableau. Transmettez-le sous la forme d'une chaîne. Nous utilisons AppendChild passant dans notre constante d'en haut. Nous pourrions donc appeler cette nouvelle fonction immédiatement. Mais il serait probablement logique d' ajouter cela à la fonction GameStart, jeter un coup d'œil au début du jeu. À l'intérieur d'ici, nous l' appellerons par le bas. Sauvez, puis essayons ça. Rafraîchir Cliquez sur le bouton Démarrer, et tous nos ingrédients sont maintenant placés dans la cuisine en bas. Pour l'étape suivante, nous devons pouvoir cliquer sur n'importe lequel de ces ingrédients, puis faire quelque chose. Ce truc va être une fonction permettant de suivre les étapes que nous avons franchies jusqu'au fond. Créez une nouvelle fonction appelée StepComplete. Ensuite, une deuxième fonction va dessiner les ingrédients sur la toile. Fonction, faites de la pizza. Cette fonction StepComplete doit être appelée lorsque l'utilisateur clique sur l'un de nos ingrédients juste en haut. Pour cela, juste avant de l'ajouter au DOM, nous pouvons ajouter un écouteur d'événements en accédant à notre IngredienteElements.Add Event Lisener. Cela fait maintenant un clic, ce qui déclenchera une fonction appelée StepComplete. Puisqu'il s'agit d'un événement de clic, il va également prendre en compte les informations d'événement que nous pouvons stocker dans la variable. Cette fonction StepComplete e peut désormais être utilisée pour désactiver le bouton une fois qu'il est cliqué dessus, et également suivre les étapes que nous avons prises. étape 1 va donc désactiver le bouton lorsque l'utilisateur clique dessus. On ne peut donc pas cliquer deux fois sur nous. Je vais le faire en accédant à nos éléments avec e.target. Nous pouvons définir un attribut. L'attribut est désactivé avec la valeur true. Ensuite, étape 2, nous devons accéder au contenu texte réel de notre bouton. Nous connaîtrons donc le nom de l' ingrédient. Par exemple, nous devons saisir le texte de la pâte à rouleaux, la sauce à pizza ou le fromage, etc. Stockez-le à l'intérieur d'une constante appelée nom d'étape, accédez à nos éléments avec e.target. Ensuite, le contenu du texte intérieur. Avant d'aller plus loin, vérifions si cela fonctionne. Placez-le dans un journal de console. Nous avons le nom de l'étape. Sur le navigateur et dans la console. Commencez le jeu. Cliquez sur l'un de nos boutons, comme le fromage, la sauce à pizza. Ces boutons sont également désactivés. Gardez une trace des étapes que nous avons prises, de tous les boutons sur lesquels nous avons cliqué. Nous devons stocker cela à l'intérieur d' une variable contenant un tableau. Sautez donc à nos variables. En bas, laissez les étapes terminées être égales à un tableau vide. Vers le bas. Nous pouvons maintenant supprimer le journal de la console, accéder à cette variable d'étapes terminées, accéder à la méthode push, puis envoyer une nouvelle valeur vers ce tableau, qui est notre nom d'étape. La dernière chose est d'appeler notre fonction « faire des pizzas pour dessiner un nouvel ingrédient sur la toile. Bien sûr, il ne fait rien pour l'instant, mais nous pouvons placer cela à l'intérieur de la fonction. Alors, faites de la pizza. Insérez l' ingrédient de pizza du nom de l'étape. Maintenant que nous transmettons un ingrédient, nous pouvons mettre cela à l'intérieur de notre fonction et vérifier si cela fonctionne avec un journal de console. Supprimons tout autre journal de console que nous avons. Nous avons donc l'emballage de commande, le four, le texte de commande. Puis rafraîchissez-vous, redémarrez et cliquez sur l'un de ces ingrédients. On y va. Voici nos nouveaux ingrédients de Make Pizza Console Log. Cela nous laisse maintenant prêts à dessiner certains ingrédients sur la toile. Par exemple, si la fonction Make Pizza reçoit de la sauce à pizza, elle va dessiner de la sauce rouge sur notre pizza. C'est ce que nous allons passer à la prochaine étape. 42. Ingrédients circulaires de dessin: Au bas de notre script, nous avons actuellement cette fonction MakePizza et on l'appelle chaque fois que j'ajoute de nouveaux ingrédients. Il a également dépassé ces ingrédients. Ce que j'aimerais faire maintenant, c'est créer une instruction switch pour gérer ingrédient sur lequel on a cliqué. Nous pouvons ensuite dessiner cet ingrédient sur notre pizza près de la toile. Comme nous avons différentes options d' ingrédients, comme nous venons de le mentionner, nous allons le remplacer par une déclaration de commutateur pour traiter chacun de nos cas. Passer l'ingrédient sur lequel on clique, puis nous créerons un dossier pour chacun d'eux. le premier cas, il s' agit d'une chaîne et si nous faisons défiler vers le haut, nous avons nos ingrédients ici et chacun des caisses correspondra à chacune de ces chaînes. En bas, le premier en majuscules était pour ROLL DOGH. Nous nous occuperons de ce qu'il faut faire dans un instant, mais pour l'instant, nous allons simplement en sortir et nous allons simplement copier chacun de nos ingrédients. Le deuxième cas, c' était la SAUCE PIZZA. Le troisième pour CHEESE, puis PEPPERONI. Le prochain était pour JAMBON et ANANAS. Je vais juste laisser cela comme un ensemble d'ingrédients pour l' instant et vous pouvez ajouter tout le reste si vous préférez, mais je vais passer à autre chose parce que ce sera très long sinon. Désormais, à l'intérieur de chacun de ces cas, nous pouvons configurer certaines fonctions de dessin de toile pour représenter les ingrédients particuliers. Pour la pâte, pour la sauce à pizza et aussi pour le fromage, celles-ci peuvent être raisonnablement simples, il suffit de dessiner quelques cercles. Nous commencerons par la pâte à rouler. Nous savons d'après les vidéos précédentes que pour dessiner un cercle sur la toile, nous utilisons ctx.arc, puis nous fournissons l'emplacement de départ qui sera au centre. canvas.width divisée par deux et également la même pour la hauteur. Il s'agit de la position de départ x et y. Le prochain sera le rayon. Allons-y pour 100 pixels. Comme précédemment, pour créer un cercle complet en radians, la position de départ est zéro, puis la position finale est deux multipliée par la valeur de Math.Pi. Rappelez-vous que d'après les vidéos précédentes lorsque nous avons utilisé ctx.arc, il n'a pas dessiné quelque chose sur le canevas. Ce que nous devons faire, c'est soit utiliser ctx.stroke ou ctx.fill pour dessiner cela, mais en fait, nous allons utiliser les deux. La raison en est que nous utiliserons la méthode de remplissage pour dessiner la base de pizza complète sur la toile. Nous allons également faire une méthode de contour supplémentaire, qui va également ajouter un cercle extérieur de 15 pixels à cette pâte. La raison en est que nous allons définir une couleur légèrement différente pour nous donner l'effet de la croûte extérieure. Tout d'abord, ce que nous allons faire, c'est que nous allons nous concentrer sur la croûte et nous allons le faire avec CTX.LineWidth, définir cette valeur sur une valeur de 15 pixels, puis nous allons définir la couleur avec StrokeStyle passant dans une chaîne. qui sera une valeur hexadécimale de f5cf89 et pour finalement dessiner cela, nous utilisons ctx.stroke. Cela devrait maintenant nous donner un aperçu basé sur notre arc. Essayons cela, rafraîchissons, redémarrons, redémarrons, sélectionnons l'une de nos pizzas, la pâte à rouler, et nous voyons maintenant le cercle extérieur de notre pizza. Comme mentionné précédemment, il s'agit de la croûte, il faut donc ajouter la méthode pour remplir également la partie interne du cercle, mais une couleur légèrement plus claire juste après le trait. Mettez la couleur de notre méthode de remplissage et celle-ci sera f5d69d, puis remplissez le cercle avec cette couleur. Essayons ça. Revenez et recommencez, sélectionnez l'une de nos pizzas. Rouler la pâte. Nous ne devrions pas avoir cette couleur noire, alors jetons un coup d'œil. Ce FillStyle a juste besoin du hachage juste avant. Commencez. Sélectionnez l'une de nos pizzas, roulez la pâte, et c'est maintenant beaucoup mieux. Maintenant, jusqu'à notre sauce à pizza, qui sera également un cercle mais légèrement plus petite que notre pâte. Nous n'avons aucun conflit d'en haut. Nous allons commencer cette section avec CTX.BeginPath. Cela nécessite également un cercle, afin que nous puissions copier la méthode ctx.arc par le haut, qui devra également être au centre de la toile. Nous devons changer la couleur. Cela va être rempli, donc nous allons utiliser FillStyle, et celui-ci sera ed4434, enfin, appelez ctx.fill. Ensuite, nous passons également au fromage, qui reste une fonction de jointure circulaire. Nous copierons toute la section sauce à pizza, collerons dans notre zone de fromage, réduirons le cercle afin que nous puissions toujours voir la sauce autour du bord, mais nous devons également changer le couleur. Celui-ci est f7bc4d. Gardons cela et essayons cela avant d'aller plus loin. Encore une fois, nous pouvons sélectionner n'importe quelle pizza, ananas, pâte à rouler. C'est très bien, comme nous l'avons vu. Ensuite, nous allons essayer la sauce à pizza et tout cela va bien et cela couvre la même section de remplissage que la zone de pâte ci-dessus, mais nous pouvons toujours voir le contour du trait d'en haut. Ensuite, nous aurons le fromage, qui est un cercle légèrement plus petit, sorte qu'il ne couvre pas complètement toute la base de tomate. Bien. Nous allons laisser celui-ci ici pour instant et dans la prochaine vidéo, nous allons jeter un coup d'œil aux prochains ingrédients, qui seront un peu plus complexes que ces cercles. Plutôt que de créer des cercles comme nous le faisons, nous allons impliquer plusieurs pièces à différents endroits. Nous vous verrons dans le prochain, où nous examinerons comment procéder. 43. Dessin de multiples pièces: En sortant de ma version de cette déclaration, j'ai encore le pepperoni, le jambon et les morceaux d' ananas à créer. Comme il s'agit de pièces distinctes, nous allons dessiner de nombreuses formes différentes sur notre toile en forme de pizza. Pour commencer, dans le pepperoni, juste en dessous du boîtier, puisque nous utilisons plusieurs pièces pour ces ingrédients, nous devons créer un éventail de lieux. Const, positions de pepperoni, qui va être un tableau. En fait, il s'agira d'un tableau de tableaux, car il s'agira d'un tableau de valeurs multiples. De plus, chacune de ces valeurs doit avoir un emplacement x et y pour chacune de ces pièces. Le premier, et bien sûr, tous doivent être conservés à l'intérieur des dimensions de la pizza. Mais ce sont tous des nombres aléatoires. Nous pouvons les ajouter et jouer avec eux si vous le souhaitez par la suite, ou vous pouvez les copier avec le mien. Le troisième sera 147 et 57. N'oubliez pas que chacun de ces sous-tableaux sera un nouveau morceau de pepperoni. La quatrième, vous pouvez ajouter autant ou moins que vous le souhaitez, 116, 134, 125, 190, 162, 165, 190, 85, 192, 142, 150, 115, 76, 95. Je veux commencer quelques autres pièces. Allons pour 80, 190, et le dernier, 61 et 135. Assurez-vous que c'est juste avant la clause de rupture et avant de faire autre chose, réfléchissons exactement à ce que nous devons faire ici. Un morceau de pepperoni n'est qu'un petit cercle. Nous savons comment dessiner cela à l'aide de l'arc. Mais la différence devra répéter cet arc pour chacun de ces endroits. C'est ici qu'une boucle peut entrer en jeu. Ce que nous allons faire, c'est que nous allons saisir nos constantes de positions de pepperoni. Ensuite, nous appellerons une boucle pour chaque boucle sur ce tableau. Transmettez une fonction qui prend le nom variable de la pièce. La pièce sera chacun de ces morceaux de pepperoni que nous allons dessiner. Pour ce faire, nous allons commencer par CTX.BeginPath sans aucun chemin existant pouvant être tracé. ctx.arc, dessinez chacun des cercles pour les morceaux de pepperoni. Ensuite, rappelez-vous que cela prend l'emplacement x et y pour le centre du cercle. Puisque ce qui doit être basé sur les emplacements ci-dessus, ce que nous allons faire, c'est d'accéder à notre pièce. La première position d'index de zéro, et pour l'emplacement y, ce sera la paix, puis le numéro d'index d'un. Passe-moi ça. Pièce, accédez au numéro d' index zéro, l'emplacement y est cette paix et le numéro d'index d' un, taille de 10. Créons un cercle comme zéro , puis Math.pi multiplié par 2. Donnons-lui une couleur avec CTX.FillStyle. Juste avant de dessiner ceci, qui est égal à une chaîne, je veux choisir la valeur hexadécimale de BD 3611. Enfin, nous allons dessiner ceci avec ctx.fill pour donner à cela notre couleur de fond solide. Essayons ça. Allez dans le navigateur. Nous devons commencer notre jeu et sélectionner l'une de nos commandes. De plus, la pizza, on roule la pâte, ajoute la source, le fromage. Nous savons que ça marche, après le pepperoni. Il y a tous nos cercles qui sont tous basés sur notre tableau, que nous avons créé à l'intérieur d'ici. Bien. Maintenant, jusqu' au jambon et vous pouvez aussi nous donner un coup de pouce si vous le voulez vous-même, vous vous sentez confiant de le faire. Cela va se baser sur une approche similaire à celle ci-dessus. abord, nous devons créer nos positions de jambon, qui est un tableau qui contient également des sous-tableaux, contiennent maintenant des emplacements x et y. Commençons par les créer et les stocker à l'intérieur d' une constante appelée HamPositions, notre tableau principal. Créez ensuite nos emplacements aléatoires. Le premier, le second de 108, 74, numéro 3, 147, 47, 130, 124. Encore une fois, vous pouvez les rendre complètement aléatoires et les modifier si vous souhaitez, 125, 160. Assurez-vous que tous ces éléments restent dans la zone Pizza Canvas, 159, 145 , 197, 82, 202 , 132, 158 et 90. Nous sommes presque là maintenant, continuons avec les deux derniers, nous allons faire 90, 140 et le dernier de 105 et 135. Tout comme ci-dessus, nous allons les parcourir avec une boucle FoReach. Nous sélectionnerons nos positions de jambon appelées boucle FoReach sur la matrice, qui prend en charge une fonction à chaque pièce. Mais cette fois-ci, plutôt que de créer des cercles à l'aide de la méthode arc, je vais utiliser la méthode FillRect pour les dessiner sous forme de rectangle. abord, nous allons définir une couleur avec CTX.FillStyle et la définir comme égale à une chaîne, qui est f58c8c. Ensuite, CTX.FillRect. Dessinez un rectangle solide sur la toile. Tout comme ci-dessus, cela va prendre les positions x et y, auxquelles nous pouvons accéder comme ceci avec nos positions de tableau x. C'est la pièce et le numéro d' index de zéro, qui correspond à chacune de ces premières valeurs de tableau. Ensuite, la deuxième valeur de tableau de la pièce, ce qui se trouve dans le numéro d' index d'un. N'oubliez pas qu'avec les rectangles, il s'agit de l'emplacement x et y du coin supérieur gauche du rectangle ou du carré Nous devrons également définir la taille, que nous voulons définir sur huit pixels large. , 32 pixels de hauteur. Essayons ça avant d' aller plus loin. C'est pour le jambon. Cliquez dessus et nous avons maintenant beaucoup de morceaux de jambon rose sur pizza. Vous pouvez jouer avec les positions si vous voulez que cela paraisse un peu mieux. Mais je vais passer au prochain, à savoir l'ananas. Pour gagner peu de temps, beaucoup de choses seront similaires à notre position de jambon, alors copions toute cette section, y compris la boucle for-loop. Collez cela juste en dessous de notre étui à ananas. Bien sûr, ce sera la position de l'ananas. Changez-le pour la boucle. Faites ensuite un tour de jeu avec ces valeurs si vous le souhaitez. Pour le FillStyle, nous changerons la couleur de ceux-ci pour qu'ils soient de couleur jaune d'ebe534, les rendront un peu différents en termes de taille, 12 et 18. Créez les cellules dans le démarrage du navigateur. Notre pizza. L'ananas fonctionne également. Comme je l'ai mentionné, il se peut que vous deviez changer position afin que nous n'ayons aucun chevauchement. Une dernière chose avant de terminer cette vidéo, c'est que nous allons également nous assurer que les morceaux d' ananas et de jambon sont placés sur la pizza sous différents angles. Actuellement, cela semble un peu ennuyeux car tout est dans la même direction. Mélangeons un peu cet angle pour chacune de ces pièces. Nous pouvons le faire avec rotation. Cela commence dans la section jambon. Juste avant de dessiner ça avec FillRect. Nous pouvons accéder à rotation, qui est également disponible dans le contexte. Cette valeur de rotation est exprimée en radians et non en degrés. Un moyen de le convertir à un certain degré est exactement comme ça. Nous pouvons transmettre notre valeur initiale. Si nous voulions que cela soit pivoté par une petite valeur telle que cinq degrés, nous pouvons le convertir en radians en multipliant cela par Math.pi divisé par 180. Il est donc beaucoup plus simple de travailler avec des degrés s'il est beaucoup plus facile de l' enrouler à l'intérieur de votre tête. Mais nous ne voulons pas conserver cette valeur codée en dur de cinq. Le but de l'ajout de cette rotation pour chacune de ces pièces est d'en faire une valeur légèrement différente pour chacune d'elles. Nous pouvons faire l'ajout en math.Random, qui placera dans une valeur légèrement différente pour chacune de nos positions et pour en faire un angle légèrement plus grand, car rappelez-vous math.Random est seulement entre 0 et 1. Nous pouvons multiplier cela par 2. s'agit également de copier cette méthode de rotation, et nous pouvons la réutiliser à l'intérieur de l'ananas. Juste avant d'utiliser FillRect, essayons cela, rafraîchissons et redémarrons. La sauce à pizza, le fromage, pepperoni, à côté du jambon. Si vous regardez de près, ces pièces sont légèrement déalignées. Aussi avec l'ananas, mais avec un ananas, comme vous pouvez le constater, nous avons un petit problème. C'est à ce moment que nous utilisons plusieurs ingrédients avec des valeurs de rotation. Cela se produit en raison de la rotation à la transformation. Lorsque nous effectuons une rotation, le Canvas tourne à partir de l'origine du canevas, qui est 0,0, tout en haut à gauche. Si nous ajoutons plusieurs rotations, chacune s'ajoute à la précédente, que nous avons définie. Nous en avons mis un pour le jambon, puis nous ajoutons à cela en ajoutant la rotation de l'ananas. Nous pouvons résoudre ce problème en réinitialisant l'origine de chaque nouvel ingrédient à l'aide d' un élément appelé set transform. Pour cela, dans notre fonction, je vais faire fonctionner la pizza. Juste avant les instructions du commutateur. Nous voulons appeler cette transformation ctx.set, qui va prendre six valeurs. Les six valeurs seront 1, 0, 0, 1, 0, 0. Ces six valeurs différentes peuvent être un peu déroutantes, d' autant plus qu'elles ne sont pas particulièrement regroupées ensemble. Nous pouvons voir la première valeur d' un et la quatrième est également une. Ces deux éléments concernent la mise à l'échelle, qui peut rendre un article plus grand ou plus petit. La première est la mise à l'échelle horizontale et la quatrième est une mise à l'échelle verticale. Nous ne voulons pas qu'aucune de ces valeurs soit augmentée ou diminuée, c'est pourquoi nous les conservons à une seule, qui correspond à la taille d'origine. La deuxième de la troisième valeur est liée à l'inclinaison. Nous ne voulons pas non plus biaiser aucune de nos pièces. Nous gardons ces valeurs comme zéro, ce qui signifie qu'il n'y a rien à définir. Ce qui nous intéresse, c'est ces deux derniers points. Nous avons défini ces deux dernières traductions horizontales et verticales pour revenir à zéro. Chaque fois que nous sélectionnons un nouvel ingrédient, la transformation de rotation, qui va regarder avant la remise à zéro, ce qui signifie que nous n'obtenons pas d'accumulation de ces valeurs de rotation. Essayons cela avec la transformation maintenant en place. Sélectionnez une commande. Maintenant, ce que nous recherchons, c'est que les morceaux de jambon et d'ananas reviennent dans les endroits d'origine. Tout cela fonctionne bien maintenant. Comme mentionné précédemment, vous pouvez créer d'autres étuis pour différents ingrédients si vous préférez ou si vous souhaitez une pratique supplémentaire. Le prochain, lorsque vous serez prêt, je vous verrai dans la vidéo à venir où nous viendrons cette toile une fois la pizza terminée. 44. Débarrasser La Toile: Lorsque nous avons fini de préparer la pizza, d'ajouter les garnitures, puis de l' ajouter au four, nous devons nettoyer la toile existante prête à réaliser la suivante. Comme vous l'avez peut-être deviné, nous créons une fonction qui va couvrir cela, et nous le ferons en bas de notre script. Créez une nouvelle fonction à l'intérieur d'ici pour couvrir cette fonction appelée ClearCanvas. La première tâche que je vais faire dans cette fonction si nous allons dans le Start ici et que nous sélectionnons l'une de nos commandes. N'oubliez pas que lorsque nous fabriquerons chacune de ces pizzas et que nous cliquons sur les ingrédients, le bouton est désactivé. Ce que nous allons faire, c'est que nous allons sélectionner tous ces boutons pour commencer. Nous allons passer en boucle sur ces boutons , puis nous supprimerons cet attribut désactivé. La première consiste à configurer une constante appelée étapes. Cela va passer en boucle tous nos boutons avec le nom de classe des ingrédients. Document.getElementsByClassName. Le nom de classe attaché à chacun de ces boutons est « ingrédients ». Un peu plus d'espace pour cela et si vous vous souvenez des premières vidéos lorsque nous utilisons GetElementsByClassName, plutôt que de revenir dans le tableau, cela reviendra dans la collection HTML. Nous avons des collections HTML. Nous ne pouvons utiliser aucune des méthodes de tableau telles que pour chacune d'elles. Ce que nous allons faire, c'est saisir nos étapes, puis nous convertirons cela en tableau, qui signifie que nous pourrons utiliser notre FoReach pour parcourir chacune d'entre elles. Nous allons le faire avec Array.From. Cela va créer un nouveau tableau à partir de nos étapes. Placez-le dans. Maintenant que nous avons un tableau, nous pouvons utiliser des méthodes de tableau comme FoReach, passer notre fonction. Nous aurons accès à chacun des éléments. À partir de ces éléments, ils peuvent supprimer l'attribut passant dans la chaîne de désactivé. Cela devrait maintenant passer en boucle sur tous nos ingrédients et supprimer l' attribut désactivé pour pouvoir être sélectionné sur la prochaine pizza. Ensuite, comme nous l'avons vu dans la vidéo précédente, nous avons parfois un problème où nous avons des valeurs de rotation pour le jambon et l'ananas. Ce que nous allons faire, c'est saisir ou définir Transform en haut de l'instruction switch, qui est juste ici. Les valeurs actuelles à l'intérieur d'ici réinitialiseront notre transformation si des rotations existantes ont lieu. La dernière étape consiste à effacer tout ce qui se trouve actuellement sur le Canvas et nous l'avons utilisé dans le passé avec CTX.ClearRect. Nous commençons en haut à gauche de notre Canvas, qui est zéro, zéro et pour effacer la taille réelle de la toile, nous pouvons accéder à nos variables avec canvas.width et également canvas.height. C'est ça. C'est notre fonction maintenant terminée. La dernière chose à faire est d' appeler cette fonction depuis AddToOven. Nous allons le sélectionner et regarder la fonction AddToOven. Juste sous DisplayOvenItems, collez-le dans nos instructions if. Bien qu'il y ait aussi une étape rapide que nous pouvons introduire, qui consiste à saisir notre variable qui est CompletedSteps. Réinitialisez ce tableau en tant que tableau vide. Essayons ça. Rafraîchissez le navigateur et il redémarre. Sélectionnez une commande. Actuellement sur du jambon et de l'ananas, on roule la pâte, on ajoute la sauce, fromage, le jambon et l'ananas. Ajoutez-le au four et maintenant notre toile est nettoyée et tous les ingrédients sont toujours disponibles pour la sélection de notre prochaine pizza. Je vais essayer un autre, le pepperoni, ajouter les ingrédients, l' ajouter au four, et tout cela fonctionne comme prévu. C'est maintenant le cas pour notre travail sur la toile et vous pouvez jouer avec des choses, vous pouvez étendre les choses et même ajouter des ingrédients supplémentaires si vous le souhaitez. Passons maintenant à la section suivante où nous allons terminer ce projet. 45. Pizzas dégustation: Cette nouvelle section va impliquer la fin de notre projet. L'une des choses à prendre en charge est de vérifier que le chef a terminé toutes les étapes requises avant d'ajouter la pizza au four. Donc, si la pizza est fausse, elle sera gaspillée. C'est ce que nous allons maintenant couvrir. Plus tard, nous afficherons également quelques statistiques à l'utilisateur, afin que nous puissions suivre ces pizzas gaspillées à l'intérieur d'une variable. Allons en haut de notre index.js. Faites défiler vers le bas jusqu'à nos variables. À l'aide du mot-clé let, créez une nouvelle variable appelée WastedPizzas, et nous garderons une trace du nombre de ces variables erronées. Ensuite, il revient au bas de notre script, et nous allons créer une nouvelle fonction pour gérer cela. Installez ça, appelez WastedPizza. Avant d'oublier, nous allons saisir notre variable WastedPizzas par le haut et nous allons augmenter cela et l'utiliser avec les statistiques plus tard. Ensuite, nous allons franchir toutes les étapes préparées pour la prochaine pizza. CompletedSteps, réinitialisez ce tableau comme étant vide. Enfin, nous appellerons ClearCanvas. Il s'agit de la fonction qui a été configurée dans la vidéo précédente, qui va réinitialiser le canevas et supprimer également l'attribut désactivé. Accédez à la page d'index. À l'intérieur de la cuisine principale, nous avons également un bouton auquel nous pouvons relier cela. Nous allons ajouter un EventListener à cet élément qui a appelé notre nouvelle fonction. Ci-dessous notre fonction Documents.QuerySelector. Ce bouton. Si nous venons de jeter un coup d'œil, il y avait l'identité du gaspillage. Ajoutez un EventListener, où nous écouterons l'événement clic, qui va appeler notre fonction ci-dessus. Essayons cela, sauvegardons et revenons à notre jeu et recommençons à zéro. Sélectionnez une commande. Nous allons faire cela mal, nous allons simplement cliquer dessus dans le mauvais ordre. Cliquez sur Déchets. Maintenant, une toile est en cours réinitialisation et nous voyons que nous n'avons pas cet article à l'intérieur du four. Cela nous prépare maintenant à la prochaine vidéo, où nous allons vérifier si le chef a pris les bonnes mesures pour préparer cette pizza. Si ce n'est pas le cas, cette fonction sera à nouveau appelée, mais cette fois automatiquement. 46. Vérifier les étapes: Cette fonction de pizza gaspillée que nous venons créer sera également utile une fois de plus, car nous allons maintenant vérifier que le chef a pris les bonnes mesures, ou ajouté les bons ingrédients sur la pizza avant de l'ajouter au four. S'ils se sont trompés, ce sera encore une pizza gaspillée. Pour dire ceci, si nous entrons dans notre jeu, sélectionnez l'une de nos pizzas. Actuellement, avant d'ajouter l'une des garnitures, nous pouvons cliquer sur le four et l'ajouter sans les bons ingrédients. Nous pouvons également continuer et en ajouter d'autres. Pour vérifier les ingrédients, nous pouvons créer une nouvelle fonction. Je vais le faire juste après l'avoir ajouté au four. Jetez un coup d'œil à notre fonction appelée ajouter au four, qui est un peu plus haut. Cela fait un moment que nous n'avons pas vu celui-ci. Il est ajouté au four. Juste après cela, nous allons créer notre nouvelle fonction, c' est-à-dire les étapes terminées. Ici, nous devons également prendre le nom de pizza, auquel nous comparons actuellement. Nous pouvons vérifier si les étapes sont correctes. Donc, en passant le nom de la pizza, que nous ajouterons lorsque nous appellerons cette fonction. Cette fonction renvoie une valeur booléenne vraie ou fausse selon que ces étapes sont correctes ou non. C'est vrai ou fausse valeur qui déterminera si nous pouvons ajouter la pizza au four et nous l' appellerons depuis notre fonction Ajouter au four. Passez à l'intérieur de l' instruction if où nous vérifions si nous avons un nom de pizza, créez une constante pour stocker la valeur renvoyée à partir de notre fonction que nous examinerons dans une minute. Nous appellerons cela peut ajouter au four. N'oubliez pas qu'il s'agit d'une valeur vraie ou fausse, et cela sera égal à notre fonction appelée étapes terminées. Rappelez-vous que cela doit également prendre en compte au nom de la pizza, que nous avons stocké ci-dessus dans cette variable. Juste en dessous, nous créons ensuite dans notre objet à pizza pour entrer dans le four. Maintenant, nous allons pousser ça vers le réseau de fours. Mais juste avant de faire cela, nous voulons nous assurer que cela se produise uniquement si la variable peut ajouter au four est vraie. Ce que nous allons faire, c'est que nous supprimerons toutes ces informations de notre objet jusqu'aux étapes terminées. Passez une instruction if pour vérifier si le four peut être ajouté est égal à vrai. Si c'est le cas, collez-le à nouveau. Notre pizza peut maintenant être ajoutée au four. Faisons un test rapide et vérifions que cela fonctionne. Nous allons entrer dans notre nouvelle fonction, et pour l'instant, nous retournerons simplement la valeur si elle est vraie. Nous devrions pouvoir ajouter n'importe laquelle des pizzas actuelles au four. Essayons ça. Cliquez sur le four, et ça marche. Mais maintenant, si nous arrêtons le jeu et revenons faux, j'espère que nous devrions maintenant bloquer toutes les pizzas d'être poussées au four. Je vais en sélectionner un, et cela empêche maintenant toutes les pizzas d' entrer dans cette section. Cela signifie que nous pouvons maintenant ajouter des conditions réelles à vérifier à l'intérieur d'ici. Pour ce faire, nous devons prendre les marches de toutes les pizzas. Pour commencer, nous devons réellement sélectionner nos objets de pizza. Ici, nous avions été passés au nom de la pizza et si nous jetons un coup d'œil à notre gamme de pizzas en haut. Nous allons utiliser ce nom pour trouver notre pizza particulière, puis retourner l'objet complet afin de pouvoir accéder à ces étapes requises. Allons-y et faisons-le maintenant. Nous pouvons déplacer les déclarations de retour, accéder à notre tableau complet de pizzas, puis utiliser la méthode de recherche JavaScript pour effectuer une recherche via ce nom de pizza. Pour ce faire, nous allons exécuter une fonction pour chacun des éléments de notre tableau et la stocker à l'intérieur d'une variable appelée pizza. Cette méthode de recherche va renvoyer une nouvelle valeur. Nous voulons vérifier si la pizza à laquelle nous accédons actuellement possède une propriété name égale à notre nom de pizza, puis elle stockera cette valeur renvoyée à l'intérieur d' une constante appelée objets de pizza. La prochaine chose à faire est de saisir les étapes de cet objet et de les stocker à nouveau à l'intérieur d'une variable ou d'une constante. Celle-ci s'appelle les étapes requises, et nous la définirons sur notre objet pizza ci-dessus. Filtrez cette option vers le bas pour enregistrer uniquement les étapes requises. Maintenant, si nous revenons à notre objet pizza tout en haut du script, il s'agit de la propriété steps requise laquelle nous venons d'accéder. Il s'agit d'un tableau de toutes les valeurs. Nous avons maintenant toutes ces valeurs nécessaires pour construire une pizza, et si vous vous en souvenez plus tôt, faites défiler vers le bas jusqu'à nos variables. Nous avons également une variable appelée étapes terminées, à laquelle un chef clique sur chacun des ingrédients. Nous devons maintenant comparer ces deux baies et vérifier que toutes les étapes incluses ont été prises en compte. De plus, si nous pensons à cela pour qu' une pizza soit prête à entrer au four, non seulement les étapes terminées devaient être correctes, mais elles doivent également être dans le même ordre. Par exemple, si j'ai la pâte, le fromage et la sauce dans cet ordre particulier, cela correspondrait techniquement à une margarita. Mais nous ne voulons pas que la source soit au-dessus du fromage ou que la pâte soit ajoutée en dernier. Nous pouvons vérifier cela à l'aide d'une méthode de tableau JavaScript appelée tous. Revenons à notre fonction, ce que je vais faire, c'est taper cette fonction et ensuite nous pourrons parler de ce qui se passe juste après. Nous pouvons accéder à nos étapes requises, c' est-à-dire le tableau de toutes les étapes nécessaires à la création d'une pizza, puis appeler cette méthode que nous venons de mentionner, qui était toutes. Cela va exécuter une fonction pour chacune de nos valeurs de tableau. En passant sous forme d'arguments, l'élément, l'index, puis renvoie une valeur, c' est-à-dire si l' élément est égal aux étapes terminées comme dans l'index. Enfin, nous allons simplement stocker cette valeur renvoyée à l'intérieur d'une constante appelée étapes de vérification. Juste pour expliquer ce qui se passait ici, nous allons parcourir toutes les étapes requises, puis nous stockerons cela à l'intérieur de la valeur de l'élément. Par exemple, lors de la première étape requise, qui est généralement la pâte à rôle, ce serait la valeur de cet élément. Le numéro d'index serait bien sûr zéro. Ensuite, nous vérifions à nouveau la toute première si cette valeur de pâte à rouler est égale à la première valeur des étapes terminées. Si cette pizza a été créée, ces deux valeurs doivent être égales à la pâte à rouler. Sur la deuxième boucle, cela équivaut généralement à la sauce. Ensuite, nous vérifions si la source est la deuxième valeur et ainsi de suite. Chaque méthode renvoie true si toutes correspondent une correspondance ou false si une ou plusieurs méthodes échouent. Il s'agit du test principal pour vérifier si la pizza est correcte avant d' entrer au four. Si nous le voulions, nous pourrions simplement l'utiliser comme notre seule et seule vérification, mais si nous l'utilisons, le chef ne sait pas exactement quels ingrédients ont causé le problème. Il ne saura pas s'il a utilisé trop d'ingrédients, pas assez d'ingrédients ou les mauvais. Pour cela, je vais configurer plusieurs conditions afin que nous puissions donner différents messages d'erreur. Cela transmettra certaines instructions if pour effectuer certaines vérifications. Mais le premier, nous allons vérifier si trop d'ingrédients ont été ajoutés. Nous voulons savoir si la longueur des étapes terminées est supérieure à la longueur des étapes requises. Si les étapes sont terminées, la longueur est supérieure aux étapes requises. Si c'est le cas pour l'instant, nous allons simplement placer dans un journal de console et nous en dirons trop. Copiez ceci, collez-le ci-dessous et modifiez-le par le symbole inférieur. Nous pouvons vérifier si un nombre insuffisant d' ingrédients n'a pas été utilisé. Si cela se produit, cela ne dira pas assez dans le journal de la console. Le troisième, nous allons vérifier si ces deux valeurs sont égales, alors assurez-vous simplement qu'elles sont correctement orthographiées. Nous vérifierons si les étapes terminées sont égales aux étapes requises. Nous vérifierons également si les ingrédients sont incorrects. Nous pouvons le faire avec notre variable CheckSteps et vérifier si la valeur est égale à false en ajoutant une exclamation. Fondamentalement, nous avons pris la bonne quantité de mesures, mais les ingrédients sont incorrects, mais cela enregistrera dans la console la valeur des mauvais ingrédients. Examinons cela dans la console. Ouvrez les outils de développement. Nous allons recommencer. Sélectionnez l'une de nos pizzas et prenons le pepperoni, qui est simple. Nous devons rouler la pâte avec de la sauce à pizza. Espérons que celui-ci ajoutera trop d'ingrédients, cliquera sur trop d'options. Essayez d'ajouter au four, j'en vois trop, rafraîchir. Allons-y encore une fois, Margarita. Nous ne cliquerons que sur l'un de ces ingrédients. Au four, il n'y a pas assez d'ingrédients, puis le troisième et dernier, nous vérifierons si nous avons inclus les mauvais ingrédients avec la bonne quantité d'étapes. Essayons ça. Nous savons que le pepperoni contient la pâte à rouleaux, qu'il contient la sauce, le fromage et le pepperoni Nous devons donc prendre quatre étapes mais nous assurer que ces derniers sont incorrects. Pepperoni, j'y ajouterai du jambon. Assurez-vous que nous sommes à quatre étapes. Cliquez sur le four et nous pouvons voir que nous avons utilisé les mauvais ingrédients. Bien. Nous avons nos messages et ceux-ci doivent également être affichés à l'utilisateur, et nous pouvons le faire si nous passons à notre index.html. Jetons un coup d'œil. Pour notre zone Message, nous avons cette div environnante et nos messages pour le chef, puis ce p avec l'identifiant du message. Nous pourrions écrire ces messages directement dans chacune de nos instructions IF et je les mettrai à l'écran, mais créons plutôt une fonction autonome pour les gérer car nous allons être en répétant ces multiples fois. Ajoutons notre fonction appelée ShowerRorMessage. Transmettez le message que nous voulons afficher. Si c'est tout, nous allons sélectionner notre zone Message que nous venons de voir à l'intérieur de la page d'index avec Document.QuerySelector. Transmettez l'identifiant du message, définissez le contenu InnerText égal à la variable de message. Maintenant, une fois que le chef a commis une erreur, nous voulons que cela disparaisse après un certain temps et nous pouvons le faire avec un SetTimeout. Transmettez ceci dans lequel prend une fonction , séparée par une virgule. La deuxième valeur sera le délai en millisecondes, disons donc deux secondes. Ouvrez le corps de la fonction. Tout ce que nous allons faire à l'intérieur d'ici est de copier cette zone de message, de le coller dans. Définissons cette chaîne comme une chaîne vide. Nous pouvons maintenant appeler cette fonction appelée ShowerRorMessage et placer les journaux de console juste au-dessus. Collez cela dans, ajoutez-y une chaîne. Vous avez également utilisé trop d' ingrédients. Copiez ceci. Le second, vous n'avez pas utilisé assez d'ingrédients, et le troisième vous avez utilisé les mauvais ingrédients. Essayons ça. Encore une fois, nous ferons le même test qu'avant. Sélectionnez une commande, donc nous en ferons trop peu. Vous n'avez pas utilisé assez d'ingrédients , alors nous en utilisons trop. C'est bien. Ensuite, le dernier quand nous utilisons les mauvais ingrédients, donc le pepperoni. Je vais ajouter quatre étapes : rouler la pâte, la sauce à pizza et les poivrons, et voilà. La dernière chose à faire est de s'assurer que ces pizzas ne s'ajoutent au four que si les ingrédients et les étapes sont corrects. Actuellement, comme nous l'avons vu plus tôt, cela contrôlait avec cette instruction IF, et cela ne s'ajoutera au four que si c'est vrai. Nous devons couper cette valeur vraie ou fausse, la renvoyer à partir de la fonction overblow appelée StepsCompleted. Actuellement, cette fonction est en cours d'exécution et nous effectuons toutes nos vérifications, mais nous ne renvoyons pas encore une valeur vraie ou fausse Nous devons donc l'ajouter en bas. Nous voudrons que cela revienne vrai uniquement si la capacité du four n' a pas encore été atteinte. Auparavant, nous avons configuré des variables appelées four et ovenCapacity que nous pouvons voir ici. J'ai le four qui est un tableau vide et aussi le four Capacité. Nous l'avons réglé pour ne contenir que six pizzas. Nous voulons également vérifier que nous n'avons pas trop de pizzas au four avant de retourner la valeur de true. Nous allons couper ça. Ajoutez une instruction IF dans laquelle nous allons vérifier si le four.length est inférieur la capacité du four qui est actuellement de six. Si c'est le cas, nous retournerons vrai, sinon nous retournerons faux. Nous y sommes presque maintenant, mais nous devrons également nous occuper de ce qui se passe si nous avons utilisé les mauvais ingrédients, car si nous gâchons une pizza, nous voulons également exécuter notre fonction WastedPizza, que nous créé précédemment. Nous pouvons le faire à l'intérieur de nos déclarations IF. Si nous avons utilisé trop d'ingrédients il s'agit d'une pizza incorrecte, exécutez notre fonction WastedPizza, puis revenez de cela. La prochaine étape consiste à vérifier si nous n'avons pas utilisé assez d'ingrédients. Cependant, nous ne voulons pas exécuter la fonction WastedPizza, car ils peuvent toujours avoir la chance d'ajouter les bons ingrédients par la suite. Tout ce que nous faisons, c'est revenir de tout ça. Pour le dernier où j'ai utilisé les mauvais ingrédients, nous voulons de nouveau exécuter la fonction WastedPizza, revenez de cela. Cela devrait maintenant nous laisser prêts à essayer cela lorsque nous avons créé la fonction WastedPizza en bas de la vidéo précédente. Jetons un coup d'œil à cela. Cela efface également le Canvas. Nous savons si cette fonction est en cours d' exécution et nous saurons également si la valeur de retour de true a été déclenchée car nous devrions voir une pizza dans le four, nous allons donc rafraîchir et essayer cela. Tout d'abord, choisissons le pepperoni. Je vais aller chercher les bons ingrédients : la pâte, la sauce, le fromage, le pepperoni et le four. C'est bien. Il est [inaudible] maintenant en cours de nettoyage, alors nous allons essayer un de plus, le jambon et l'ananas. Pour celui-là, nous allons le rendre inexact. Nous ajouterons le mauvais ingrédient, donc pas trop. Tout cela semble fonctionner parce que cette pizza n'est pas ajoutée au four mais la toile au fond est encore nettoyée et prête à ajouter une nouvelle pizza. 47. Achèvement des commandes: Lorsque nous aurons terminé toutes les pizzas sur une commande donnée, ce serait une bonne idée de terminer la commande afin que nous puissions passer à la suivante. C'est ce sur quoi nous allons nous concentrer dans cette vidéo. Juste avant cela, je veux résoudre un petit problème. Ce problème, si nous passons au navigateur et que nous commençons notre jeu. Cliquez sur l'une de ces commandes. Le problème est que nous pouvons cliquer sur ces ingrédients avant même d'avoir sélectionné l' une de nos pizzas. Non seulement cela laisse notre projet un peu étrange, cela signifie également que nous ne pouvons pas ajouter de pizza au four car nous vérifions ces ingrédients sélectionnés par rapport aux pizzas cliquées. Pour résoudre ce problème, il suffit de vérifier si la section pizza actuelle est la section pizza actuelle est réglée lorsque nous cliquons sur un ingrédient quelconque. Pour ce faire, jetez un coup d'œil à la fonction StepComplete, je vais donc effectuer une recherche. C'est celui dont nous avons besoin, juste ici. abord, avant de vérifier si une étape est terminée, nous pouvons faire une déclaration if tout en haut. Cela va vérifier si nous avons sélectionné une pizza. où nous pouvons le faire, si nous allons à notre Index.html dans le coin cuisine, ici, nous pouvons voir que nous avons cette période avec l' identifiant de la pizza actuelle. Lorsque nous sélectionnons une des pizzas ou que nous commandons, elle est ensuite placée dans cette section. Nous pouvons vérifier s'il y a contenu à l'intérieur de ces éléments. Pour ce faire, nous la sélectionnons avec Document.QuerySelector. Il s'agit d'une pièce d'identité, alors passez le hachage. L'ID était current_pizza. Nous pourrions vérifier s'il y a du texte intérieur ici ou s'il est égal à une chaîne vide. Si c'est vide, nous avons un problème, nous n'avons pas sélectionné de pizza. Ce que nous allons faire, c'est d'accéder à notre fonction appelée ShowerRorMessage, de la passer dans une chaîne d'abord, de sélectionner une pizza sur laquelle vous souhaitez travailler, puis nous en revenons, donc non le code ci-dessous est exécuté. Faisons un test. Nous pouvons accéder au navigateur, démarrer notre jeu et sélectionner l'une de nos commandes. Avant de sélectionner l' une de nos pizzas, nous allons essayer d'ajouter des ingrédients tels que la pâte à rouler, et nous voyons notre message d'erreur ici. L'étape n'est plus marquée comme terminée comme on peut le constater par le fait que ce bouton n'est pas désactivé. Maintenant, commençons à terminer notre commande. Pour cela, par exemple, il y a trois pizzas. Ensuite, nous voulons les faire trois, puis terminer notre commande. Pour cela, avant de laisser le joueur le terminer, il serait bon de vérifier d' abord qu' a créé suffisamment de pizzas pour terminer la commande. L'étape 1 consistera à stocker quelque part le nombre de pizzas sur chaque commande. Il existe plusieurs façons d'aborder cette question, mais je vais le stocker en tant qu'attribut lorsque nous créerons la commande. Jetez un coup d'œil à la fonction appelée CreateListOfPizzas , qui est ici. À l'intérieur de là où nous avons construit nos éléments particuliers, nous avons une portée avec la quantité actuelle de pizza. Par exemple, il peut s'agir de deux margheritas ou d'un pepperoni. Nous pouvons maintenant ajouter la quantité de chaque ligne de commande à une variable. Créons cette variable juste au-dessus, afin que nous puissions en garder une trace. tout le total des pizzas, et nous allons initialement définir cette valeur à zéro. Nous le réinitialiserons ensuite chaque fois que nous créerons notre liste de pizzas en définissant cette valeur sur zéro. Ensuite, juste en dessous, nous pouvons ajouter la quantité actuelle de pizza à la variable totale de pizzas existante. Juste pour clarifier ce que nous faisons ici, si nous avons une commande, par exemple, cette première a trois pizzas, celle-ci en a trois, et celle-ci en a quatre. Ce que nous faisons, c'est que nous bouclons toutes les pizzas, puis nous ajoutons cette quantité à notre variable. Ensuite, nous avons ce total pour l'ordre, auquel nous pourrons faire référence à l'avenir. Comme mentionné précédemment, nous allons utiliser cette quantité totale de pizzas et l'ajouter à notre commande en tant qu'attribut. Nous pouvons le faire lorsque nous créons la commande. Nous devons jeter un coup d'œil à la fonction CreateSingleOrder , qui se trouve juste en dessous. Juste en dessous de notre liste de pizzas, ce que nous allons faire, c'est que nous allons saisir l'emballage de commande, nous allons définir l'attribut que nous avons utilisé dans le passé. L'attribut, il va s' agir d'un attribut personnalisé, ce n'est pas l'un des attributs intégrés que nous possédons déjà. En général, lorsque vous ajoutez nos propres attributs personnalisés, nous avons le préfixe de données. Il s'agit de données, de pizzas totales, puis de la valeur, qui est notre variable ci-dessus nous avons créée appelée pizza totale. Ce que nous faisons ici, c'est chaque fois que nous créons une nouvelle commande, nous ajoutons un attribut de données appelé data-total-pizzas, avec le nombre total de pizzas sur la commande. Si nous sauvegardons cela, nous pouvons accéder aux outils de développement et vérifier que tout cela fonctionne. Rafraîchissez, puis commencez notre jeu. Maintenant, si nous sélectionnons l' une de nos commandes, jetez un coup d'œil à la classe d'enveloppe de commande, et vous pouvez voir que chacune possède ce nouvel attribut appelé data-total-pizzas, et la quantité de chacune de ces commandes. commandes. Cela signifie que nous avons maintenant le nombre total de commandes que nous devons créer. Auparavant, si nous examinons les variables, nous avons également créé une variable appelée pizzas complètes pour commande, que nous avons ici. Cela augmente chaque fois que nous ajoutons une nouvelle pizza au four, nous donne les deux valeurs qui devront maintenant être comparées. Pour ce faire, nous devons également créer un bouton pour terminer la commande, que le chef peut déclencher à l'intérieur de la cuisine. Ce bouton déclenchera une fonction, et nous pouvons la définir dans la fonction de sélection de commande actuelle. Jetez un coup d'œil à cela, sélectionnez la commande actuelle. Je vais créer un bouton à l'intérieur d'ici, car c'est ici que nous définissons l'ordre actuel sur lequel nous travaillons. En bas, juste en dessous de cette dernière ligne de code, mais toujours dans l'instruction if, et en dessous, et nous créerons une constante appelée CompleteButton. Dès le début, nous avons la fonction BuildElement, qui va créer un nouveau code HTML pour nous. Le premier bouton correspond au type d'élément que nous voulons créer, c' est-à-dire un bouton et la valeur qui correspond au texte complet. Ensuite, nous pouvons accéder à ce bouton, ajouter un nom de classe complete_btn. Ce bouton doit déclencher une fonction pour que nous puissions ajouter un écouteur d'événements, donc CompleteButton.AddEventListener. Eh bien, c'est maintenant un clic, ce qui va déclencher une fonction que nous allons créer dans un instant appelée CompleteOrder. Enfin, nous aurons notre OrderDiv, qui est cette section en cours de travail. Nous saisissons cela, puis nous pouvons ajouter AppendChild. Passez-le dans notre bouton Complete. Nous allons tester tout cela en ajoutant une simple alerte à l'intérieur de cette fonction. Créez la fonction appelée CompleteOrder. Maintenant, j'alerte avec le texte complet. Allons dans le navigateur et vérifions que cela fonctionne. Rafraîchissez et cliquez sur le bouton « Démarrer ». Sélectionnez l'une de nos commandes. Il y a notre nouveau bouton Complete qui déclenchera une alerte lorsque vous cliquez dessus. Bien. Maintenant que nous savons que cela fonctionne et qu'il a été déclenché, nous pouvons supprimer cette alerte, puis nous pouvons faire notre comparaison entre le nombre total de pizzas sur la commande et le nombre que nous avons créé actuellement. abord, nous allons récupérer notre commande actuelle, nous l'avons stockée à l'intérieur d'une constante appelée CurrenOrder. Je vais saisir ça avec Document.QuerySelector. Maintenant, comment pouvons-nous choisir la commande actuelle sur laquelle nous travaillons ? Eh bien, si vous vous rappelez plus tôt, lorsque nous avons cliqué sur le bouton « Démarrer », toutes les commandes à l'intérieur de la barre latérale, si nous sélectionnons une de cette classe de order_wrapper, puis, lorsque nous cliquons sur une, il est passé à la section «  Travailler sur ». La section Travailler sur possède également une pièce d'identité. Si nous faisons défiler vers le haut, c'est la section, juste ici. Nous pouvons récupérer l' emballage de commande qui se trouve à l'intérieur de cette section de travail. Nous pouvons le faire en le faisant passer dans un sélecteur CSS. Le travail sur la section, saisissant notre section juste ici. Ensuite, nous pouvons saisir notre section à l'intérieur, qui a cette classe d'emballage de commande. Nous pouvons le faire comme avec CSS, utiliser le symbole supérieur à, et avec cela étant une classe, nous utilisons le .order_wrapper. Sélectionnez cette commande stockée. N'oubliez pas que dans cette commande, nous avons ajouté le nombre total de pizzas pour cette commande, à l'intérieur d'un attribut personnalisé. Nous pouvons utiliser get attribut, transmettre dans le nom de l'attribut que nous avons donné, et c'était data-total-pizzas. Stockez-le à l'intérieur d'une constante appelée TotalPizzasonOrder. Ensuite, nous pouvons enfin faire notre vérification ci-dessous à l'intérieur d'une déclaration if. Nous avons le nombre total de pizzas que nous devrions avoir, et nous avons également stocké la variable précédemment appelée pizzas complète pour commande. Nous pouvons vérifier si les pizzas terminées pour commande sont inférieures la valeur ci-dessus appelée total de pizzas sur commande, si c'est le cas, nous avons une erreur, donc nous pouvons la transmettre dans notre fonction appelée ShowerRorMessage avec le texte « Vous n'avez pas fait assez de pizzas pour terminer cette commande ». Puis revenez de là. Essayons ça. Enregistrez ceci et Rafraîchissez. Ce que nous devons faire maintenant, c'est commencer notre jeu. Pour notre première commande, il y a trois pizzas, alors cliquez dessus. Maintenant, si nous essayons d'ajouter l' un à l'autre, et prenons le jambon et l'ananas. Nous allons créer le tout premier. Ajoutez-le au four. Nous n'en avons qu'un, cliquez sur « Terminer ». Maintenant, nous recevons le message d'erreur à l'intérieur d'ici. Tout cela semble maintenant fonctionner. Nous pouvons passer à la suppression de la commande une fois qu'elle est terminée. Juste en dessous de la déclaration if, nous voulons récupérer notre commande actuelle que nous avons stockée par le haut, et la supprimer de la section Working on avec la méthode remove. Cela supprimera réellement la commande de cette section, mais cela ne supprimera que la commande qui inclut le titre et les pizzas, nous devons tout de même prendre soin de retirer le bouton. La façon dont vous pouvez saisir ce bouton est de se souvenir que cette fonction de commande complète est déclenchée à partir de notre gestionnaire de clic sur le bouton, afin que nous puissions le transmettre dans le réel, mettre des informations avec l'événement. Nous pouvons y accéder avec e.target. Nous l'avons stocké à l'intérieur d'une variable appelée bouton Complete. Comme ci-dessus, nous pouvons accéder à cette variable et appeler la méthode appelée remove pour la supprimer du DOM. Nous allons également ajouter quelques statistiques à ce jeu ultérieurement, telles que le nombre de commandes terminées. Nous allons nous préparer à cela en créant une variable de en haut. Avec les autres, nous dirons que commandes terminées soient une valeur initiale de zéro. Revenez ensuite à notre fonction de commande complète où nous pouvons l'incrémenter de la valeur d'un, donc les commandes terminées, plus, plus. Maintenant, nous avons terminé cette commande, nous pouvons également réinitialiser cette variable appelée pizzas complétées pour commande. Nous pouvons réinitialiser cette valeur pour qu'elle soit égale à zéro, donc nous sommes prêts pour la prochaine commande. Sauvons enfin ça et passons à notre jeu, et nous pouvons essayer ça. Cliquez sur « Démarrer ». Ce que nous recherchons, c'est créer la quantité correcte de pizzas pour compléter cette commande. abord, le jambon et l'ananas vont compléter cela, donc nous en avons un, et nous avons également deux pepperonis à créer dessus. Nous allons en essayer un de plus. Nous devrions maintenant en avoir trois au four et trois qui sont également associés à cette commande. Cliquez sur « Terminer », et cela supprime désormais notre commande de la zone de travail. 48. Suppression des commandes: Lorsque vous testez ce jeu, vous avez peut-être remarqué un problème, lorsque nous cliquons sur le bouton « Démarrer », nous recevons les commandes, puis lorsque nous cliquons sur l'une des commandes pour le déplacer dans le en travaillant sur la section, lorsque les commandes sont régénérées, la même commande est toujours placée dans la liste. Nous voulons supprimer la commande 1 car nous y travaillons. Cela se produit pour chacun sur lequel nous cliquons. Pour résoudre ce problème, nous pourrions supprimer cette commande du tableau de commandes. Pour identifier la commande sur laquelle nous avons cliqué, nous pouvons ajouter un attribut de numéro de commande à chacune d'elles. De la même manière, lorsque nous allons dans la fonction CreateSingleOrder, rappelez-vous que nous avons ajouté tôt cet attribut personnalisé appelé data total pizzas. Cela nous a permis d'identifier nombre total de pizzas sur la commande, ce qui nous a permis de comparer cela à la quantité que nous avons créée. De la même manière, nous allons également ajouter nouveaux attributs personnalisés avec le numéro de commande, afin de pouvoir identifier celui sur lequel nous avons cliqué. Si nous examinons ci-dessus, nous avons déjà accès à ce numéro de commande. Il va être assez simple de le faire. Ce que nous allons faire, c'est dupliquer cette ligne pour créer un nouvel attribut. Copiez et collez celui-ci dans. Nous allons créer un nouvel attribut. Encore une fois, avec le préfixe de données personnalisé, il s'agit d'un numéro de commande de données. Passer ce numéro de commande. Ensuite, avant d'aller plus loin, sauvegardons cela et essayons cela dans le navigateur, ouvrant les outils de développement. C'est notre jeu. Maintenant, si nous sélectionnons l' une de nos commandes, il s'agit de votre OrderWrapper. Nous avons les données OrderNumber d'un, nous avons le numéro de commande 2, 3, 4, 5, etc. Maintenant que cela est en place, nous pouvons passer à notre code et supprimer cette commande du tableau de commandes. Un bon endroit pour le faire sera dans notre fonction appelée SelectCurrenOrder. Jetez un coup d'œil pour cela. Il s'agit d'une fonction qui est exécutée lorsque nous cliquons sur chaque commande. En utilisant cette constante de OrderWrapper, nous avons déjà accès au clic sur commande. À l'intérieur de l' instruction if ci-dessous, nous pouvons récupérer l' attribut de numéro de commande de l'OrderWrapper, puis nous efforcer de le supprimer. En bas, nous allons commencer par récupérer ce numéro de commande, installer à l'intérieur d'une constante appelée OrderNumber. Définissez cela comme égal à notre OrderWrapper. Dot Obtenez-Attribute. Numéro de commande des données client [inaudible]. Nous pouvons maintenant accéder à notre tableau de commandes. Nous pouvons utiliser la méthode de tableau JavaScript appelée Filter, qui peut prendre en charge une fonction, et pour rester courte, je vais juste placer dans une fonction de flèche. Dans chaque ordre, dans la variable d'ordre. Ensuite, nous voulons vérifier si le numéro de commande en question n'est pas égal à notre numéro de commande ci-dessus. Cela va filtrer toutes nos commandes et ne laisser passer que les commandes lesquelles on n'a pas cliqué. Cela nous donnera un nouveau tableau avec toutes les valeurs sauf celle-ci. Ce que nous pouvons faire, c'est de définir nos ordres comme égaux, ce qui remplacera le tableau d'origine. Revenons au navigateur et essayons cela . Commencez le jeu. Sélectionnez notre première commande. Maintenant, régénérons. Maintenant que nos commandes sont régénérées, nous ne voyons plus l'ordre 1 dans cette barre latérale. 49. Mise À Jour De L'interface Et Des Statistiques: Lors de la création de ce jeu, nous avons gardé une trace de certains chiffres, tels que les pizzas terminées, les pizzas gaspillées, ainsi que les commandes terminées. Ils vont maintenant être utilisés pour créer une section de statistiques à la fin de la partie. Cette zone apparaîtra à la place de la section Méthode. Nous allons donc masquer cette section et la remplacer lorsqu' elle n'est plus nécessaire à la fin du jeu. La section statistique se trouve déjà à l'intérieur de notre page d'index. Si nous entrons ici tout haut de la section principale, nous avons cette zone dans laquelle nous allons mettre à jour toutes ces trois zones avec nos variables. Cela reflétera également nos fonctions de début et de fin de jeu et se déplacera sur toutes les zones affichant et masquent des éléments dans certaines fonctions personnalisées. Actuellement, notre zone de statistiques n'est pas affichée car si nous entrons dans notre feuille de style, nous définissons ce type d'affichage comme aucun. Allons dans notre page d'index et si nous jetons un coup d'œil, cela démarrera la fonction de jeu juste ici. Cette zone est chargée de montrer et de masquer nos boutons de début et de fin une fois le jeu démarré ou terminé. Si nous faisons défiler vers le bas, il ajoute également ce message au début de la partie, qui est alors enlevé au bout de trois secondes. De plus, la fonction de fin de jeu rétablira ensuite le bouton Démarrer, puis masquer le bouton Fin. Pour refactionner ces deux fonctions, juste en dessous du jeu de démarrage, nous allons les déplacer dans une nouvelle fonction appelée interface utilisateur du jeu de démarrage. Puis faites défiler vers le haut. Nous allons découper nos deux zones qui affichent et masquent les boutons dans notre interface utilisateur. Ensuite, notre zone de message avec le délai d'attente défini pour cet arrêt. Lorsque cela est entré , nous pouvons appeler une fonction d'interface utilisateur du jeu de démarrage juste au-dessus à la place du code, qui sera coupé. même manière juste en dessous de la fin du jeu, créez une nouvelle fonction. Celui-ci est l'interface utilisateur de fin de jeu. Maintenant, ce que nous devons faire pour celle-ci, c'est copier une découpe de ces deux lignes en bas, et celles-ci dans la nouvelle fonction puis de l'appeler en place. Essayons cela, sur le navigateur et cliquez sur le « Jeu de démarrage ». Ceci est maintenant supprimé et nous voyons la fin de la partie. Maintenant, si nous cliquons sur « Fin », le bouton Démarrer s'affiche maintenant. Rien de différent, juste un refacteur pour garder notre code un peu plus organisé. Nous pouvons désormais utiliser ces deux nouvelles fonctions pour afficher et masquer la zone des statistiques. Nous commencerons par l'interface utilisateur du jeu de démarrage en bas du document .QuerySelector. Prenez la section de méthode originale que nous pouvons masquer en accédant au style.display et définissez cela comme égal à la chaîne de bloc, dupliquez cela, puis nous pouvons faire le contraire avec nos statistiques . Nous voulons que la zone des statistiques soit masquée, changerons cette valeur pour qu'elle soit nulle. Nous le faisons parce que nous voulons seulement que cette zone de statistiques apparaisse à la fin de la partie, mais nous allons le faire maintenant en inversant ces deux valeurs, au lieu de l'interface utilisateur de fin de jeu, la zone de méthode est va être masquée pour que nous puissions révéler la zone des statistiques en définissant cette valeur comme étant la valeur du bloc, sauvegardez-la et essayez-la. Allez au jeu, nous voyons la zone de méthode pour voir exactement ce que nous faisons avec chaque pizza et le jeu et nous voyons maintenant nos statistiques. Comme nous l'avons déjà vu, cette zone de statistiques n'est que le HTML Nous devons donc prendre soin d'ajouter nos valeurs variables à chacune de ces travées. Allez dans notre index.js à l'intérieur du document d'interface utilisateur de fin de jeu. QuerySelector. Le premier de nos domaines porte sur l' idée des commandes terminées, où nous pouvons définir le contenu du texte intérieur pour qu'il soit égal à notre variable portant le même nom. Copiez et collez encore deux fois. La section centrale a été complétée par des pizzas. Encore une fois avec le nom de variable correspondant. La troisième était des pizzas gaspillées et des pizzas gaspillées variables. Ces valeurs de variables gratuites doivent également être réinitialisées au début de chaque partie. Au début de l'interface utilisateur du jeu, il réinitialise toutes ces valeurs. La première était les commandes terminées à zéro, les pizzas complétées à zéro, et également les pizzas gaspillées 2. Essayons ça. Nous devrons créer de nouvelles commandes pour démarrer le jeu. Jambon et ananas au four et pepperoni. Gâchez également certaines de ces pizzas, donc nous avons quelques statistiques, terminez le jeu. Ne voyons aucune mise à jour dans les statistiques passons à notre code et vérifions cela. Où pouvons-nous mettre à jour cela ? Nous mettons à jour cela dans l'interface utilisateur de fin de jeu. Ces trois lignes. Nous pouvons voir ici que l'éditeur de texte a mis en évidence un problème avec les trois points. Nous avons des commandes complètes qui devraient être terminées, vérifiez la variable. Terminez tout cela. On dirait que c'est le bon résultat. Commande numéro 1, qui est le jambon et l'ananas, ajoutez-le au four, puis deux pepperonis , complétez la commande. Ensuite, nous allons essayer de gaspiller une commande, nous ajouterons du pepperoni et du jambon, ajouterons ça au four, ça va être gaspillé. Maintenant, cliquez sur « Fin », voir une commande terminée, ce qui est correct. En ce qui concerne les pizzas terminées rappelez-vous que cette variable n'est mise à jour que lorsque le four a terminé la cuisson. Une fois que la minuterie, qui est réglée sur 20 secondes, n'est qu'une fois ce temps de cuisson terminé il sera ajouté en tant que pizza terminée. Nous avons aussi gaspillé une pizza, donc c'est bien. Presque maintenant terminé avec cette vidéo, nous avons quelques choses à corriger également. Si nous cliquons sur le bouton « Démarrer », nous verrons exactement de quoi il s'agit. Nous jetons un coup d'œil dans la cuisine, nous en avons 11 à différents ingrédients et aussi la minuterie est allumée 271 secondes, mais si nous cliquons sur « Démarrer », nous continuerons à partir de là plutôt que redémarrage et les ingrédients sont également doublés. Résolvons ces deux problèmes dans notre interface utilisateur de début de jeu. Tout d'abord, nous réinitialiserons nos ingrédients en sélectionnant la zone HTML avec sélecteur de requêtes. Sélectionnez les ingrédients et réinitialisez cela en définissant le code HTML interne sur une chaîne vide. S'occupera également du compte à rebours en définissant la variable de temps de compte à rebours pour qu'elle soit égale à la durée du jeu. Essayez-le. C'est aussi le gibier, jambon et l'ananas, ajoutez-le au four. Maintenant, si nous terminons, nous démarrons la minuterie qui a été réinitialisée. Nous ne voyons qu'un seul ensemble d'ingrédients. Enfin, juste pour terminer la zone des statistiques, j'ai ajouté une animation de fondu à notre CSS. Si nous entrons dans notre feuille de style, jetons un coup d'œil à la décoloration. Création d'une animation simple à fondre dans la zone de départ à la fin du jeu. Il suffit de l'ajouter comme nom de classe à notre élément. Pour regarder l'interface utilisateur de fin de jeu, dupliquez n'importe lequel d'entre eux, saisissez tous les départs. Cette fois, nous allons définir le nom de la classe comme étant égal à la décoloration. Bien, passons un dernier test à l'intérieur du navigateur. Commencez le jeu, sélectionnez une commande, terminez la première, le pepperoni. Terminez deux de ces pizzas pour enfin accéder à nos statistiques , mettre fin au jeu. Bien. Avec cela en place, je vais maintenant dire que ce projet est terminé. Mais il s'agit probablement de quelques éléments qui peuvent être améliorés et de quelques petits problèmes qui peuvent également être résolus. Mais ce projet vise à apprendre JavaScript. Je pense que cela nous a donné beaucoup de choses à pratiquer et une bonne occasion de montrer comment toutes ces petites choses que vous avez appris pendant ce cours travaillent ensemble pour créer quelque chose de beaucoup plus grand. . 50. Introduction À La Portée: Une partie importante mais souvent déroutante de JavaScript est la portée. portée tout au plus basique est un moyen de placer des variables en groupes. Chaque groupe autorise un certain nombre d'accès. Cela signifie que nous pouvons garder un certain contrôle sur ce qui a accès à nos variables. Cela est logique car les variables contiennent tous nos éléments de données importantes. Pourquoi voudrions-nous qu'ils soient modifiés pour y accéder alors qu'ils n'en ont pas besoin ? Nous en voyons ici un exemple simple. Nous déclarons une variable appelée score. Nous avons ensuite une fonction pour mettre à jour la partition, consigner sur la console. Tout va bien ici. Mais qu'en est-il de cela, nous décidons d'ajouter un bonus de 10 points au score. Cette variable est créée à l'intérieur de la fonction, puis se connecte à la console. Encore une fois, aucun problème ici. La console affiche une valeur de 11. Les problèmes commencent lorsque nous essayons d'accéder à cette variable bonus en dehors de la fonction. Cela provoquerait une erreur avec un message sur la ligne de bonus n'est pas défini. Nous savons qu'il est défini parce que nous voyons qu' il n'est pas accessible en raison de sa portée. Cela revient à ces groupes dans lesquels les variables sont placées. Étant donné que la variable bonus est créée à l'intérieur de la fonction contrairement à la partition. L'accès à cette fonction est limité à toutes les fonctions. Mais comme nous le savons avec JavaScript, il n'y a jamais que cela. Il y a également quelques autres choses que nous devons comprendre. Pour la première fois depuis longtemps, nous pouvons sauter dans une nouvelle section, et c'est le numéro 9, puis sauter dans la première leçon, qui est l'introduction à la portée, qui a un index.html. Pour contrôler le niveau d'accès à une variable, cela dépend de plusieurs facteurs. Comme nous venons de le voir, l'emplacement dans notre programme où nous déclarons la variable ainsi que le type de variable que nous créons également . Nous pouvons créer des variables avec var, let et const et elles ont également un effet sur la portée. C'est le même exemple que celui que nous venons de regarder, où nous déclarons une partition en utilisant le mot-clé var en dehors de la fonction. Ensuite, à l'intérieur de la fonction, nous mettons à jour cette variable. Nous ajoutons un bonus, puis nous les enregistrons sur la console. Allons dans la console. Nous pouvons confirmer ce que nous venons de voir. Ouvrez-nous et nous attendons à la valeur de 11. Cela fonctionne parce que la variable de score est déclarée au niveau supérieur de notre programme et cela ne signifie pas qu'elle doit être physiquement placée au sommet, comme c'est le cas ici. Cela signifie simplement qu'il n'est pas imbriqué ou déclaré à l'intérieur de quelque chose d'autre, comme une fonction. Cela signifie qu'il est de portée mondiale et qu'il est accessible à l'échelle mondiale. Si nous essayons d'accéder à la variable bonus en dehors de la fonction de l'endroit où elle a été déclarée. Nous n'avons pas déclaré à l'intérieur d'ici. Voyons ce qui se passe en bas. journal de la console de placement, une variable de bonus, qui renvoie ensuite une erreur de bonus n'est pas défini. Cette variable bonus est limitée à l'accès uniquement à l'intérieur de cette fonction. Parce que cette fonction a également sa propre portée. Cela peut être utile pour les variables lorsque non, nous n'avons pas besoin d'utiliser ailleurs. Cela nous donne la sécurité de savoir que d'autres sections de notre code ne peuvent pas modifier ces valeurs. Cette portée de fonction signifie également que nous pourrions créer plusieurs variables portant le même nom, mais à l'intérieur d'une fonction différente et si nous en avons besoin, elles seraient complètement indépendantes. Nous pouvons également voir ce niveau d'accès à l'intérieur de la console du navigateur. Si nous supprimons d'abord ce journal de la console actualisez ce navigateur pour effacer ce navigateur. Ensuite, si nous saisissons le score de mot à l'intérieur d'ici et que nous saisissons, cela renvoie la valeur d'un. C'est exact car nous avons la valeur initiale d'un, puis notre fonction s'exécute et augmente cette valeur pour qu'elle soit la valeur d'un. Tout cela fonctionne car cette variable est globale. Mais ce que nous essayons d'accéder à notre bonus qui correspond à cette fonction. Essayons ça. Entrez et nous voyons le même message d'erreur que celui du journal de la console. En plus de ces fonctions, ces variables globales sont également disponibles dans d'autres instructions de blocs, telles que les instructions for loops et if. Essayons une déclaration if juste en dessous de notre appel de fonction. S'il s' agit d'un score, placez-le dans un journal de console avec la valeur de partition et cela devrait fonctionner comme prévu. Cela s'applique également aux autres instructions de blocage. Les instructions de bloc sont essentiellement des sections enroulées accolades, donc nous avons la fonction que nous avons ici. J'ai les instructions if, qui a aussi ces accolades bouclées, mais aussi des choses comme pour les boucles et les boucles de while aussi. Récapitulatif. JavaScript a le concept de portée qui nous permet de définir le niveau d'accès à une variable comme cet exemple, score est déclaré dans la section la plus externe de notre code, qui signifie qu'il est dans la portée globale. Des variables globales comme celle-ci sont accessibles n'importe où, y compris à l'intérieur des blocs de code enroulés accolades, c'est-à-dire les fonctions et les instructions if. L'inverse est vrai, cependant, lorsque nous déclarons une variable à l'intérieur d'une fonction, elle a une portée de fonction et ne sera pas disponible en dehors de ce bloc. Par conséquent, protégez la variable contre la mise à jour ou la suppression d'ailleurs. 51. Portée de nidification: Jusqu'à présent, nous voyons que la portée ne semble fonctionner que dans un sens, de l'extérieur vers l'intérieur. Les variables déclarées en haut, telles que cette variable de niveau global, sont disponibles dans d'autres fonctions ou blocs tels que cette fonction ici. Nous pouvons continuer en imbriquant d'autres déclarations à l'intérieur d'autres, et la portée continue de la même manière. L'accès est transmis du haut et du bas à chaque niveau, mais les nouvelles variables déclarées à l'intérieur des nouveaux blocs restent restreintes. Vous n'êtes effectivement pas renvoyé à des niveaux supérieurs. Lorsque nous voyons cela dans la vidéo précédente où nous essayons d'accéder à cette variable bonus en dehors de cette fonction et dans la portée globale. imbrication de portée est appelée étendue lexicale en JavaScript et dans de nombreux autres langages. Jetons un coup d'œil à ce que cela ressemble en action. Pour commencer, nous avons la même configuration que précédemment. Tout d'abord, modifions ce journal de la console, incluons le texte de la fonction interne. Nous le faisons donc, c'est un peu plus clair car nous allons maintenant étendre ce code, alors c'est toujours à l'intérieur de cette fonction nous pouvons imbriquer un bloc supplémentaire, comme une instruction if. Une déclaration if, où nous pouvons vérifier si le bonus est vrai, et si c'est le cas, sur la base d'un nouveau journal de console avec le texte des instructions in-if. Ensuite, nous pouvons ajouter à la fin la variable de bonus. Nous sommes maintenant à l'intérieur d'une instruction de bloc imbriquée. Nous essayons d'accéder à notre variable bonus à partir du niveau ci-dessus, alors que pensez-vous qu'il se passera ? Eh bien, essayons ça. Assurez-vous que vous étiez dans la section étendue d'imbrication et que celle-ci est ouverte dans le navigateur. Actualisez. Nous pouvons voir comme prévu, le code de la fonction interne s' exécutera parce qu'il n'y a rien pour arrêter cela. Ensuite, un niveau inférieur à l'intérieur de l'instruction if, non seulement le journal de la console s'exécute, mais nous avons également accès à cette variable bonus. Cela signifie que les blocs d' instructions imbriqués peuvent accéder à des variables depuis un niveau d'étendue externe ou supérieur. Mais qu'en est-il de l' inverse ? Mais nous pouvons essayer cela en ajoutant une nouvelle variable à l'intérieur de nos instructions les plus imbriquées, donc var bonus2, n'importe quel nombre convient à ce test et nous pouvons y accéder au niveau supérieur, qui est cette fonction interne, écrire ajouter la valeur de bonus2, enregistrer et rafraîchir, et maintenant nous pouvons voir que nous obtenons la valeur de undefined. qui signifie que nous pouvons clairement voir que cela ne fonctionne pas dans l' inverse. Nous ne sommes pas définis pour que JavaScript soit conscient de l'existence de cette variable, mais une valeur non définie lui est attribuée. En guise de note, si bonus2 était déclaré avec les mots-clés let ou const, il générerait une erreur plutôt que d'avoir une valeur indéfinie. Mais plus d'informations sur cette question bientôt. L'imbrication peut également se poursuivre aussi profondément que vous le souhaitez. Essayons d'ajouter une nouvelle instruction de bloc, telle qu'une boucle while. Encore une fois, il dispose également ses propres accolades pour enfermer le code et créer une nouvelle portée intérieure. abord, supprimons le bonus2 dont vous n'avez plus besoin. Nous pouvons le supprimer du journal, puis à l'intérieur de notre section la plus profondément imbriquée, nous pouvons aller plus loin. Crée une nouvelle variable appelée nombres sur laquelle vous allez faire une boucle et définissez cette variable comme un tableau de toutes les valeurs à l'intérieur d'ici. While loop, nous avons également besoin d'une valeur initiale que nous pouvons stocker dans i. Réglez cette valeur à zéro. Nous pouvons continuer à exécuter cette boucle alors que je suis inférieure à la longueur de notre tableau, auquel nous pouvons accéder avec des numéros, le terrain à l'intérieur de notre bloc de code ou notre section de portée. Placer un nouveau journal de console avec des numéros i, qui imprimeront chacun de ces numéros individuellement, donc ne restez pas coincé dans une boucle infinie. Nous pouvons augmenter la valeur de i à chaque fois. Essayons ça. Actualisez. Comme il va tomber les journaux de la console d'ici. Encore une fois, à partir de cette section la plus profondément imbriquée, nous accédons toujours à notre variable à partir d'un niveau supérieur, et nous pouvons aller encore plus loin et tester notre variable bonus et l' essayer à l'intérieur de notre section imbriquée. Collez ça dans, et il y a notre valeur de 10. En sortant également de l'exemple précédent, vous pouvez probablement dire ce qui va se passer si nous essayons de faire les choses dans l'autre sens. Si vous créez une nouvelle variable à l'intérieur de cette boucle While, alors sautez à l'intérieur d'ici. Mais le journal avec la nouvelle variable bonus3, qui est égale à n'importe quelle valeur, et ensuite nous pouvons essayer d'y accéder au niveau supérieur de notre fonction, alors ajoutez-le à l'intérieur de notre bonus de journal de console 3, rafraîchissez. Nous y voyons la valeur indéfinie. C'est ainsi que nous pouvons utiliser la portée dans les sections de blocs imbriquées. Nous avons également vu des exemples sur la façon dont portée n'est accessible que d'une seule façon. Les sections imbriquées, telles que notre boucle while, accèdent à n'importe quelle variable à partir d'une portée élevée, mais cela ne fonctionne pas dans l'inverse. 52. Bloc et fonction portée: Passez dans le fichier suivant qui est la portée du bloc et de la fonction. Nous ne sommes pas trop confus sur ce que nous allons maintenant regarder. J'ai gardé le même exemple de fonction que précédemment. Avec cet exemple ici, nous avons plusieurs variables imbriquées à l'intérieur de cette fonction à différents niveaux. Les fonctions se comportent différemment des autres blocs d'instructions. chaque fois que je mentionne des blocs, je fais référence au code entouré d'accolades, comme ces instructions if et aussi nos boucles. Avec une fonction comme celle-ci, nous ne pouvons pas accéder aux variables imbriquées à l'intérieur depuis l'extérieur. Si nous essayons de placer un journal de console juste après notre appel de fonction, accédez à notre bonus3. Vous voyez que le bonus3 n'est pas défini et le même pour d'autres niveaux tels que le bonus régulier. Nous avons également le même problème, mais peu importe que les variables situées au niveau supérieur d'une fonction soient imbriquées à l'intérieur d'autres blocs. Même si nous déclarons ces variables à l'aide let ou de const, ce sera également le même. [inaudible] var de laisser les mêmes résultats et aussi le même pour const. Retourne à var. C' est ainsi qu'une fonction se comporte. Il a sa propre portée et nous savons exactement où nous en sommes avec les variables déclarées à l'intérieur. Mais ce n'est pas simple avec les autres blocs. Si nous passons d'une fonction à un bloc, par exemple une instruction if, voyons ce qui se passe. Déplacez le mot-clé fonction et nous pouvons dire que si le score est égal à 0, rappelez-vous que le score est déclaré dans la portée globale. Nous avons toujours le console.log pour le bonus en bas. Maintenant, si nous essayons de nous rafraîchir, nous devons également supprimer notre appel de fonction. Cette variable bonus est désormais disponible. Mais qu'en est-il d'une variable profondément imbriquée telle que bonus3 ? Essayons ça. Rafraîchissez et celui-ci fonctionne également. Nous pouvons voir ici que les blocs se comportent différemment des fonctions concernant la portée. Cela se produit parce que les instructions de bloc n'ont pas leur propre portée. Eh bien, ce n'est pas strictement vrai parce que c'est vrai pour cet exemple que nous voyons ici. Mais en tant que développeur JavaScript, nous avons plusieurs choix en fonction de la façon dont nous déclarons nos variables. Les variables déclarées avec le mot-clé var, que nous avons délibérément utilisé jusqu'à présent, se comporteront toujours comme ceci. Mais l'utilisation de const ou let inside de ces blocs supprimera l'accès de l'extérieur et sculptera sur leur bloc actuel. Si nous voulions nous assurer que cette variable bonus n'était disponible qu' à l'intérieur de ce bloc et non à l'extérieur de ce que nous avons ici, nous devons nous assurer de déclarer cette variable l'aide de la const ou de la let mot clé. Essayons maintenant le bonus. Nous n'avons plus accès et aussi, la même chose pour const. Tout comme un récapitulatif lorsque nous avons déclaré des variables à l'intérieur des fonctions, nous n'avions pas le choix de restreindre l'accès à l'intérieur du bloc de fonctions ou assurer que c'est accessible de l'extérieur. Mais lorsque nous utilisons d'autres blocs, comme une instruction if ou une boucle, ces blocs nous permettent de choisir si nous voulons utiliser scope dans ou non. 53. C'est un grillage: Plus tôt dans le cours, j'ai brièvement mentionné un terme appelé hissage, et j'ai promis d'y revenir. C'est ce que nous allons maintenant couvrir. Nous avons déjà vu quelques exemples d'hébergement. Prenons d'abord quelques exemples pour voir ce qui se passe. Les fichiers de titre de cette section de levage contiennent quelques exemples et le premier peut être familier. C'était un exemple que nous avons utilisé précédemment dans la section des fonctions, et en haut, nous avons deux tableaux. Nous avons le pain et les brownies. Ensuite, nous avons une configuration de fonctions dans deux styles différents. Nous avons la déclaration de fonction ainsi que l'expression de la fonction. Les deux font la même chose que vous vérifiez si un ingrédient est présent dans le tableau sélectionné. Pourquoi est-ce que je vous montre à nouveau ce même exemple ? Eh bien, remarquez ici comment nous appelons la fonction dans la console de connexion haut avant la création de la fonction . Nous appelons ça « chèque ». Puisque notre code est lu de haut en bas, nous entrons dans l'appel de la fonction CheckAllergies avant même qu' il ne soit créé, que ce soit dans la déclaration ou dans la version de l'expression. Passons dans le navigateur et voyons ce qui se passe avec ce journal de la console. Voyons si nous récupérons une valeur renvoyée. Cela fonctionne avec la déclaration de fonction, mais qu'en est-il de l' inverse ? Nous commentons la déclaration et rétablissons l'expression, actualisation et cela renvoie une erreur indiquant que nous ne pouvons pas accéder à notre fonction avant l'initialisation. Ci-dessous, nous avons l'exemple 2, qui est une version vraiment simplifiée du problème. Nous créons un journal de console et nous nous connectons la valeur de la variable avant sa création. Nous l'avons déjà vu à l'intérieur de la console avant que cela fonctionne. Nous supprimons simplement cela avec l'actualisation d'erreur. Nous pouvons voir que cela fonctionne parfaitement bien. Cela fonctionne même si nous accédons à notre variable de nom avant qu' elle ne soit déclarée et cela devient encore plus bizarre si nous essayons de réattribuer une valeur de nom avant qu'elle ne soit déclarée. En haut, juste au-dessus de notre journal de console. Ce que nous allons faire, c'est de réaffecter ou de mettre à jour cette variable avec une nouvelle valeur avant même d'être créée. Cela fonctionne également. La nouvelle valeur mise à jour s'affiche dans la console. Bien que ces exemples soient variés, ils montrent tous une chose fondamentale. Nous pouvons souvent accéder aux variables avant même qu'elles ne soient déclarées. Cela nous amène à un terme appelé hissage. Juste avant de nous lancer dans ce domaine, je veux vous montrer autre chose, ce qui est une variance du dernier exemple. Que diriez-vous tout en bas si un journal de console transmettait la valeur du rôle ? Nous déclarons ensuite cette variable sans initialiser avec une valeur, puis nous lui donnerons une valeur à la fin. Essayons ça. Enregistrez et rafraîchissez. Vous pouvez voir cette version légèrement modifiée renverra la valeur indéfinie. En regardant ces deux exemples, cela peut sembler assez étrange car nous examinons comment accéder aux variables avant qu'elles ne soient déclarées et que les deux exemples sont assez similaires. hissage est souvent décrit comme le processus de JavaScript, en prenant nos variables et nos déclarations de fonctions et en les déplaçant vers le haut du programme ou vers le haut de leur portée, ce qui signifie qu'ils sont déclaré et prêt à y accéder à tout moment pendant notre code. Cela expliquerait beaucoup ce que nous venons de voir. Aucun code n'est physiquement déplacé ou déplacé vers le haut de notre programme. C'est le processus où nos variables et déclarations de fonctions sont placées en mémoire au moment de la compilation. Le code lisible par l'homme que vous écrivez, tel que JavaScript, peut être lu par un ordinateur. Il doit d'abord être converti ou compilé en coulisses en un ensemble d' instructions que les ordinateurs peuvent comprendre. C'est pendant cette phase de compilation notre code est lu ou passé pour la première fois. Nos variables et déclarations de fonctions sont ensuite stockées en mémoire. Pour clarifier, au cours cette phase de compilation, lorsque ce programme est passé pour la première fois, variables comme celle-ci sont d' abord stockées en mémoire, c'est pourquoi nous pouvons y accéder avant même que nous ayons l'impression d'avoir les a créés. n'y a pas de magie cachée dans les coulisses, pas de déplacement de notre code vers le haut du programme. C'est simplement notre code en cours de lecture et une référence à toutes les variables et fonctions stockées en mémoire. Cela explique quelques éléments tirés de nos exemples. d'abord, si nous examinons cet exemple de fonction en haut. Le premier exemple, la déclaration de fonction. Les déclarations de fonctions sont hissées. C'est pourquoi nous pouvons appeler cette fonction avant même qu'elle ne soit déclarée, ce que nous voyons avec notre journal de console. Cependant, les expressions de fonction ne sont pas hissées, et c'est pourquoi nous avons constaté une erreur dans la console. Par exemple 2, le tout premier. Puisque ce nom de variable de Chris est hissé, c'est pourquoi nous pouvons y accéder avant même qu'elle ne semble avoir été créée, bien que cela soit différent pour la deuxième version, qui revient en arrière indéfini. Pourquoi pensez-vous qu' il y a une différence entre ces deux variables ? Eh bien, il est important de comprendre ce qui est stocké exactement. Pour mieux comprendre cela, revenons rapidement aux bases des variables. Plus tôt, nous avons examiné certains de ces mots-clés liés à des variables et une déclaration est lorsque nous déclarons une variable que vous souhaitez utiliser, puis lui attribuer un nom. Une fois que nous lui transmettons une valeur réelle, on parle d'initialisation. Vous avez une déclaration et une initialisation. Revenez à cet exemple pour notre variable de rôle. Ici, nous avons déclaré une variable vide , puis nous l'avons initialisée avec la valeur dev. Au début de la phase de compilation, seule la déclaration de variable vide est hissée et stockée en mémoire. Cependant, bien que la ligne suivante où nous l'initialisons, cette valeur de dev a été ignorée à ce stade. À ce stade, on lui attribue la valeur indéfinie. C'est pourquoi nous voyons non défini dans la console. Cependant, avec les exemples précédents depuis que nous l'initialisons avec une valeur Chris, lors de la phase de compilation, sera affectée à la variable cette valeur sera affectée à la variable plutôt qu'indéfinie. Pour rendre les choses encore plus déroutantes, nous devons nous rappeler ici que nous utilisons le mot-clé var pour ces deux exemples. Son comportement est également différent avec le mot-clé let ou const. Si nous changeons notre rôle vers le bas pour être laissé, voyons ce qui se passe à l'intérieur d'ici. Nous nous connectons à la valeur du rôle, actualisons et maintenant, plutôt que la valeur indéfinie attribuée à cette variable, nous obtenons maintenant une erreur dans la console. Cette erreur indique que nous ne pouvons pas accéder à notre rôle avant l'initialisation. En effet, lorsque nous utilisons le mot-clé const ou let, il faut d'abord le déclarer avec une valeur avant de pouvoir y accéder. Si nous ne lui attribuons pas de valeur au préalable, elle recevra toujours une valeur indéfinie en coulisses, mais nous devons quand même la déclarer avant d'essayer d'y accéder dans notre code. Cela peut être un sujet difficile à comprendre surtout au début, car le hissage s'applique à ces trois mots-clés, il s'applique à let, var et const. Cependant, var fait les choses un peu différemment comme nous venons de le voir. Mais même si vous ne comprenez pas complètement ce qui se passait à ce stade, avoir une compréhension de base que les variables sont hissées peut vous épargner beaucoup de problèmes à l'avenir si vous exécutez dans une erreur similaire. 54. Zone morte temporelle: La zone morte temporelle est quelque chose qui semble plus difficile qu'elle ne l'est en réalité. La plupart des concepts qui l' entourent ont été abordés dans les vidéos précédentes. regardant le code dans la section script en bas, nous avons un journal de console et une variable. Nous savons qu'une variable créée comme celle-ci avec le mot-clé var trouvera accès avant d' être déclarée. Cela s'explique par le fait que la variable est hissée au sommet de sa portée. Nous pouvons le voir en accédant d'abord à cela et je le mettrai à l'intérieur de la console pour que tout fonctionne parfaitement. Mais comme nous l'avons également découvert, si nous utilisons les mots-clés let ou const les plus récents, le comportement est différent. Une autre façon d'examiner cela serait peut-être d' initialiser une variable avant de l'utiliser. Si nous supprimons la valeur et que nous l'initialisons à propos du haut, le nom est égal à Chris. Voyons ce qui se passe à l'intérieur d'ici. Nous avons toujours une erreur car nous essayons d'accéder à notre nom trop tôt avant même qu'il ne soit initialisé. Mais qu'en est-il si nous basculons autour des lignes 1 et 3 ? Eh bien, si nous en plaçons un tout en bas et que nous déplacons ensuite le mot-clé let vers le haut, cela renvoie plutôt la valeur indéfinie. Cela est également abordé dans la vidéo précédente. Si nous n'attribuons pas de valeur à une variable à l'aide du mot-clé let avant de l' utiliser, elle sera initialisée avec la valeur non définie. Const, let et var obtiennent tous une valeur indéfinie si nous ne définissons pas la valeur initiale avant d'essayer d'accéder à la variable. La différence est que var est accessible avant même qu'il ne soit déclaré, comme nous l'avons vu dans la vidéo précédente. En quoi tout cela est-il lié à la zone morte temporelle ? Eh bien, c'est simplement un nom donné à quelque chose que nous avons déjà vu lors de l'utilisation des mots-clés const et let. Il s'agit du nom pendant une période allant du moment où nous entrons dans une portée donnée, jusqu'au moment où une variable est initialisée ou accessible. Une variable peut exister, mais elle n'est pas encore initialisée. Si cela se produit, on dit qu'il se trouve dans la zone morte temporelle et nous ne pouvons pas y accéder ou l'utiliser comme nous le voulons. Si tout cela semble un peu déroutant, simplifions un exemple pour essayer de vous donner une meilleure compréhension. Ce que nous allons faire, c'est que nous supprimerons notre première ligne compte tenu du journal de la console et nous dirons que le nom est égal à une valeur. Si nous essayons cela, nous savons que cela ne fonctionnera pas comme nous l'avons vu dans les exemples précédents. En effet, depuis le début de la portée actuelle, nous entrons dans la zone morte temporelle. Ajoutons un commentaire, la zone morte temporelle commence. Tout cela se situe au niveau supérieur de notre script, donc c'est dans la même portée. Il n'est pas imbriqué dans une portée interne telle qu' une fonction ou une instruction if. Ensuite, lorsque notre variable est initialisée à la ligne 14, la zone morte temporelle actuelle se termine et la variable est désormais accessible. Sa zone de début et de fin s'applique également à n'importe quelle autre portée. Par exemple, si cela se trouvait dans un certain bloc, exemple une fonction ou une instruction if entourée d' accolades, il en va de même. Dans cet exemple, il peut sembler que l'ordre du code est le facteur déterminant, car la déclaration de variable se produit après avoir essayé d'y accéder dans le journal de la console. Cependant, ce n' est pas le cas. Comme mentionné précédemment, la zone morte temporelle est une période allant du moment où nous entrons dans une portée donnée, jusqu'au moment où une variable est initialisée. C'est l'heure qui est importante et non l'ordre du code puisque le mot temporel se rapporte réellement au temps. Nous pouvons le voir si nous enveloppons ce journal dans une fonction. Créez une fonction autour de la partie supérieure. Disons d'obtenir un nom. Avec cette console, connectez-vous à une fonction, puis appelez notre fonction. Cependant, nous pouvons nous attendre à ce que cela provoque une erreur, comme nous l'avons vu précédemment. En regardant l'ordre du code, le journal de la console se produit toujours avant de déclarer notre variable. Il est compréhensible que vous vous attendiez peut-être à une erreur. Cependant, ce n' est pas le cas car la fonction est effectivement appelée en dehors de la zone morte temporelle. La zone morte temporelle n' est pas l'ordre du code, c'est le temps nécessaire pour rendre cette variable accessible. Il y a des choses compliquées à saisir ici ainsi que dans les dernières vidéos. Je ne m'attends pas à ce que vous obteniez complètement tout au premier essai, mais je pense qu'il est important de savoir que ces choses existent, car un jour, vous risquez de rencontrer un problème à cause d' elles. et cela peut simplement vous inciter à réfléchir à ces concepts et façon dont ils pourraient affecter votre code. Comment nous simplifier la vie et minimiser les erreurs ? Eh bien, un moyen simple pourrait être de mettre const et de laisser les variables au début de leur portée requise, que ce soit en haut d'une instruction if, en haut d'une fonction, ou même en haut de notre scripts. De cette façon, ils seront toujours prêts à être utilisés en cas de besoin. 55. Fermetures: Lorsque nous créons des fonctions, elles n'ont pas toujours besoin d'être autonomes. Ils peuvent plutôt être imbriqués dans le projet de démarrage. Dans cette section de fermeture, vous pouvez voir à l'intérieur d'ici que nous avons une zone de script vide. Nous allons maintenant créer une fonction simple pour démontrer l' effet des fermetures. Accédez à la section Script et créez une fonction régulière à l'intérieur. Je vais nommer celui-ci à l'intérieur avec une variable. Nous dirons la valeur extérieure. J'ai mis ça sur une chaîne extérieure. Nous pouvons maintenant imbriquer une fonction supplémentaire à l'intérieur d'ici. Je vais simplement faire sauter notre variable pour créer une nouvelle fonction. Cette fois avec le nom de l'intérieur. Nous ferons ce que nous avons fait juste au-dessus nous allons créer une nouvelle variable. Celui-ci peut avoir une valeur égale à la chaîne interne. Ensuite, à l'intérieur de cette fonction interne, nous créerons deux journaux de console. La première concerne valeur de la valeur intérieure, qui est contenue dans cette même fonction. Nous allons dupliquer cela et placer notre valeur extérieure. Nous savons, d'après des vidéos précédentes, que lorsque nous travaillons avec scope et lorsque nous imbriquons la portée dans des fonctions ou des crochets comme celui-ci, nous pouvons toujours accéder aux variables créées dans des niveaux externes, comme celui-ci ici. Fondamentalement, une portée interne peut accéder à des variables à partir d'une portée externe. Pour que cette fonction interne fonctionne et place nos journaux de console dans le navigateur. Nous devons appeler cela à l'intérieur d'ici, que l'on appelle notre fonction interne qui vous rend ce que l'on appelle notre fonction interne qui vous rend imbriqué à l'intérieur de la fonction externe. Enfin, nous appellerons notre fonction externe principale, nous le ferons également à l'intérieur d'un journal de console. Assurez-vous de placer les supports. Ensuite, testez cela en sautant dans la console. Nous voyons l'intérieur, nous voyons l'extérieur, ce qui est nos deux journaux de console. Ensuite, la troisième en bas est la valeur de notre fonction qui n'est pas définie. Nous pouvons ignorer cette valeur non définie pour le moment car nous n'avons rien renvoyé de cette fonction. Mais nous savons maintenant que cela fonctionne puisque nous avons nos deux journaux de console, tandis que nous pouvons accéder aux deux variables depuis l'intérieur de cette fonction interne. Nous pouvons d'abord accéder à la valeur interne car elle est locale à cette fonction. Nous pouvons également accéder à la valeur extérieure raison de la chaîne de portée. La portée ou la portée lexicale, que vous avez mentionnée, permet à cette fonction interne d'accéder à nos deux variables. Qu'en est-il de cette fonction interne qui a été retirée de ce paramètre actuel. Je ne parle pas de déplacer physiquement la fonction interne ailleurs. Mais au lieu de cela, qu'en est-il si nous l'avons stocké dans une variable et que nous l' utilisions ailleurs ? Eh bien, pour pouvoir le faire, au lieu d'appeler la fonction interne tout en bas, nous la renvoyons plutôt, donc nous allons supprimer ceci, renvoyer la valeur de l'intérieur. L'important à comprendre ici, c'est que nous rendions la fonction interne réelle. Lorsque nous appelons cette fonction externe. Nous pouvons le voir à l'intérieur de la console. Nous nous connectons toujours à cela et exécutons également cela. Si nous l' actualisons, nous verrons maintenant cette fonction interne à l'intérieur de la console. Apportez avec moi ici sur celui-ci. Ce que nous faisons ici à ce stade, c'est que nous appelons cela un externe, qui renvoie la fonction interne. Cette fonction interne est fait un élément d'information autonome. Il n'a aucune référence à cette fonction externe ni à aucun contenu à l'intérieur. Prenons cette valeur intérieure, que l'on peut voir dans le journal de la console. Installez-le à l'intérieur d'une constante appelée Interact. Maintenant, au lieu de directement, je vais mettre la fonction extérieure. Nous pouvons nous placer dans notre actualisation constante et nous pouvons toujours voir que nous avons accès à cette fonction interne. Tout ce que nous faisons ici, c'est créer une variable qui stocke une référence à cette fonction renvoyée. Cette variable peut désormais être utilisée ailleurs. Maintenant, ce que nous avons, c'est une indépendance de référence de fonction de la fonction extérieure d'origine. Cela nous laisse maintenant une question clé. Cette fonction interne que nous avons stockée dans une constante accède à cette variable de l'extérieur. Eh bien, nous pouvons le découvrir en exécutant cette fonction plaçant les crochets juste après cette constante. Dites ceci, rappelez-vous que nous essayons toujours d'accéder à sa valeur extérieure. Rafraîchissez et nous voyons toujours nos deux journaux de console. Ce qui signifie que oui, nous pouvons toujours accéder à ces variables externes. Cela peut sembler assez étrange. Nous accédons à des variables qui ne semblent pas avoir de sens avec ce que nous avons déjà appris sur la portée. Tout cela concerne quelque chose qu'on appelle des fermetures. Une fonction, tout comme notre fonction interne ici, nous nous souviendrons également à quelles variables elle a accès. Dans notre cas, c'est cette valeur extérieure. C'est ce qu'on appelle une fermeture. La fermeture consiste à mettre une clôture autour de tout ce à quoi nous avons accès. Rappelez-vous toutes ces variables partout où cette fonction pourrait être appelée à l'avenir. Cela peut être utile maintenant, car au lieu de créer une valeur externe en tant que variable globale, nous pouvons plutôt restreindre cet accès à l'intérieur de cette fonction tout en autorisant tout type interne imbriqué. fonctions pour l'utiliser. Notez également que ce terme de fermeture ne peut se produire qu'à l'intérieur des fonctions. Ce n'est toujours pas clair. Jetons un coup d'œil à un autre exemple utilisant le score du joueur, qui doit être mis à jour. Nous allons simplement commenter tout cela et en bas. Créez une nouvelle variable. Défilons l'écran pour être égal à 0. Créez ensuite une nouvelle fonction appelée Update Score. Ensuite, ici, ce que nous allons faire, c'est réattribuer notre score avec la valeur du score actuel plus 10. Connectez-vous à la console. En bas, appelez notre fonction. Essayons ça. Cela devrait être une valeur de 10 puisque nous avons notre score initial de 0. Nous appelons ensuite notre fonction qui ajoute 10 à la partition originale, puis imprime la nouvelle valeur. De plus, si nous le mettons à jour plusieurs fois en appelant notre fonction plusieurs fois, ils devraient également fonctionner. Tout va bien, cela fonctionne comme nous le voulions, mais le score que nous avons en dehors d' une fonction est classé comme variable globale. Il peut également être mis à jour depuis d'autres zones. Au lieu de cela, il sera préférable d'avoir plus de contrôle sur cette variable et ne la mettre à jour qu'à l'intérieur des fonctions créées à cet effet. Vous pouvez penser que nous allons déplacer cette variable dans la fonction. Nous pouvons faire glisser ça vers le bas. Cette technique crée une étendue de fonction et sa variable n'est pas accessible de l'extérieur. Cela résout un de nos problèmes, mais cela en crée un autre. Voyons cela à l'intérieur du navigateur, rafraîchissez-le. Nous récupérons la valeur de 10 fois libres car la variable se réinitialise à zéro au début de chaque appel de fonction. De plus, s'il s'agissait d'un vrai jeu, nous pourrions également avoir accès à la variable de score en dehors de cette fonction. Peut-être faire quelque chose comme l'affichage à l'écran à l'utilisateur. Pour y parvenir, nous pouvons utiliser une fermeture pour imbriquer dans une fonction afin de mettre à jour la variable de score. Nous avons le wrapper externe du score de mise à jour. Ensuite, nous pouvons créer une nouvelle fonction imbriquée dans une fonction appelée augmentation avec notre variable de score à l'intérieur ainsi que le journal de console qui est la fonction interne, comme auparavant. Stockez également cette fonction dans une nouvelle variable. Le premier, nous dirons const, nouveau score est égal à cette valeur renvoyée. Nous pourrions toujours appeler cette fonction plusieurs fois si vous le vouliez. Mais cette fois, nous devons faire référence à cette nouvelle partition, donc elle change. Laissant également entre parenthèses juste après pour que nous exécutions réellement cette fonction. Essayez ensuite cela en rafraîchissant. Maintenant, cela a augmenté de 10 à chaque fois que nous appelons notre fonction. Cela résout maintenant les problèmes que nous avions auparavant avec la fonction de mise à jour originale du score. Avant de procéder à ces modifications, nous réinitialisons la variable de score à zéro. Cela signifie que, comme nous l'avons déjà vu, chaque fois que nous appelons cette fonction, le résultat était toujours de 10 et il ne l'ajoutait pas à chacun des appels. Les fermetures résoudront ce problème en mémorisant la variable de score en mémoire chaque fois qu'elle est appelée. Une variable de score a également portée plus étroite, de sorte que nous ne pouvons pas être mis à jour accidentellement ailleurs, comme nous le pouvions s'il s'agissait d'une variable globale. Pourtant, si nous n'avions toujours pas besoin d'accéder à cette variable de score depuis l'extérieur de cette fonction. Nous pouvons renvoyer une valeur et la stocker dans une nouvelle variable. signifie que nous pourrions toujours accéder à cette partition depuis l'intérieur de la fermeture et l'afficher à l'utilisateur final. 56. Un Peu De Fond: Cette nouvelle section contient de nombreux mots à la mode tels que : callbacks, asynchrone, synchrone, ainsi que quelques concepts qui peuvent être difficiles à comprendre sans connaître un peu nombreux mots à la mode tels que : callbacks, asynchrone, synchrone, ainsi que quelques concepts qui peuvent être difficiles à comprendre sans connaître un peu les raisons pour lesquelles nous les utilisons. Cette vidéo va essayer de les expliquer en termes simples et ce que chacun fait exactement. En commençant par le code synchrone. Chaque ligne de code ressemble un peu à une tâche, et chacune est terminée dans l'ordre. La ligne 1 sera lue, attendez que cela soit traité, puis passez à la ligne 2. Nous attendrons également que cela se termine avant de passer à la troisième ligne. Sur un petit programme comme celui-ci, cela n'a pas vraiment d'importance car les opérations sont rapides et faciles à traiter, et vous ne remarquerez aucun temps d'attente entre chacune d'elles. Mais dans les cas extrêmes, si une ligne n'a jamais terminé le traitement ou a pris beaucoup de temps, nous serons coincés. Sur le navigateur, nous pouvons voir quelques exemples simples de cela, alors sautez dans cette nouvelle section qui est le numéro 10, Async JavaScript. Dans une petite section d' arrière-plan nous avons deux exemples, mais nous allons maintenant nous concentrer sur l'exemple 1 qui n'est pas commenté et le HTML en haut. Nous avons le bouton et le titre de niveau 3. Ignorez l'image pour l'instant, c'est lié au deuxième exemple. Tout ce que nous faisons ici, c'est saisir ces deux premiers éléments. Nous interrogeons le sélecteur, nous sélectionnons notre bouton. Ajoutez un EventListener qui écoutera le clic et cette fonction déclenchera une alerte, puis, juste après, nous saisirons notre en-tête et définirons efficacement le contenu InnerText étant donné deux étapes de cette fonction. Les alertes peuvent être bonnes, par exemple, car elles bloquent l'exécution du code jusqu'à ce que nous le fermions. Maintenant, si nous ouvrons cela dans le navigateur, copiez le chemin d'accès, collez-le et actualisez, nous voyons notre bouton qui va maintenant écouter le clic. Je clique dessus, nous verrons alors la fenêtre contextuelle qui est la toute première ligne de notre fonction, puis si nous cliquons sur ce bouton, elle se ferme. La ligne suivante de la fonction est alors appelée, ce qui définira le texte intérieur de l'en-tête, de sorte que nous avons un ordre clair des choses en cours d'exécution. Nous avons l'alerte, puis une fois que cela est terminé, il passe à la définition du texte. Dans cet exemple, chaque ligne ne sera pas exécutée sur la précédente comme terminée. C'est ainsi que fonctionne le code synchrone. L'un des problèmes avec le code synchrone est qu' une seule ligne de code peut bloquer l'exécution du reste du programme, ce qui peut être évité en utilisant du code asynchrone. Le code est toujours lu dans l'ordre ligne par ligne, mais il n'est pas nécessaire d' effectuer une opération avant de passer à la ligne suivante. Effectivement, tout le code est exécuté puis déclenché un par un. Nous devons savoir ce qu'il faut faire lorsque chaque tâche est terminée, et c'est la partie clé ici, puis sur la procédure à suivre si le code récupère un succès ou s' il y a une erreur. En regardant notre deuxième exemple, il suffit de décommenter cette section. Ici, nous avons quelque chose qui s'appelle Fetch. Il s'agit de l'API Fetch, et n'oubliez pas que nous avons certaines API Web telles que Canvas. Cette API Fetch nous permet de récupérer des choses sur un réseau, qui pourrait être un autre site Web, une base de données, un serveur ou une API externe créée par quelqu'un d'autre et ce qui est important Voici que l' appel de récupération est asynchrone. Il s'exécutera et permettra ensuite au reste du code ci-dessous de s'exécuter également avant qu'il ne soit terminé ou qu'il récupère des données. L'idée principale ici est que nous obtenions des données d'ailleurs que de l'intérieur de notre propre application. Cet exemple montre comment sélectionner une image de Wikipédia, puis stocke la valeur renvoyée dans une variable. Commençons par consigner la valeur de retour de cette variable dans la console. Il suffit de décommenter ce premier exemple, puis de le placer dans un journal de console avec la valeur de la variable ImageSource du navigateur. Plongez dans la console et nous verrons quelque chose qui s'appelle une promesse. Nous recevons une promesse et le résultat est entre parenthèses, alors de quoi pensez-vous que cela pourrait être le cas ? Eh bien, nous allons bientôt examiner les Promesses plus en détail, mais cela remonte au point important que j'ai déjà mentionné. Lorsque vous utilisez du code asynchrone ou asynchrone pour faire court, nous devons gérer ce qui se passe si le code récupère un succès ou s' il y a eu une erreur, et une Promise peut gérer cela pour nous. Lorsque nous avons demandé cette image pour la première fois à Wikimédia, nous ne savons pas pour le moment si le site Wikimédia est en panne, fonctionne lentement ou s'il y a un problème de connexion entre nous et leur serveur. Ce journal de console ci-dessous a été immédiatement appelé après notre récupération, il a donc été exécuté avant même que l' image ne revienne. C'est pourquoi nous obtenons le résultat de l'attente car nous n'avons jamais eu d'image pour se connecter à la console. Par exemple, si cela est en attente et que nous n' avons pas d'image, que diriez-vous si nous essayons de retarder le journal de la console de trois secondes ? Eh bien, nous allons couper ça. Nous pouvons placer un délai d'attente qui déclenchera une fonction, et disons trois secondes. À l'intérieur de la fonction, placez un autre journal de console avant, actualisez et vous pouvez voir au bout de trois secondes, notre promesse est maintenant remplie. Nous avons une réponse, donc attendre trois secondes, cela nous donne le temps de récupérer les informations ou l' image dont nous avons besoin. Au lieu de cela, s'il s'agissait d'un code synchrone, le reste du code devra attendre sur cette image pour revenir pendant trois secondes, même si nous n'avions pas besoin de l'utiliser. Sinon, si nous ne l'avons jamais géré de cette façon, la ligne qui suit immédiatement notre appel de récupération peut essayer accéder à notre image que vous n'avez pas récupérée, ce qui provoque une erreur. Dans cette optique, nous examinerons promesses et autres moyens de gérer une réponse dans les prochaines vidéos. 57. Fonctions de rappel: Cette vidéo va vous présenter une fonction appelée fonction de rappel. Un rappel est juste le nom donné à une fonction qui est appelée après que quelque chose s'est produit. L'anomalie utilisée comme étape suivante à franchir une fois que quelque chose est terminé. D'après ce que nous avons déjà couvert, nous savons que le code asynchrone peut prendre un certain temps. Il peut s'agir d'obtenir des données d'une base de ou même de les enregistrer dans une base de données à titre d'exemple. Voyons comment cela peut affecter notre code. Le code de cet exemple commence par une liste vide et non ordonnée. Maintenant, notre script dispose d'un tableau d'utilisateurs vide. Une application typique avec des utilisateurs aurait probablement une fonction permettant d' appeler notre base de données et de mettre à jour le tableau de cet utilisateur avec le résultat. Nous avons une fonction pour simuler cela et ajouter deux nouveaux utilisateurs. Tout ce que nous faisons à l'intérieur de cette fonction, c'est d'accéder à notre tableau d'utilisateurs et de le placer sur des objets utilisateur. Ensuite, une fois que nous aurons récupéré nos utilisateurs de notre base de données, que nous assimilons ici, ce que nous voudrons probablement faire ensuite est de créer une nouvelle fonction qui récupère tous nos utilisateurs en boucle chacun, puis il les affiche dans le navigateur. Jetons un coup d' œil à la façon de procéder. Nous allons créer une fonction, disons ListUsers. Sous ListUsers va d'abord accéder à un tableau d'utilisateurs, nous allons passer en boucle avec FoReach, qui exécutera une fonction pour chacune de nos valeurs de tableau ou transmet le nom de variable de l'utilisateur. Ensuite, exécutez cela avant d'avoir cette liste vide non ordonnée, nous pouvons créer un nouvel élément de liste pour chacun de nos utilisateurs. Const elements est égal à Document.CreateElement, créez un nouvel élément de liste, puis ajoutez le contenu texte à l'intérieur, qui est le nom d'utilisateur. Documents.createTextNode où nous pouvons utiliser notre variable utilisateur et accéder à la propriété name. Comme toujours, nous devons créer notre processus en trois parties, qui consiste à créer les éléments, à créer le contenu, puis à la troisième partie, il faut les fusionner ensemble. Pour récupérer les éléments parents, nous appelons AppendChild, ajoutons le nom, puis ajoutons cet élément à notre liste non ordonnée. Commencez par saisir notre liste non ordonnée avec Document.QuerySelector, ajoutez-la dans notre liste non ordonnée puis AppendChild, qui est nos éléments. C'est pour notre fonction utilisateur de liste. Nous pouvons appeler cela ci-dessous et vérifier que tout fonctionne dans le navigateur même les noms de nos deux valeurs de tableau. Cela fonctionne très bien. Nous n'avons aucun problème avec les données fonctionnelles car nous savons qu'elles se trouvent dans ce même fichier. Mais de façon réaliste, ce que nous allons probablement faire est de récupérer nos utilisateurs d'une base de données, et cet appel de base de données serait asynchrone et peut prendre un certain temps. Si tout cela s'est bien passé, le délai sera faible, mais néanmoins un retard. Pour simuler ce délai, nous pourrions également ajouter un SetTimeout à nos deux fonctions. Je vais attraper nos utilisateurs, nous allons couper ça, passer un appel SetTimeout, puis une fonction. Je voudrais simplement ajouter un délai d'une seconde à cela. Ouvrez le corps de la fonction et collez-le dans notre tableau d'utilisateurs, et voyons maintenant ce qui se passe dans le navigateur. Rafraîchissez, et même après une seconde, nous ne voyons pas nos utilisateurs dans le navigateur. Maintenant, les utilisateurs ont été répertoriés depuis que nous sommes immédiatement Lupin des utilisateurs en bas parce que notre fonction est appelée immédiatement. Cela se produit effectivement avant le délai d'une seconde depuis notre délai d'attente, ce qui signifie que lorsque nous essayons d'accéder à nos utilisateurs, il n'a aucune valeur. C'est une chose courante à gérer Lorsque vous travaillez avec des données stockées en externe, nous demandons essentiellement les données dont nous avons besoin, mais nous devons également nous assurer que les données sont retournées et disponibles. avant de pouvoir y accéder en toute sécurité. Il doit être en ordre pour que les choses ne se cassent pas. Même si nous appelons les fonctions dans le bon ordre, nous avons donc créé nos utilisateurs puis nous listons nos utilisateurs, le délai est à l' origine du problème. Nous pouvons également le confirmer avec certains journaux de console. Tout d'abord, si nous les mettons dans un juste après l'endroit où nous créons nos utilisateurs, placez-le dans le premier et nous dirons qu'il s'agit de la fonction GetUsersFromDatabase, puis en placer un à l'intérieur de notre fonction d'utilisateur de liste avec le texte des utilisateurs de la liste. Si ce délai n'était pas de haut en bas, vous vous attendez à voir le premier journal de la console, suivi de celui-ci juste ici. Mais si nous sauvegardons et actualisons, le contraire se produit, nous voyons la liste des utilisateurs froid avant GetUsersFromDatabase, et nous savons que c'est la mauvaise façon de contourner ce que nous devons faire. Ce serait bien que cette fonction utilisateur de liste ne soit appelée qu' une fois que le code dans un délai d'attente a été considéré comme un succès, et que nous puissions le faire en introduisant une fonction de rappel. Pour ce faire, nous déplacerions la liste utilise l'appel de fonction, retirez-le, puis transmettriez la fonction de rappel dans GetUsersFromDatabase. Cette fonction de rappel sera ensuite prise en tant que paramètre à partir de la création de notre fonction. Comme tout autre paramètre, ce nom est à la hauteur. Il n'est pas nécessaire que ce soit un rappel, nous allons placer ça dedans juste pour qu' il soit clair ce que nous faisons. Maintenant, nous pouvons appeler cette fonction de rappel à la fin de SetTimeout. Juste après notre journal de console, nous appellerons cela en tant que fonction, puis nous pourrons revenir à la console et voir dans quel ordre ils apparaissent. Rafraîchissez et nous obtenons une erreur à l'intérieur d'ici. Nous disons que le rappel n'est pas une fonction. Callback. Cela ne doit pas avoir les appels de fonction car nous ne faisons que passer une référence à cette fonction. Maintenant, rafraîchissez-vous. Les choses semblent fonctionner dans le bon ordre. Nous récupérons nos utilisateurs de la base de données, puis nous listons maintenant les utilisateurs peuvent également les voir réintégrés dans le navigateur. Cette solution est un rappel asynchrone. N'oubliez pas qu'à partir de la dernière vidéo, cette synchrone fait référence au code qui s'exécute dans ordre et qu'une opération doit se terminer avant de passer à la suivante. En utilisant cet exemple que nous venons de faire, une fois que les utilisateurs sont revenus avec succès de la base de données, que nous simulons avec notre setTimeout, nous pouvons ensuite utiliser notre fonction charbon retour la liste des utilisateurs, et de cette façon si les choses sont conservées dans le bon ordre. Nous pouvons également transmettre des arguments supplémentaires à cette fonction. Disons que nous voulions uniquement obtenir les utilisateurs qui avaient le rôle d'administrateur, nous pouvons le transmettre à l'exception du paramètre. Maintenant, lorsque nous appelons notre fonction comme transmettant le rôle d'administrateur, c'est tout à fait correct. Nous pouvons transmettre autant d'arguments qu'un, deux à la fonction. Nous devons veiller à ce que le rappel soit toujours le dernier. Cette méthode de transmission de fonctions en tant que paramètres de fonction n' est pas nouvelle. Nous pouvons le voir si nous revenons à un fichier précédent. Ouvrons la barre latérale, passons à la précédente et dans le premier exemple où nous avons ajouté un écouteur d' événements. Nous écoutons d'abord cliquer, puis comme le dernier paramètre qui a déclenché une fonction. Ici, nous le transmettons dans une fonction de rappel que nous voulons exécuter une fois que quelque chose a été cliqué, et nous considérons également une méthode de tableau que nous avons examinée quelque chose comme pour chacune, que nous avons dans cet exemple actuel. Chaque élément à l'intérieur de notre tableau, nous exécutons ensuite une fonction à l'intérieur de laquelle est également un rappel, signifie que cette technique n' est rien de nouveau. Lorsque nous parlons de rappels, il s'agit généralement d'une façon traditionnelle plus ancienne de faire les choses. Nous examinerons ensuite des méthodes plus modernes. Mais les rappels sont vraiment importants à prendre en compte, car ils sont encore nombreux et sont toujours utilisés aujourd'hui. rappels sont eux aussi un peu haineux dans le monde JavaScript et non pas parce qu'ils ne fonctionnent pas. C'est plus parce que la façon dont les choses peuvent facilement devenir désordonnées. Cet exemple que nous venons d'utiliser n'est pas trop mauvais. Parce que tout ce que nous avons, c'est une seule fonction, qui rappelle ensuite une deuxième fonction. Mais le problème réside lorsque nous avons un rappel, qui appelle une autre fonction de rappel, qui appelle une autre fonction de rappel, etc. Même en regardant cet exemple, la fonction liste des utilisateurs peut également avoir besoin de son propre rappel. Ensuite, ce rappel peut aussi avoir besoin son propre rappel, puis nous sommes coincés dans une longue chaîne. Nous pouvons également comparer cette chose à notre propre vie. Nous avons un ordre de tâches que vous souhaitez accomplir dans un certain ordre. Disons que nous voulons conduire la voiture. Mais avant de pouvoir conduire la voiture, nous devons marcher jusqu'à la voiture, avant de marcher jusqu'à la voiture, nous devons trouver les clés, avant cela, nous devons nous habiller et ainsi de suite. Il s'agit d'une série de tâches qui reposent sur la précédente à accomplir en premier. Cela est comparable aux fonctions de rappel appelées une fois le code précédent réussi. Ce sont ces multiples rappels qui peuvent entraîner un gros gâchis. Pour en voir un exemple, nous avons créé quelques petites fonctions de démonstration. Nous allons tout commenter d'en haut. Maintenant, créez de nouvelles fonctions. Le premier est GetOutOfBed, placé dans le fichier console.log, dit hors lit, puis dupliquez-le trois fois de plus, ce qui nous donne quatre fonctions. La seconde consiste à trouver nos clés et juste console.log. Le suivant est à pied jusqu'à la voiture, et le dernier est de conduire la voiture. Je dirai oui, puisque notre tâche est terminée. En utilisant ce que nous savons de notre précédente démonstration de rappel, chacune de ces fonctions doit être transmise à la fonction suivante en tant que rappel. Appelez ensuite cela à l'intérieur de chaque fonction. Le premier sort du lit. Cela va prendre en compte un rappel, qui s'exécutera tout en bas, passe aussi dans le second, appelez notre fonction. Nous n'avons pas besoin d'ajouter cela à notre dernière fonction car elle n' appellera aucune autre fonction, car c'est notre résultat final. En fait, cela a déclenché cette chaîne d' appels de toutes ces fonctions, nous allons créer une autre fonction pour appeler toutes ces fonctions. Créez une nouvelle fonction appelée CompleteTasks. Nous pouvons appeler cette fonction, qui est CompleteTask transmet la première fonction qui transmet la première fonction que vous souhaitez rappeler. Notre premier dans notre commande est GetOutOfBed. Ce que nous allons faire maintenant peut paraître assez complexe, mais il s'agit essentiellement de la même configuration qu'avant. Nous obtiendrions les utilisateurs de la base de données Seulement cette fois, il y a plus d'une fonction dans la chaîne, que nous rappellerons, puis à l'intérieur de la fonction CompleteTask, nous pouvons ensuite imbriquer chacune de nos fonctions pour appeler à l'intérieur. Le premier est de sortir du lit. Passez une fonction. Passons à la console et voyons ce qui se passe. Si nous nous actualisons, nous voyons le texte hors du lit à l'intérieur de la console et si nous regardons vers le haut, il s'agit du journal de la console tout en haut. La prochaine fête sera essentielle pour comprendre tout cela. Ce que nous allons faire ici, c'est que nous créons notre première fonction appelée CompleteTask. Cela est ensuite appelé à notre première étape, qui est de sortir du lit, puis nous passons une fonction à l'intérieur. Cette fonction est acceptée comme rappel, puis cette fonction est appelée à la fin de cette fonction. Fondamentalement, une fois cette fonction terminée, elle appellera notre deuxième fonction, qui est imbriquée à l'intérieur. Cette prochaine section, que nous allons appeler, peut être notre prochaine étape, qui est findkeys. Laissez appeler cette fonction, findkeys doit également prendre en charge une fonction de rappel , alors transmettez-la. Cela devrait maintenant exécuter notre deuxième console.log. J'ai une erreur d'orthographe, donc on va juste changer ça, Findkeys. Maintenant, nous avons notre deuxième console.log, donc va s'exécuter dans cette section juste ici et ensuite il va exécuter cette fonction suivante est imbriquée à l'intérieur. Passer notre prochaine étape, qui est à pied jusqu'à la voiture. Walk to car prend également en charge une fonction de rappel. Nous sauvegarderons et actualiserons, enverrons des impressions du texte de marche. Il exécutera ensuite notre prochaine fonction, qui se trouve à l'intérieur. La dernière étape consiste à conduire la voiture. Il s'agit de la dernière étape, donc elle ne prend pas en charge une fonction de rappel. Nous pouvons simplement appeler cela une fonction régulière. Actualisez. Ce code est exécuté en même temps que toutes nos autres fonctions. Si vous le souhaitez, nous pourrions également transmettre des étapes supplémentaires ou du code supplémentaire à chacune de ces fonctions. Pour clarifier, tout ce que nous faisons ici est créer une fonction principale qui est exécutée, puis sa fonction appelle des fonctions supplémentaires à l'intérieur. Chacune de ces fonctions, nous attendrons que le code soit terminé à l'intérieur avant de rappeler la suivante. Si cela commence à paraître un peu désordonné, c'est probablement le cas, parce que c'est un gâchis, et c'est pourquoi autres façons de faire face à cela sont créées. Mais ce n'est pas parce qu' il existe de nouvelles méthodes cela ne signifie pas nécessairement que cela n'est toujours pas pertinent. rappels sont toujours un élément important de JavaScript, la fois actuellement et vous le verrez également dans le code hérité. Vous entendrez probablement ce genre de choses aussi appelé Callback ****, la Pyramide de Doom, rappels imbriqués. Il y a aussi beaucoup d'autres noms. Tous ces noms indiquent la même complexité des rappels imbriqués comme celui-ci. Dans les prochaines vidéos, vous découvrirez autres façons de gérer cela, notamment en utilisant les rappels de manière asynchrone avec des promesses. 58. Promises: Nous savons maintenant que la réalisation d'une demande asynchrone peut prendre un certain temps, peut-être quelques millisecondes, peut-être quelques secondes, minutes, voire même jamais terminée du tout. Souvent, lorsque nous parlons de cette chose, il s'agit de récupérer quelque chose d'ailleurs, comme un serveur, sorte de banque de données, une API ou un site Web externe. Une promesse est excellente pour gérer ce résultat. Promise est un objet et cet objet représente le résultat d'une tâche asynchrone. Le résultat peut être un échec, se peut que nous ne revenions pas du serveur ce que nous avons demandé, ou cela peut prendre un peu de temps. Les promesses s'accrochent à cette tâche et promettent de vous dire à l'avenir quand il connaîtra le résultat. Nous avons déjà vu des promesses et certains résultats. Il y a quelques vidéos, nous avons regardé un exemple simple de récupération d'une image de Wikimédia. Je vais utiliser l'API Fetch. Fetch est une opération asynchrone, et une promesse est renvoyée dans la console. Lorsque nous avons essayé d'accéder à la promesse trop tôt avant qu'elle n'ait fini de saisir l'image, les résultats étaient considérés comme en attente. Nous avons ensuite ajouté un petit délai avec un délai d'attente défini, qui a été modifié dans la promesse en cours de réalisation. Il s'agit de deux des trois États disponibles avec des promesses. En attente est l'état initial lorsque nous ne savons pas encore si la tâche sera terminée ou non, puis exécutée lorsque la tâche a été considérée comme un succès, exemple lorsque les données sont revenues et qu'elles sont maintenant prêtes à être utilisées. Nous avons également un état appelé rejeté lorsque la tâche a échoué. Nous ne disposons pas des données que nous avons demandées, et nous devons y remédier. Vous pouvez également entendre la parole réglée par des promesses. réglés lorsque nous connaissons le sort de la tâche, ce qui signifie qu'elle est accomplie ou rejetée. Nous n'avons pas besoin de savoir quoi que ce soit sur l'état en attente, car nous ne pouvons pas dire dans quelle direction il ira avec le résultat. Mais nous devons gérer un succès ou un échec. dans les fichiers de démarrage, qui est la section des promesses. Ici, nous avons un autre exemple d'utilisation de cette API Fetch. Il s'agit de récupérer des données à partir d'une API externe, et il ne s'agit que d'une URL externe. Cette URL va sélectionner une image de chien aléatoire. Nous pouvons le copier et le coller dans le navigateur. Nous pouvons voir que nous avons un résultat dans un format appelé JSON, qui signifie JavaScript Object Notation. Il s'agit d'une syntaxe permettant d'échanger des données sur le Web. Il ressemble à un objet JavaScript, mais il est en fait indépendant de la langue, ce qui signifie qu'il peut être créé et transmis par d'autres langues. Nous pouvons voir que nous avons un message contenant une URL pour une image de chien particulière, ainsi que le code de réussite. Nous pouvons copier cette image et coller ce lien, qui nous donne accès à l'image en question. J'ai installé l'extension du navigateur pour que cela soit un peu plus joli. Les vôtres peuvent paraître un peu plus difficiles à lire, mais les données doivent toujours être exactement les mêmes. Revenons à l'éditeur. Comme nous le savons, l' appel de récupération est asynchrone, sorte que nous pouvons gérer le résultat de la récupération de cette image avec la promesse. abord, nous pouvons gérer l'état accompli, ce qui est un succès, et nous le faisons en nous enchaînant à la fin de l'appel de récupération. Nous pouvons enlever le point-virgule, enchaîner à l'extrémité. Ensuite. C'est alors une méthode que nous pouvons enchaîner à une promesse. N'oubliez pas que lorsque nous utilisons l'API Fetch, cela renvoie une promesse comme réponse, qui signifie que nous avons accès à la méthode then. Passez une fonction. il s'agit d'un rappel asynchrone, nous n'exécuterons que le code à l'intérieur d'ici. Il souhaite savoir que la tâche a été exécutée avec succès. Bien sûr, nous voulons probablement accéder aux données que nous récupérons de l'appel de récupération. Cela peut être transmis à notre fonction, donc en transmettant tous les noms de variables tels que la réponse. Ensuite, nous pourrions enregistrer cela sur la console et vérifier si cela fonctionne. Je vais enregistrer dans le navigateur et ouvrir la console. Il y a une réponse. Cette promesse réussie renvoie un objet de réponse qui contient des détails sur ce que nous récupérons du serveur ou de l'API. Cet objet contient des éléments tels que le code d'état. Dans notre cas, c'est 200, ce qui signifie que tout va bien. Jusqu'au bas de l'URL, nous voyons l'URL réelle que nous avons demandée dans l'appel de récupération plutôt que l'URL de l'image que nous récupérons. La raison pour laquelle nous ne voyons pas cela est que toutes les données nous récupérons sont stockées dans cette section du corps. Si nous ouvrons cela , nous ne voyons toujours pas l'URL de l'image réelle. Nous voyons plutôt un flux lisible. Cela revient au format JSON mentionné précédemment. Pour lire ce format JSON stocké dans la section body, nous avons une méthode JSON que nous pouvons utiliser. Dans le journal de la console, nous pouvons ajouter à la fin la méthode JSON. Alors essayons celui-là. Enregistrez et rafraîchissez. Nous sommes de retour à une promesse dont l' état actuel est en attente, ce qui signifie que la tâche n'est pas encore terminée. En effet, la méthode JSON renvoie également une promesse que nous devons à nouveau gérer. Il existe plusieurs façons de le faire. abord, nous pouvons supprimer l'enveloppe de journal de la console et laisser Response.json. Puisque cette méthode JSON renvoie également une promesse, nous pouvons également enchaîner la méthode then. Transmettez-le, qui encore une fois, il exécute une fonction. De plus, cette fonction prend en charge les données de la réponse, donc transmet dans une variable de données. Nous pouvons ensuite enregistrer ces données sur la console. Essayons ceci, sauvegardons et rafraîchissons. Maintenant, nous avons réussi à transmettre notre contenu JSON, qui est stocké dans la section corps. Cela renvoie l'image réelle du chien, qui est stockée dans le message, ainsi que le succès en tant que code d'état. Il s'agit de la même réponse que celle que nous avons vue lorsque nous l'avons collée dans le navigateur plus tôt. Tout ici renvoie une promesse, l'appel de récupération renvoie une promesse, et le JSON renvoie une promesse. Mais une autre façon de le faire, que je préfère personnellement, mais c' est à vous de ne pas imbriquer les appels comme celui-ci. Dans la mesure du possible, je préfère les garder tous au plus haut niveau pour des raisons de lisibilité. Pour ce faire, nous devons découper la méthode imbriquée que nous venons d'ajouter. Nous le laisserons dans response.json à l'intérieur d'ici, et nous allons découper la deuxième et dernière série de crochets jusqu'à juste après response.json. Découpez ça. Maintenant, la fonction devrait simplement rester avec response.json. Assurez-vous que le point-virgule est retiré de la fin, et nous pouvons le coller à la fin, en nous donnant deux méthodes consécutives. Cependant, si nous passons au navigateur et que nous nous actualisons, nous voyons le message de non défini. C'est parce que nous essayons d'accéder aux données de notre méthode précédente. Mais d'abord, pour ce faire, nous devons le renvoyer. Tout cela fonctionne comme avant. Nous pouvons également enchaîner autant de ces méthodes que 1, 2, et chacune attendra la fin du résultat précédent avant d'exécuter le code à l'intérieur. Nous garderons le contrôle total notre tâche asynchrone et de l'ordre dans lequel le code est exécuté. Nous pouvons également filtrer cela comme n'importe quel autre objet. Nous pourrions accéder au message, qui est l'URL de l' image dont vous avez besoin. Nous pouvons cliquer dessus et l'ouvrir dans le navigateur. Nous pouvons également utiliser cette URL d'image et la transmettre à un élément d'image. abord, ajoutez un élément d' image vide juste au-dessus de notre script, puis dans la deuxième méthode, lorsque nous savons que nous avons accès à cette URL, nous pouvons supprimer ce journal de console, sélectionner notre image avec le sélecteur document.query, puis définissez l'attribut source comme étant égal à data.message. Enregistrons cela et actualisons le navigateur. Chaque fois que nous actualisons, nous récupérerons une image aléatoire différente de notre API. Il s'agit de l' état accompli géré. Mais qu'en est-il de s' il y a un problème et que nous retrouvons un état rejeté ? Cela se produira en cas d'erreur lors de la récupération des données ou de l'exécution de la tâche que nous avons demandée. Nous enchaînons à la fin une méthode de capture. Ici, nous enchaînons la méthode de l'événement , supprimons le point-virgule, puis nous enchaînons à la fin de la méthode catch que nous exécuterons en cas d'erreur, nous transmettons cette erreur à cette fonction de rappel. Beaucoup fonctionnent avec l'erreur basée sur un journal de console. Commençons par une chaîne d'erreur. Nous pouvons également ajouter à la fin le message d'erreur. Si nous le testons et l' actualisons, nous ne verrons rien à l'intérieur la console car l'image est renvoyée avec succès. Pour tester cela, nous devons entrer dans les outils de développement et accéder à l'onglet réseau. Je vais le sélectionner, et pour ce faire, nous pouvons désactiver notre réseau. Faisons en sorte que cela soit un peu plus grand. Chrome a ce menu déroulant que vous pouvez voir ici. Nous n' utilisons actuellement aucune limitation, mais nous pouvons également passer à une connexion lente ou même hors ligne. Si nous le faisons et que nous sautons dans la console et que nous nous actualisons, désactivation de ce réseau signifie que maintenant, nous n'obtenons pas l' image que nous voulons. La promesse devrait maintenant générer une erreur. Avec tout cela, la dernière chose que nous allons examiner est la méthode finale. La méthode finale s'exécutera peu importe si la promesse a été respectée ou si elle a été rejetée. Il peut également être enchaîné à la fin. Comme pour toutes les méthodes ci-dessus, nous devons également supprimer le point-virgule comme dans la méthode final, qui, à nouveau, exécute une fonction de rappel. Placer dans un journal de console avec le texte de, je vais toujours courir. Lorsque le réseau est toujours désactivé, nous pouvons actualiser et voir ce message. Rallumons le réseau, actualiserons, sautons dans la console, et nous voyons toujours ce journal de la console même lorsque la promesse a été couronnée de succès. La méthode finale est utile pour suivre un certain code que nous devons exécuter une fois la promesse réglée. Une alternative serait de placer ce code dans les sections de capture alors également. Mais cela entraînerait une duplication du code. C'est des promesses et comment cela peut être vraiment utile avec JavaScript asynchrone. Tout cela est possible car la méthode de récupération renvoie initialement une promesse de lancer toute cette chaîne. Mais qu'en est-il de choses qui ne renvoient pas une promesse ? Eh bien, ensuite, nous allons jeter un coup d'œil à la façon dont nous pouvons gérer cela. 59. Le constructeur de promesse: Dans l'exemple précédent, nous pourrions commencer à utiliser des promesses car l'API Fetch renvoie une promesse. Mais qu'en est-il des fonctions qui ne renvoient pas une promesse ? Pour lancer les choses, écrivons une simple fonction personnalisée, qui va s'exécuter et définir des données après un délai d'expiration. Je vais sauter dans le fichier constructeur de promesses, qui est actuellement vide dans le script pour créer une variable en haut appelée data. Définissez ce paramètre sur un objet vide. Créez une fonction appelée GetData. Ensuite, passer à l'intérieur dans notre setTimeout, qui va prendre en charge une fonction. En tant que fonction Ensuite , nous l'exécuterons après un délai de 2 000 millisecondes. Au bout de deux secondes, il suffit de définir la valeur de notre objet de données. Nous allons réaffecter cet objet pour qu'il s' agisse d'un nouvel objet dans lequel nous transmettrons une propriété name égale à une chaîne. Cela appellera GetData pour exécuter réellement notre fonction. Ensuite, à la fin, nous enregistrons la valeur des données, nous verrons ce que nous récupérons. Analyse de nos données. Nous pouvons également opter pour ce nom. Dans le navigateur, ouvrez le fichier et accédez à la console. La console affiche la valeur indéfinie. Cela n'est probablement pas surprenant car nous accédons à l'objet de données dans le journal de la console avant même de définir la propriété name, les données prennent deux secondes à être définies. Il s'agit d'une requête un peu simulée à une base de données, libre de gérer ce qui se passe entre la demande des données et leur retour. Aucune promesse n'est bonne pour cela, mais cette fonction ne renvoie pas de promesse par défaut. Pour cela, nous pouvons créer le nôtre en utilisant le constructeur de promesses. Les constructeurs sont quelque chose que nous avons déjà examiné avec le nouvel opérateur dans le passé. Nous avons examiné des choses comme un nouveau tableau. Nous avons examiné un nouvel objet et une nouvelle fonction. Tous ces éléments créent une nouvelle instance d'un objet. N'oubliez pas que les promesses sont également des objets. Nous pouvons également utiliser ce nouvel opérateur pour créer nous-mêmes une nouvelle promesse. Commentez d'abord notre exemple pour l'instant, qui est tout sauf la variable de données. Supprimez ceci. Ensuite, nous pourrons commencer à construire notre nouvelle promesse ci-dessous. Juste avec les exemples que nous avons vus précédemment, nous utiliserons le nouveau mot-clé pour créer une nouvelle promesse et ce constructeur prend en charge une nouvelle fonction qui va s'exécuter. Cette fonction prend deux paramètres optionnels, une fonction à exécuter si la promesse est résolue sur un, si la promesse a été rejetée. Ce sont les noms de notre choix, mais la résolution et le rejet sont assez descriptifs. Ce qui a été notre propre promesse personnalisée, nous avons défini exactement quand et où nous voulons que ces fonctions de résolution et de rejet s'exécutent. La première étape consiste à stocker notre promesse à l'intérieur d'une variable. Nous allons juste appeler cette promesse. Je peux appeler ça dans un instant. Mais j'appellerai simplement la détermination de résoudre cette promesse. Ensuite, nous pourrons utiliser cette variable de promesse qui est en dessous des méthodes froides, puis capturées et enfin puis capturées et enfin que nous avons examinées précédemment. Nous pouvons accéder à promett.alors, et cette méthode est exactement la même que celle que nous avons regardée dans la vidéo précédente, qui prend en charge une fonction qui va s'exécuter, le code a été un succès. Dans cette optique, nous allons placer dans un journal de console avec le texte du succès. Autorisez cela et assurez-vous qu'aucun point-virgule ne se trouve à la fin. Nous nous attacherons également à la fin de la promesse. La méthode de capture, qui prendra également en charge une fonction. Rappelez-vous que la méthode catch passera également l'erreur, que nous pouvons placer dans un journal de console. Passons maintenant à la console et voyons lequel d'entre eux a été enregistré. Nous voyons la valeur du succès, ce qui n'est pas surprenant parce que nous avons résolu cette promesse, ce signifie qu'il a été couronné de succès. Cette fonction de résultat peut également prendre en compte une valeur de traitement que vous souhaitez transmettre. Disons une série de succès. Ensuite, ce message de réussite sera également transmis dans la chaîne si cela a été couronné de succès. La section qui a réussi est la section de l'époque. Nous pouvons transmettre cela à notre fonction. Nous pouvons stocker cela dans une variable telle que la réponse, puis nous pouvons l' enregistrer sur la console. Rafraîchissez-vous, et voilà. Cela est pratique si vous devez transmettre des données ou des messages personnalisés à la section de résultats. Mais pour revenir à l'exemple précédent de récupération de certaines données que nous avions ci-dessus, ce serait un meilleur exemple que simplement d' envoyer un message. Ce que nous allons faire, c'est copier et coller cette section de délai d'attente depuis l'intérieur de la fonction. Ensuite, nous pouvons coller cela juste au-dessus la section des résultats et décommenter les trois lignes. Nous pouvons ensuite remonter la section des résultats pour être à l'intérieur du délai d'attente. Il définira également les données , puis résoudra cette promesse. Cela signifie que la promesse ne doit maintenant être résolue qu'une fois les données définies. Nous pouvons tester cela en vous connectant à la console. Passez dans la section alors, si cela a réussi avec une nouvelle console, consignez la valeur de nos données. Rafraîchir Donnez-lui deux secondes. Voyez le message de succès, et notre objet a été mis à jour avec notre chaîne. C'est ainsi que nous pouvons gérer un succès avec une promesse. Mais qu'en est-il du rejet ? Eh bien, puisque c'est notre promesse, nous pouvons faire ce que nous voulons. Dans cet exemple, qu'en est-il résolution réussie, c'est que le nom de Chris a été défini. Je rejette si l'objet de données est vide. Nous pouvons sauter dans notre délai d'attente juste en dessous de l'endroit où nous définissons nos données. Nous pouvons faire une déclaration si. Nous pouvons vérifier si Object.Keys a dans notre objet de données. Nous pouvons vérifier si la longueur est supérieure à zéro. Le nom étant la propriété clé ici, nous vérifions si la longueur de cet objet est supérieure à zéro. Si c'est le cas, cela signifie que cela a été défini là où nous pouvons passer la fonction de résolution. Un message de succès. Si ce n'est pas le cas, juste après que l' instruction if sera transmise en rejet, qui sera transmise dans notre fonction avec le message de refus. Essayons ça. Nous disposons d'un ensemble de propriétés de données, donc nous devrions nous attendre à la valeur du succès. Ça donne deux secondes. Cela a été un succès. Si nous voulons vérifier l'état rejeté, nous pouvons vérifier si Object.keys est égal à zéro, ce qui entraîne une promesse rejetée. Il se passe un peu ici, mais l'idée est assez simple. Si une fonction par défaut ne renvoie pas de promesse, nous pouvons créer la nôtre. Cela peut être résolu ou rejeté à n'importe quel moment que nous estimons qu'il faut, ce qui nous donne un contrôle total sur le comportement de notre fonction. 60. Gestion de multiples promesses: Une fois que nous comprenons le fonctionnement des promesses, gestion d'une tâche asyncTask devient beaucoup plus facile. Mais qu'en est-il si plusieurs AsyncTask s'exécutent en même temps, cela peut causer divers problèmes. Attendons-nous la première tâche à accomplir avant de passer à la suivante ? Par exemple, si 10 AsyncTask étaient exécutés en même temps, si nous attendions que chacun finisse avant de passer à la suivante, le retard de chacun pourrait vraiment s'additionner. Par exemple, que passe-t-il si la tâche numéro 10 reposait sur la valeur de la tâche numéro 3, mais que la tâche 10 s'est terminée en premier. Eh bien, pour résoudre certains de ces problèmes, nous avons accès à des méthodes de promesses utiles. Jusqu'à présent, nous avons abordé certaines méthodes, y compris, catch, et enfin, et ces méthodes à venir vont faire face à de multiples promesses, commençant par une méthode appelée ALL. La méthode ALL passe en boucle plusieurs promesses et renvoie seule promesse et une seule promesse à un tableau du résultat. Il est utile pour collecter plusieurs éléments de données et peut-être les agréger en un seul résultat. Jetons un coup d'œil à la façon dont cela fonctionne dans le démarreur. Conservez deux promesses distinctes stockées dans des variables. Promesse numéro 1. Il s'agit là encore d'un exemple simple que nous avons déjà vu où nous récupérons une image de notre API. Si cela a réussi, il exécute alors une fonction qui renvoie la valeur de la réponse. Parallèlement à cela, nous aurons la promesse numéro 2, qui utilise le constructeur de promesses vu dans la vidéo précédente. Cela sera résolu au bout de deux secondes. Je les ai délibérément gardés simples pour cet exemple. Mais imaginez que nous voulions savoir si ces deux projets ont été couronnés de succès. Plutôt que de devoir vérifier chacun individuellement, eh bien, pour cela, nous pouvons utiliser la promesse. En bas, la promesse d'accès, capital P. La méthode ALL. Nous allons transmettre un tableau contenant ces deux variables, alors promettez 1, promettez 2. Cette méthode promise.all prend en compte n'importe quelle valeur itérable telle qu'un tableau. Nous avons cherché à boucler beaucoup de tableaux pendant ce cours. De plus, cette méthode ALL renverra également une promesse, qui signifie que nous pouvons enchaîner la fin diverses méthodes telles que alors et attraper. Nous ferons exactement la même chose que nous l'avons fait précédemment. Nous allons alors enchaîner, ce qui prend en charge une fonction. Cette fonction peut également prendre en compte les résultats. Nous allons enregistrer cela sur la console. suite, s' il y a eu une erreur, nous pouvons également enchaîner .catch à la fin en tant que fonction ALL qui prend en compte l'erreur, placée dans le journal. Alors, allons y aller. Accédez au navigateur, assurez-vous que la page actuelle est ouverte. Actualisez. Après deux secondes, nous revenons, revenons et un tableau avec deux résultats. La première est notre image aléatoire, qui est stockée à l'intérieur de cet objet. Si nous ouvrons cela, nous pouvons voir que celui-ci a été un succès. Le second, après le délai d'attente, est indiqué comme non défini, car la promesse ne renvoie rien. Si nous le voulons, nous pourrions passer un troisième paramètre à SetTimeout. Allons-y et faisons ça. Séparer par une virgule. Par conséquent, nous transmettrons une chaîne simple, qui est un paramètre facultatif à transmettre à la fonction que nous appelons, qui est résolue. Maintenant, après une actualisation, nous devrions voir cette valeur à l'intérieur de la console. Nous pouvons également tester un échec et voir ce qui se passe si l'une de ces promesses est rejetée. Nous pouvons le faire au lieu de résoudre, nous pouvons passer, rejeter, et celui-là, puis j'attraperai la section, le journal de la console s'exécutera. Nous voyons cette valeur des résultats que nous transmettrons ici. Mais une chose que vous remarquerez, c'est que nous ne voyons pas l'image aléatoire. Même si nous transmettons ces deux promesses de promesses, nous ne voyons que le résultat d'un refus. En effet, lors de l'utilisation de la méthode ALL, elle ne se résoudra que si toutes les promesses qu'elle prend réussissent ou si une seule échoue. Nous avons réussi à obtenir un tableau contenant toutes les promesses comme nous l'avons déjà vu, soit contenant toutes les promesses comme nous l'avons déjà le premier qui est rejeté. Cependant, il peut y avoir des événements où ce n'est pas le comportement que nous voulons. Nous voudrions peut-être toujours que toutes les promesses soient rendues, qu'il y ait eu un échec ou non. Pour cela, nous pouvons tout remplacer par tous ceux qui sont réglés. Tous ceux qui sont réglés vont toujours prendre en compte un tableau contenant toutes les promesses. Mais maintenant, si nous sauvegardons cela et rafraîchissons, donnez deux secondes. Plutôt que de voir l'échec unique, nous voyons toutes nos promesses à l'intérieur du tableau. Le premier a été accompli. Nous verrons toute la valeur. Ensuite, nous verrons le second qui a été rejeté. Nous pourrions utiliser ces résultats de la manière que nous voulions, par exemple en boucle pour gérer ce qu' il faut faire en cas d' échec ou de succès. Par exemple, nous voudrions peut-être savoir ceux qui ont été rejetés afin de pouvoir les appeler à nouveau. Ou même peut-être ne montrer à un utilisateur une certaine section si la demande de l' utilisateur a réussi. Autre chose que nous avons, c'est deux méthodes appelées n'importe quelle et race. Ces deux éléments ne retourneront qu'une seule valeur. abord, jetons un coup d'œil à tout ce que nous pouvons utiliser à la place de tous ceux qui sont installés. Économisez et rafraîchissez et nous verrons ce que nous récupérons. Cette fois, nous ne voyons pas le rejet. Tout ce que nous voyons, c'est notre image réussie. Cela est dû au fait que toute méthode, comme cela semble, se résoudra dès que l'une des promesses qui lui a été transmise aura été respectée. Ce qui signifie essentiellement la première promesse, qui est un succès. Cela ne signifie pas toujours que ce sera le premier qui sera transmis dans le tableau. Cela signifie simplement le premier qui a été terminé. Cependant, la méthode de course, si nous regardons ceci, Enregistrer et actualiser, cela renvoie également la même image aléatoire, mais cela reviendra à nouveau la première promesse qui lui a été transmise, qui a été réglée. règlement peut même être accompli ou rejeté. Dans notre cas, il s'agit d'une image aléatoire car celle-ci revient plus vite car elle n'a pas de retard de deux secondes. Peu importe si la promesse qui lui a été transmise était un succès ou un échec, la première sera celle que vous voyez dans la console. Pour résumer, la méthode de la course renvoie la première promesse qu'elle rencontre qui résout ou rejette. La méthode n'importe quelle méthode renverra également une promesse, mais celle-ci doit être remplie. Ils sont tous deux très utiles si l'une de ces situations se présente. 61. Async / Attendre: Avec l'arrivée d'ES 2017, une nouvelle façon de gérer le code asynchrone est apparue. Souvent, nous avons déjà examiné ce qui est redondant, c'est encore quelque chose que nous devons savoir, en particulier pour ce que nous allons examiner maintenant, qui est appelé async/attend. Async/Await est en fait des promesses en coulisses, mais il a été créé pour être plus simple et plus facile à lire pour les développeurs. Cela semble plus simple parce que nous revenons à quelque chose de plus familier, qui est une fonction. Dans les fichiers de démarrage, nous aurons un exemple d'image où nous retournerons une promesse que nous avons déjà vue. Si vous utilisiez plutôt une fonction normale pour définir cette image, nous ferions quelque chose comme ça. Cela va probablement créer une fonction appelée set image, puis à l'intérieur, nous pourrions à nouveau utiliser notre appel de récupération. Collez cela dans et stockez-le à l'intérieur d'une réponse appelée constante. Ensuite, essayons de créer un journal de console pour la réponse, et comme vous le savez tous à partir des vidéos précédentes, nous essayons d' accéder à ce code asynchrone juste en dessous avant qu'il n'en ait potentiellement eu l' occasion pour revenir. Pour exécuter cela, appelez notre fonction Set Image, actualisez la console, nous revenons à l'état en attente. Nous pouvons voir la réponse, qui est notre URL, nous avons initialement appelée à l'intérieur d'ici, plutôt que notre image réelle, que nous récupérons. Ce que vous pensez peut-être que nous pourrions faire ensuite, c'est d'utiliser response.json. Essayons ça. Stockez-le à l'intérieur d'une constante appelée image, qui est égale à response.json. Nous pouvons passer cette réponse. Maintenant, regardez cette image, la console. Essayons encore une fois. Cette fois, nous obtenons une erreur, disant que response.json n' est pas une fonction, et cela se produit parce que les données de l'image ne sont pas encore disponibles. Nous avons des promesses que nous savons que nous devons nous enchaîner à la fin de tous les appels de récupération, puis aux méthodes, qui attendent ensuite la réponse réussie avant d'exécuter une fonction. Cependant, même si nous n' utilisons pas de promesses cette fois-ci, nous allons utiliser async/wait. Pour cela, nous avons deux étapes simples. Pour convertir notre fonction normale en fonction asynchrone, il suffit de passer le mot-clé asynchrone devant elle. Une fois que vous avez fait cela avec une marque, quelle ligne de code nous voulons attendre le retour des données avant de passer à la suivante. Maintenant, au cas où nous voudrions attendre le retour de l'image, et cela mettra efficacement en pause notre fonction et attendra que les données reviennent avant déplacer vers le reste du code. Gardons cela et voyons ce qui se passe. Si nous actualisons maintenant, l' erreur est maintenant disparue. La promesse reste des États indépendants, mais si nous ouvrons cela, nous pouvons accéder aux données dont nous avons besoin à l'intérieur de cet objet. Nous pouvons maintenant voir si nous copions cette image avec des citations, nous récupérons maintenant notre image de chien aléatoire et le message de succès. La raison pour laquelle nous devons nous plonger dans cette promesse est parce que nous essayons d'accéder à notre réponse .json sur la ligne juste en dessous. Nous avons toujours attendu que notre image revienne, mais nous nous sommes ensuite connectés à la console response.json. Mais rappelez-vous d'après les exemples précédents, la méthode json renverra également une promesse. Pour y remédier, tout ce que nous devons faire est d'attendre que notre méthode json soit enfin terminée avant de le connecter à la console. Maintenant, si nous sauvegardons cela, essayez à nouveau dans le navigateur, plutôt que de devoir sauter dans la promesse et dans l'objet. Maintenant, consultez directement les informations correctes dont nous avons besoin à l'intérieur de la console. Nous avons maintenant renvoyé l'URL dans cette propriété de message, que nous pouvons utiliser pour définir nos éléments d'image. Prenons ça. Nous pouvons supprimer le document d'accès au journal de la console document.queryselector. Ce n'était pas dans l'image où nous pouvons définir la source de l'image pour qu'elle soit égale à l'image.message. On y va. C'est ainsi que nous pouvons utiliser async/wait avec ce style de fonction normal. Mais il existe également différents types de fonctions disponibles que vous avez examinés, y compris les expressions de fonctions et les fonctions de flèche. Juste comme ça. Avec une expression de fonction. Dites laisser func comme nom de variable et dire cela égal à notre fonction, qui va simplement renvoyer une chaîne de hey. L'équivalent de la fonction flèche ressemblerait à ceci. Ici, nous avons notre expression de fonction , puis nous avons notre fonction flèche. Async/Await peut être utilisé dans l'un ou l'autre d'entre eux. La façon de marquer notre expression de fonction comme asynchrone est comme ci-dessus, passant le mot-clé asynchrone juste avant le mot-clé fonction, et également la même chose pour notre fonction flèche. Nous pouvons placer cela au tout début, puis nous pouvons utiliser le mot-clé wait n'importe où dans le corps de la fonction. Async/Await est une solution propre et puissante pour gérer les tâches asynchrones. Mais il faut faire attention à ne pas trop s'emporter. Dans cet exemple, nous définissons l'image sur la ligne suivante. Il est tout à fait logique d'attendre que les données reviennent avant de les utiliser. Mais imaginez si nous avions quelque chose comme ça. Si nous avons dupliqué cette réponse et que nous avons demandé nos deux images distinctes. Ce que nous faisons ici, c'est que nous demandons deux images indépendantes en même temps. Mais le problème que nous avons actuellement est que la deuxième image ne sera pas appelée tant que la première n'aura pas été renvoyée car nous utilisons le mot-clé await. Cela entraînera maintenant un délai inutile dans le code ci-dessous. Ici, nous essayons d'accéder à notre première image, mais nous devons toujours attendre que la deuxième image soit renvoyée avant même que cette ligne ne s'exécute. Nous utilisons une vague, mais nous devons attendre les données, ce que nous devons faire et après. Mais nous ne voulons toujours pas bloquer l'exécution du reste du code, si nous n'en avons pas besoin. gestion de plusieurs demandes comme celle-ci est quelque chose que nous examinerons ensuite plus en détail. En plus de regarder bientôt la gestion des erreurs. 62. Manipuler plusieurs attentes.: À la fin de la vidéo précédente, nous avons discuté des effets de plusieurs appels en attente. Ici, nous en avons trois, nous avons réponse, répond 2 et réponse 3, qui font tous le même appel de récupération. Nous savons, par exemple, que si la deuxième image devait attendre le retour des premières données d'image avant d'être exécutée, c'était tout à fait correct. Toutefois, si l'image 2 ne repose pas sur la première image, elle ne devrait pas bloquer inutilement ce code. Avec de multiples demandes de données asynchrones comme celle-ci, cela nous ramène à une vidéo précédente, où nous avons examiné comment gérer plusieurs promesses. Et si nous voulons savoir si l'on échoue ou s'ils échouent tous, comment pourrions-nous gérer cela ? Avec des promesses, nous pourrions utiliser des méthodes telles que tous et tous réglés. Mais avec le code asynchrone, ces promesses sont également sous le capot. Nous pouvons toujours utiliser ces méthodes comme toutes. Par exemple, tout en bas de notre fonction, nous pouvons accéder à la promesse à tous, qui prend en compte un tableau. Nous pouvons passer en réponse, réponse 2 et en réponse 3. Stockez-nous cela dans une variable ou une constante appelée résultat, puis enregistrez cela dans la console. Une erreur, qui nécessite donc une réponse. Cela renvoie toujours une promesse, mais rappelez-vous que la méthode all se résoudra en une seule promesse, si toutes les promesses qu'elle prend sont résolvées avec succès ou si une seule échoue. Dans cette optique, nous pouvons également utiliser le mot-clé wait pour nous assurer qu'ils sont tous résolus en premier avant de passer à la ligne suivante. Passez en attente, c' est avant ça. Nous attendons maintenant que ces trois promesses soient terminées. Cela signifie que nous pouvons maintenant supprimer le mot-clé d'attente avant chacun de ces appels indépendants gratuits. Essayons ça, rafraîchissons. Nous obtenons maintenant un tableau contenant les trois réponses distinctes. Nous pouvons entrer dans chacun d'entre eux. Mais l'un des problèmes que nous rencontrons encore est que si nous regardons l'URL, agit de l' URL de l'image que nous demandons dans une récupération, non de l'image JPEG réelle, qui revient de l'API. Si vous vous souvenez, pour accéder à cette image réelle dont nous avons besoin, est contenue à l'intérieur du corps, et pour lire le contenu du corps, nous devons à nouveau utiliser la méthode JSON. La méthode JSON lira le contenu de cet objet et le transforme en objet JavaScript que nous pouvons lire. Comme nous pouvons le constater, nous avons un tableau avec trois valeurs distinctes. Ce que nous pouvons faire, c'est que nous pourrions supprimer notre journal de console et passer en boucle sur ces trois valeurs avec la méthode FoReach, donc les résultats. Pour chaque fonction, stockez-le à l'intérieur de la valeur. Nous pouvons maintenant enregistrer cette valeur dans la console et appeler la méthode JSON pour chacune de ces valeurs. Cela nous redonne maintenant nos trois promesses distinctes. Mais si nous ouvrons cela, nous voyons un objet familier dans lequel nous devons plonger pour retrouver notre image réelle. Cela se produit parce que, comme nous l'avons vu précédemment, la méthode JSON renverra également une promesse. Pour attendre que ces données reviennent avant d'y accéder, nous pouvons utiliser le mot-clé await, et comme le mot-clé await ne peut être utilisé qu' à l'intérieur d'une fonction, nous pouvons le marquer comme asynchrone. Rechargez. Ce qui nous redonne ensuite nos trois images, dont nous avons besoin. Cette méthode signifie maintenant que nous pouvons faire quelque chose une fois que toutes les promesses ont été couronnées de succès ou si une seule a échoué. En parlant d'échec, le sujet de la prochaine vidéo se penche sur la façon dont nous pouvons gérer les erreurs en utilisant async wait. 63. Gestion des erreurs: Cette vidéo va vous montrer quelques façons de gérer les erreurs dans votre code asynchrone. Le code est génial lorsque tout se passe bien, mais lorsque les choses ne se passent pas, nous devons gérer ce qu'il faut faire. Certaines des méthodes de promesses que nous avons examinées nous permettent de gérer les erreurs. Par exemple, la méthode all échoue si une promesse échoue, nous avons donc certaines options, mais nous devons également gérer toutes les autres situations, soit un gestionnaire d'erreurs général, soit la gestion de chaque demande spécifique. Dans le projet de démarrage, dans le fichier de gestion des erreurs, nous avons un élément d'image vide en haut et une seule fonction. Rien de nouveau ici pour cette fonction, il suffit de saisir une URL d'image à l'aide de l'API Fetch. Nous attendons que les données reviennent, qui sont stockées en réponse. Nous extrayons ensuite ces données via la méthode JSON, puis nous renvoyons la propriété image qui contient l'URL. Juste avant, nous utilisons cette fonction, jetons un coup d'œil à un autre exemple simple. Juste en dessous, créons une nouvelle fonction avec n'importe quel nom, et tout ce qui va faire est de renvoyer n'importe quelle chaîne simple. Après cela, nous consignerons la valeur de retour de la console, nous appellerons notre fonction, nous ouvrirons dans le navigateur et il y a notre message de retour. Rien d'inattendu ici, mais si nous marquons cette fonction comme asynchrone, alors juste avant le mot de la fonction, marquez cela comme asynchrone, et cette fois nous recevons une promesse. Nous allons juste laisser cette fonction là, mais gardez cela à l'esprit un instant. Dès que nous marquons une fonction comme asynchrone, elle renverra une promesse. Nous savons que nous avons une fonction pour saisir l'URL de l'image, alors créons une deuxième fonction qui va réellement définir l'URL de l'image via cet élément d'image. Cela peut également être asynchrone, appelez ce SetImage. Ensuite, à l'intérieur, tout ce que nous allons faire est saisir nos éléments d'image avec le sélecteur document.query et de définir la source pour qu'elle soit égale à la valeur de retour de la fonction ci-dessus. Je commence par l'élément image, et je définit la source égale à notre fonction ci-dessus, qui est GetImageURL. Nous devons appeler cela. La fonction GetImageURL est asynchrone, nous devons donc attendre que cette promesse soit renvoyée avant de pouvoir l'utiliser réellement. Nous allons attendre la valeur renvoyée par cette fonction. Tout cela est activé puisque nous avons marqué sa fonction comme asynchrone. Appelons cela juste en dessous, SetImage. Auparavant, lorsque nous gérons des erreurs à l'aide de promesses, nous avons simplement enchaîné une section de capture à la promesse. Cette fonction SetImage est également asynchrone, qui renvoie également une promesse comme nous l'avons vu auparavant avec l'exemple simple, ce qui signifie que nous pourrions enchaîner à la fin, puis à tout le bloc de capture qui est Je vais courir ensuite. On peut enchaîner ça à la fin, en s'assurant qu'il n'y a pas de point-virgule, ajouter de la capture. Catch exécutera une fonction qui prend le message d'erreur et le place dans un journal de console le message de « noooo » ainsi qu' une seconde avec cette erreur. Voyons maintenant ce qui se passe si nous essayons d'appeler cette fonction. Est-ce que nous récupérons l'erreur que nous attraperions ou est-ce que nous définissons l'image ? Cet appel a été un succès, nous voyons donc l'image revenir. Pour tester le bloc de capture, nous devons éteindre le réseau comme nous l'avons fait précédemment, alors accédez à l'onglet Réseau. Ici, nous allons définir les préréglages pour qu'ils soient hors ligne, maintenant nous pouvons les actualiser, nous ne voyons pas l'image. Sautez dans la console. Notre premier journal de console et notre deuxième journal de console n' ont pas pu être récupérés. Nous voyons que cela fonctionne bien et nous mélangeons la syntaxe de l' asynchrone à des promesses. Si nous voulions simplement respecter la syntaxe de promesse ou déplacer la gestion des erreurs dans la fonction elle-même, nous pourrions utiliser ce qu' on appelle try and catch. Essayez d'attraper, comme cela semble, essaiera de faire quelque chose, et si cela fonctionne, est génial, sinon, nous attrapons l'erreur et la gérons c'est génial, sinon, nous attrapons l'erreur et la gérons de la manière que vous voulez. Supprimons la section catch de SetImage, puis, à l'intérieur de notre fonction SetImage, nous créons un bloc d'essai et en dessous d'un bloc de capture, qui va également prendre en compte le message d'erreur. C'est assez simple, tout ce que nous avons à faire est de déplacer notre code que vous souhaitez exécuter à l'intérieur du bloc try, alors découpez-le, collez-le dans la section d'essai, puis à l'intérieur de la prise nous pouvons placer dans les mêmes journaux de console, donc une chaîne et également un deuxième journal de console avec le message d'erreur qui est transmis à cette fonction. Gardons ça et essayons ça. Gardez à l'esprit que mon réseau est toujours désactivé Si nous réessayons, nous ne voyons pas l'image, vous verrez nos deux messages d'erreur à l'intérieur de la console. Essayons de le rallumer , renvoyer le réseau, l' image est maintenant renvoyée et aucun de ces journaux de console ne s'exécute à l'intérieur d'ici. Cette section « Essayer et attraper » s'exécute de manière synchrone, donc nous allons exécuter la toute première section qui est essayer. Si tout cela fonctionne, c'est tout à fait correct, mais s'il échoue, il passera ensuite au bloc de capture suivant et exécutera le code contenu à l'intérieur. En plus de cela, nous avons également une section 2. Cela fonctionne comme lorsque nous nous sommes finalement enchaînés à la fin d'une promesse. Enfin, elle sera toujours exécutée que la promesse ait été respectée ou rejetée. En bas, passez enfin, et nous ne ferons que le placer dans un simple journal de console. Essayons ceci, actualisez et nous voyons le journal de la console avec le texte de toujours run. Tout comme une petite note de côté, la prise ou le bloc final doivent être présents. Il doit avoir au moins un de ces éléments en place, ou tout comme cet exemple, nous pouvons utiliser les deux. C'est correct pour la capture d'erreur générale, mais qu'en est-il si nous voulions savoir quelle partie du code d' essai a échoué ? Pour le moment, c'est assez simple car nous n'avons qu'une seule ligne de code. Mais qu'en est-il si cette section d'essai faisait plus que cela ? Pour cela, nous pourrions enchaîner un bloc de capture directement sur la tâche asynchrone et pour voir un exemple, je vais juste copier cette fonction complète, commenter cela pour référence, puis la coller ci-dessous. Nous pouvons supprimer toute la gestion des erreurs que nous venons d'ajouter, qui inclut le catch, le final, ainsi que le try-block quittant notre simple fonction asynchrone. Avec cela, nous pouvons ensuite retirer le point-virgule, nous pourrons ensuite enchaîner la prise à l'extrémité, à l'intérieur de la prise, nous pourrions passer une fonction directement à l'intérieur, ou si nous voulions réutiliser cette fonction, nous pourrions créer un fonction séparée à l'intérieur de notre code. Créons une fonction juste au-dessus du nom d'erreur de poignée. Nous allons simplement saisir nos deux messages d'erreur, les coller. L'erreur prendra également en compte le message d'erreur, puis nous pouvons l'appeler à l'intérieur de catch. Cela nous donne une fonction réutilisable distincte, que nous pourrons ensuite enchaîner la fin de plusieurs promesses. Essayons ça. Nous devrions maintenant voir nos deux messages d'erreur. S'il y a un échec. Si ce n'est pas le cas, nous voyons l'image, cela fonctionne très bien. Essayons de désactiver le réseau une fois de plus, allez sur la console, voici nos messages d'erreur à l'intérieur. Bien sûr, un journal de console ne suffirait pas dans une application réelle, nous voudrions peut-être masquer l'image en cas d'erreur ou même ajouter une image de place en place. Mais la clé ici est de faire quelque chose plutôt que de simplement voir le site Web ou la panne de l' application. gestion des erreurs est une partie importante du JavaScript asynchrone, et nous voyons ici quelques modèles courants que vous pouvez utiliser dans vos projets, ce qui améliorera réellement les fonctionnalités et l'expérience utilisateur. 64. Quittant Tôt: Ce premier projet que nous trouvons dans la dernière section de cette classe s' appelle Leaving So Soon, et il contient du code de démarrage donc nous allons nous concentrer sur le JavaScript. Ce projet est ce qu' on appelle une fenêtre contextuelle d'intention de sortie. Une fenêtre contextuelle d'intention de sortie est essentiellement un moyen d' attirer l'attention de l'utilisateur s'il tente de quitter votre site. Nous avons du HTML simple, avons notre titre, puis nous avons cette section contextuelle à l'intérieur d'une div. Si nous passons au projet et que nous les actualisons, tout ce que nous voyons actuellement, c'est ce titre. L'idée est que nous avons un site Web simple comme celui-ci et que vous avez peut-être vu ce type de sites Web lorsque vous naviguez en ligne. Si vous essayez de déplacer la souris vers le haut, de fermer le navigateur, ou même de rechercher ou de naviguer loin du site, vous pouvez souvent voir apparaître une fenêtre contextuelle. Cette fenêtre contextuelle peut contenir des informations. Il peut contenir un code de bon d'achat, ou tout simplement n'importe quoi pour garder l'utilisateur sur votre site. Nous ne voyons pas cette section contextuelle car si nous regardons cette div, il y a l'ID de la fenêtre contextuelle de sortie. À l'intérieur de nos feuilles de style, si nous examinons cette section, le type d'affichage est actuellement défini sur Aucun. Si nous changeons cela pour être flexible et actualisé, l'arrière-plan disparaîtra à cause de l'animation CSS, que nous avons juste en bas. Notre fenêtre contextuelle apparaît maintenant avec tout le texte à l'intérieur. Le contenu à l'intérieur de ces sites Web ou à l'intérieur de cette fenêtre contextuelle n'est pas pertinent. L'idée est que nous voulons basculer ce paramètre d'affichage une fois que la souris d'un utilisateur quitte le haut du navigateur. Pour l'instant, revenons dans notre feuille de style, et je vais le cacher par défaut. Ensuite, nous travaillons à l'intérieur de notre script, qui est déjà lié en bas. Ouvrons ça. Si vous pensez à ce que nous voulons faire ici, il n'y a pas beaucoup de tâches que nous devons exécuter. Commençons par créer une fonction qui s' exécutera lorsque la souris aura quitté la zone de la fenêtre. Une fois que la fenêtre contextuelle s' affiche à l'intérieur du navigateur, nous avons également besoin d'un moyen de cliquer sur un X dans le coin et de le fermer jusqu'à. Créez une deuxième fonction appelée ClosePopup. Nous allons commencer par notre première fonction, qui est LeftWindow et pour cela, nous devons écouter un événement de souris. Nous allons sélectionner le document qui est notre page Web complète, puis nous écouterons quand la souris part avec l' événement de sortie de la souris. Prenons nos documents. Nous pouvons ajouter un écouteur d'événements. Événements. Nous voulons écouter la souris dehors, ce qui va alors déclencher notre fonction ci-dessus. N'oubliez pas qu'avec les événements, cela prend également en compte les informations d'événement auxquelles nous pouvons accéder à l'intérieur d'une variable. Commençons par ouvrir une session dans la console. Consignez les informations sur l'événement dans la console, actualisez et nous pouvons voir si nous déplaçons la souris en dehors de la zone des documents, cet événement de souris est maintenant déclenché. Cela fonctionnera également si vous optez pour l'autre côté, ainsi que les deux premiers. Sautez ici. Les coordonnées de la souris qui nous intéressent sont ClientX et ClientY. Il s'agit d'une valeur de pixel qui nous indiquera l'emplacement de la souris une fois cet événement déclenché. Tout comme lorsque nous avons regardé la toile très tôt, X est la direction gauche ou droite, et le Y est de haut en bas. Puisque nous essayons de faire attention à la souris, quittant le haut du navigateur pour fermer cette fenêtre, nous allons nous intéresser à la direction ClientY. Nous pouvons filtrer cela vers le bas, e.Clienty. Rechardons-nous. Maintenant, si nous allons en haut, nous pouvons voir dès que nous passons le haut de la zone du navigateur, nous commençons à obtenir un nombre négatif, ce qui signifie que le plus haut ici est la valeur zéro. Nous devons écouter peut-être une zone de 20 pixels, qui affichera toutes les fenêtres contextuelles dès que l'utilisateur déplace la souris vers la zone supérieure du navigateur. Nous pouvons supprimer le journal de la console. Placer dans une déclaration if. Nous pouvons dire que si e.Clienty est inférieur à n'importe quelle valeur de votre choix, je vais en opter pour 20. Comme nous l'avons vu à l'intérieur de ces feuilles de style, nous pouvons saisir nos éléments avec l'ID de la fenêtre contextuelle de sortie et basculer le type d'affichage. Saisissez cela avec le Document.QuerySelector. J'envoie l'ID de la fenêtre contextuelle de sortie. Définissez la propriété style de l'affichage comme étant égale à Flex. Essayons ça. Rafraîchissez et passez maintenant en haut, et celui-ci déclenchera notre fenêtre contextuelle. Vous pouvez penser que tout cela fonctionne bien et c'est tout ce que nous devons faire. Nous devons également prendre des mesures pour ne pas irriter l'utilisateur. Vous devez activer cette croix pour qu' elle active notre fonction ClosePopup. Mais je veux probablement exécuter ce code uniquement pour activer la fenêtre contextuelle après un certain temps, et nous voulons également nous assurer que ce code n'est déclenché qu' une fois lors de la visite de l'utilisateur. Pour nous assurer que ce processus n'est déclenché qu'une seule fois, nous allons procéder à l'inverse et nous supprimerons l'écouteur d'événements des documents. À partir des premières vidéos, nous savons que nous devons copier les mêmes informations depuis AddEventListener. Nous ne pouvons pas encore tester cela car nous devons également pouvoir fermer la fenêtre avant de pouvoir la réactiver. Nous allons maintenant le faire dans la zone ClosePopup, puis faire l'inverse en définissant le type d'affichage sur Aucun. Pour activer cette fonction, nous devons écouter un clic sur notre croix. À l'intérieur de la page d'index, la plage contient la zone transversale. Prenons cela à l'intérieur de notre script, sous le bas, Document.QuerySelector. Nous allons sélectionner notre portée. Stockez-le à l'intérieur d'une constante appelée CloseBTN. Saisissez les éléments, ajoutez un écouteur d'événements. Nous voulons écouter les événements de clic, qui exécuteront notre fonction ci-dessus. Essayons ça. Déplacez-vous vers le haut pour activer la fenêtre contextuelle. Cliquez sur la croix. Nous pouvons également voir si nous passons en haut du navigateur, notre fenêtre contextuelle n'est pas réactivée car nous avons supprimé l'écouteur d'événements. Tout va bien, ça marche plutôt bien. Mais un ajout rapide est de nous assurer que la fenêtre contextuelle n'est pas activée dès que l' utilisateur visite le site. S'il y a, par exemple, tapé quelque chose en haut puis déplacé tout de suite, vous ne voulez pas que la fenêtre contextuelle apparaisse immédiatement. Ce que nous allons faire, c'est que nous allons placer un SetTimeout pour activer cette fonction uniquement après un certain délai. Appelez un SetTimeout. Passez une fonction où nous pouvons déplacer notre souris hors événement, ce qui déclenche notre fonction. Je ne l'appellerai qu'après un délai de trois secondes. Essayez-le pour que nous puissions déplacer notre souris vers le haut pendant les trois premières secondes. Ensuite, après trois secondes, notre fonction est active. Projet assez simple, et nous pouvons faire beaucoup avec une petite quantité de code JavaScript. C'est quelque chose que vous pourriez trouver utile lors de la création de sites Web à l'avenir. comme notre prochain projet, qui sera un carrousel d'images, construirons complètement à partir de zéro. 65. Carousel- Réglage Des Images: Dans notre prochain projet, nous allons construire un carrousel d'images. Ce sera le résultat final, et il est entièrement construit avec JavaScript. Ce que nous aurons, c'est une grande image principale tout en haut. Nous pouvons parcourir les images du bas pour les remplacer à l'aide des flèches gauche et droite. De plus, nous pouvons passer à l'une de ces images en cliquant dessus et en les plaçant dans la section supérieure. Cela permettra de rassembler de nombreuses compétences que vous avez acquises et mieux voir comment les choses fonctionnent dans la pratique avec une application réelle. Recommençons cela dans les fichiers de démarrage. Si nous passons à la section suivante, qui est le carrousel d'image, nous avons un code de démarrage. Nous avons une page d'index très simple, nous allons injecter tout le contenu par JavaScript. Tout ce que nous avons, c'est une plongée vide avec l'identifiant du carrousel. Nous allons placer tout le contenu de l'image, puis nous allons créer un lien vers notre script. Le script se trouve dans le dossier du carrousel, qui contient nos images, nos feuilles de style et également le code JavaScript pour que cela fonctionne. Ce cours contient cinq images différentes que vous pouvez remplacer ainsi que quelques CSS de base. Nous avons juste un style de base. Par exemple, nous définissons le carrousel principal une certaine largeur et le plaçons également au centre avec la marge 0 auto. Nous avons des effets de survol. part cela, un style général ainsi que la petite et la grande classe que nous avons ici. Nous ajouterons ces classes plus petites que grandes à chacune de ces images pour qu'elles s'adaptent parfaitement à l'écran. Commençons. Nous sautons dans notre carousel.js vide. Nous allons commencer par saisir cette section div de carrousel et créer un tableau avec toutes les images. Allez dans le fichier carousel.js. Nous allons commencer par créer un tableau de nos images. Chacun d'entre eux sera une chaîne pointant vers l'URL située dans le dossier des images. Si vous avez utilisé vos propres images, n'oubliez pas de changer les noms à l'intérieur d' ici pour correspondre à ceux que vous avez placés à l'intérieur. Le premier, c'est dans le dossier carrousel, et le chemin d'accès au fichier est images/beach.jpg. Nous allons dupliquer cela pour nous donner cinq images différentes. Le second était celui des éléphants. Nous avons de l'herbe. Nous avons un lac, et le dernier est en ville. Ensuite, nous allons chercher une référence à notre carrousel. Nous allons stocker cela à l'intérieur d' une constante appelée wrapper est égale à document.query selector, plus dans l'ID du carrousel. La prochaine étape, nous allons créer une fonction qui va saisir toutes ces images, boucle et les placer sur l'écran. Créez donc une fonction ci-dessous appelée SetImages. La première étape de cette fonction consiste à saisir notre wrapper, et nous supprimerons tout contenu existant. C'est pour que nous puissions répéter le processus de configuration de nos images, mais parfois elles seront dans un ordre différent. Nous supprimerons toutes les images supplémentaires en saisissant notre wrapper et en définissant le code HTML interne comme une chaîne vide. Avant que j'oublie, nous appellerons notre fonction par le bas, puis elle saisira nos images et créera une boucle pour chaque boucle pour chaque boucle sur chacune de ces images, images.FoReach, plus la fonction interne. Nous allons créer une référence à chacun d'entre eux et nous l'appellerons source image, ImageRC. Ouvrez le corps de la fonction, puis à l'intérieur d' ici, nous allons créer un nouvel élément d'image, stocker dans une variable appelée éléments, documents.createElement. Écrivez un élément d'image. Ensuite, nous devons définir la source de l'élément image pour qu'elle soit égale à cette variable. Prenez notre élément, définissez l'attribut source comme étant égal à notre source d'image. Nous pouvons ensuite saisir notre emballage, que nous avons stocké dans cette constante, puis nous pouvons ajouter à ce nouvel élément, Wrapper.AppenChild, plus dans notre élément nouvellement construit. Passons au navigateur et voyons ce que nous avons. Nous avons nos cinq images différentes de cette boucle, mais si nous examinons la version finale, nous ne voulons pas simplement placer cinq images aléatoires à l'intérieur du conteneur. Ce que nous voulons faire, c'est agrandir la première image, puis créer une section séparée en bas avec les petites images restantes. Pour ce faire, nous allons créer un wrapper pour toutes les petites images en bas, puis il le séparera l'endroit où une petite image à l'intérieur, et la grande image en haut. abord, revenons notre fonction et créons un nouveau wrapper pour les quatre petites images en bas. Juste après où nous nettoyons notre tige et créons une nouvelle constante appelée SmallimageWrapper. Cela est égal à Document.CreateElement. Il peut s'agir de n'importe quel élément que vous voulez, comme une div ou une section, peu importe. Ensuite, saisissez notre section et nous lui donnerons un identifiant unique de SmallimageWrapper. Maintenant, ce que nous voulons faire, c'est passer en boucle les cinq images de la matrice. La toute première doit être placée dans l'enveloppe, puis les quatre images restantes doivent être placées à l'intérieur de notre petite enveloppe d'image. Pour ce faire, nous pouvons d'abord sélectionner notre enveloppe complète et vérifier s'il contient un contenu actuel. Si aucun élément d'image n'est déjà affecté à cette enveloppe, cela signifie qu'il s'agit d'une toute première image du tableau. Ce que nous pouvons faire à l'intérieur de notre boucle c'est que nous pouvons placer une instruction if, et nous pouvons vérifier si notre wrapper n'a pas de nœuds enfants. On peut le dire ! Wrapper.a des nœuds enfants. Le code à l'intérieur d'ici ne s'exécutera que si ce wrapper est vide et qu'il ne contient aucune image supplémentaire à l'intérieur. Ce sera toujours le cas si nous passons en boucle et sur la première image. Si c'est le cas, nous voulons définir la classe. Si nous examinons nos feuilles de style, nous voulons définir cette classe de grandes dimensions car elles ont une largeur de 100 %. Si ce n'est pas le cas, nous ajouterons la classe des petits, qui vous donne cette taille plus petite. C'est ajouter une classe, nous pouvons saisir nos elements.classlist.add, placer dans la classe des grands, et aussi la classe de carrousel. Cette classe de carrousel, si nous revenons à nouveau dans la feuille de style, transformera le curseur en pointeur lorsque l'utilisateur survole l'image. Celui-ci ne doit s'appliquer qu' au tout premier élément à l'intérieur de notre enveloppe, sinon il devrait s'appliquer aux quatre images restantes. Nous ajouterons une liste de classes de petites classes. Nous ajouterons tous les petits et aussi carrousel. Nous obtenons toujours l'effet de survol, mais cette fois-ci, puisque nous traitons des quatre images plus petites, nous ne voulons pas les ajouter à l'enveloppe principale. Nous voulons plutôt les ajouter à notre petite enveloppe d'image que nous venons de créer. Alors attrapons ceci, ouvrez l'enfant, en plaçant nos éléments. Gardons ça et essayons ça. On y va. Il y a notre grande image et les quatre petites images de ces div séparées. récapituler, ce que nous avons fait ici, c'est que nous avons créé une grande enveloppe pour l' ensemble de notre section. Nous avons créé une fonction appelée Set images. Dès que cela s'exécute, il effacera tout contenu existant de l'enveloppe, ce qui signifie que lorsque nous parcourons nos images en boucle, si cette enveloppe est vide, cela signifie qu'il s'agit d'un tout premier élément de le tableau, donc nous lui donnons la grande classe. Si ce n'est pas le cas, ce sont les quatre images restantes où nous ajoutons le cluster de petits et que nous le plaçons également dans une div séparée. C'est une bonne première étape pour notre projet. Dans les prochaines vidéos, nous examinerons diverses autres fonctions telles que la réorganisation de ces images, façon d'échanger les images et aussi comment les placer dans les flèches pour aller à gauche et à droite. 66. Carousel- Création Des Flèches: Nous en sommes maintenant au stade de notre projet où les cinq images sont affichées à l'écran. Nous avons une grande image de fonction en haut, puis quatre miniatures plus petites ci-dessous. Nous avons quelques améliorations à apporter, nous voulons pouvoir cliquer sur n'importe laquelle de ces images plus petites et placées dans la section en vedette en haut de la page. Nous voulons également pouvoir les faire pivoter en ajoutant une petite flèche vers la gauche et la droite. Commençons par ajouter les flèches une fois les images chargées. Pour ce faire, nous pouvons les placer dans une fonction autonome et appeler cela. Permettez-moi d'appeler nos images. Au bas de cette fonction, nous appellerons notre fonction, que nous allons appeler SetArrows. C'est la fonction que nous allons créer ensuite. Juste en dessous, nous définissons notre fonction qui était SetArrows. SetArrows n'a pas besoin de prendre en compte quoi que ce soit comme paramètre. Ce que nous devons faire ici, Ce que nous devons faire c'est que nous pouvons créer des icônes à l'aide entités HTML et les stocker en tant que code HTML interne d'un élément span. Ce dont nous avons besoin, ce sont deux constantes, la première est la flèche gauche juste égale à Document.CreateElement comme dans une plage. La raison pour laquelle nous utilisons la plage est que, par défaut, il s'agit d'un élément en ligne Nous pouvons donc les placer en ligne avec nos quatre images. La flèche gauche, accédons à ces constantes et définissons le code HTML interne comme égal à notre entité HTML et le code de la flèche gauche est le ‹ Les deux flèches, vous devez cliquer dessus et réorganisez toutes nos images. Nous allons sélectionner nos constantes et ajouter un écouteur d'événement est maintenant un clic libre, ce qui va déclencher une fonction. Nous n'avons pas encore créé cette fonction, mais elle s'appellera ReOrder et pour ne pas lancer d'erreurs, nous allons créer cette fonction ci-dessus. Cela n'a pas besoin d'avoir de contenu, nous y reviendrons. Juste en dessous de notre écouteur d'événements , nous ferons à peu près la même chose, mais cette fois, pour la flèche droite, nous allons créer les éléments de span avec le document. CreateElement, définissez le code HTML interne, RightArrow.innerHTML. Le code d'entité HTML de la flèche droite est ›, qui n'est qu'un seul vers le haut de la flèche gauche. Ajoutez un écouteur d'événements. Celui-ci est également à l'écoute d'un événement de clic, qui déclenchera la même fonction. Ce sont nos deux flèches créées avec le contenu et l'écouteur d'événements. Mais ce que nous devons maintenant faire, c'est d'ajouter ces deux éléments à une certaine section. Si nous revenons à notre première fonction qui était SetImages, nous avons ce SmallimageWrapper. Il s'agit d'une section div qui contient plus de quatre petites miniatures Nous allons donc les ajouter à cette section. La façon dont nous pouvons le faire au début et à la fin consiste à utiliser une méthode JavaScript appelée AppendChild, qui ajoutera cela à la fin de la div placée à droite. Ensuite, pour la flèche gauche, nous pouvons utiliser la méthode prepend, qui ajoutera cela au tout début de notre div. Nous allons le faire au bas de notre fonction SetArrows. Prenons d'abord la section, donc à l'intérieur d'une constante appelée SmallimageWrapper, le Document.QuerySelector, elle a l'ID de SmallimageWrapper. Prenez cette section. Comme je viens de le mentionner, nous allons placer la flèche droite dans ce contenu avec AppendChild, comme nous l'avons regardé précédemment. Cela ajoutera cela à la toute fin de notre section div après nos images. Placez-le dans notre flèche droite, puis ajoutons notre flèche gauche au début, nous utiliserons la méthode prepend et insérerons notre flèche gauche. Essayons ça. Maintenant, après actualisation, nous ne voyons toujours pas nos flèches à l'écran. Jetons un coup d'œil dans la console et voyons si cela nous donne des indices. À l'intérieur, nous pouvons voir que nous ne pouvons pas lire propriétés de null, en lisant AppendChild, donc lorsque nous essayons d'ajouter un nouvel élément à notre enveloppe d'image unique, nous semblons rencontrer un problème. La raison pour laquelle cela se produit est parce que nous avons un SmallimageWrapper que nous créons en haut. Lorsque nous définissons nos images, nous avons l' enveloppe principale qui contient notre carrousel complet, puis nous avons notre SmallimageWrapper, que nous essayons de sélectionner par cet ID dans la boucle. Mais chacune de nos images, nous créons de nouveaux éléments d'image stockés dans cette variable, nous ajoutons la classe grande ou la petite classe, et s'il s'agit d'une petite image, nous les ajoutons ensuite quatre petites images de ce petit papier d'image. Mais actuellement, nous n' ajoutons pas réellement de SmallimageWrapper au DOM, tout ce que nous faisons est de le créer et d'ajouter nos quatre éléments, mais nous ne le plaçons pas dans le DOM. Au moins, nous sommes en mesure de sélectionner vers le bas. La seule fois que quelque chose est ajouté au DOM, c'est quand nous ajoutons cet élément à notre wrapper. L'ajout de l'élément directement à notre emballage est tout à fait correct s' il s'agit de la grande image car elle va aller directement à l'intérieur du carrousel principal. Cependant, lorsque nous avons affaire à une petite image, nous voulons attribuer ces SmallimageWrapper à cette section. La façon dont nous pouvons le faire est de sélectionner notre élément et de le définir comme égal à notre SmallimageWrapper. Ce SmallimageWrapper contiendra l'ensemble de nos quatre petites images , puis nous ajouterons cela à notre wrapper principal. Maintenant, si nous sauvegardons cela et nous rafraîchissons, nous pouvons maintenant l'ouvrir, nous voyons nos deux flèches sauter dans les éléments et si nous entrons dans le corps, nous voyons notre emballage principal avec ID de carrousel. Nous pouvons ouvrir cela. Nous voyons notre première image avec la classe des grands. Juste pour clarifier, celle-ci est assignée car dès que nous commençons à parcourir toutes nos images, nous vérifions si cette section est vide, si elle est plus grande avec la classe des grands et ajoutez-le à notre emballage. Sinon, les quatre images restantes réduiront la classe et ajouteront ensuite à notre SmallimageWrapper, qui sera ensuite transmis à nos éléments, puis nous pourrons les ajouter au DOM, que nous pouvons voir si nous Regardez cette plongée juste ici. Nous pouvons ouvrir cela. Nous avons notre élément span que nous venons d'ajouter avec prepend, nous avons nos quatre images, puis la dernière période que nous avons ajoutée avec AppendChild. 67. Carrousel d'image - Re-Ordering des images: Auparavant, nous avons configuré nos flèches gauche et droite et les avons également liées à une fonction appelée ré-ordre. Nous l'avons fait en créant nos flèches à l'intérieur de cette fonction, utilisant notre événement for a click, en utilisant notre événement for a click, qui a déclenché notre fonction. Ce que nous allons faire maintenant, c' est créer un nouveau tableau. Ce nouveau tableau va être construit en réorganisant l'ordre de toutes ces images. Nous allons le faire à l'intérieur de notre fonction en saisissant d' abord les informations de l'événement à partir du clic, et la raison pour laquelle nous le faisons est que nous devons déterminer lequel de ces boutons a été cliqué. Nous devons savoir s'il s'agit du bouton gauche ou du bouton droit. Nous pouvons le faire en ajoutant un ID à chacun d'entre eux, de sorte que le LeftArrow.ID est simplement égal à gauche. Ensuite, descendez dans la droiteArrow.ID à droite. Nous pouvons maintenant accéder à cet ID par les informations des éléments de l'événement. Nous savons par le passé, en faisant un journal de console, si nous consignons la valeur de e.target, nous obtenons les éléments réels à l'intérieur de la console. Cliquez sur l'un de ces boutons pour obtenir le bouton droit, puis sur le bouton gauche. Nous pouvons également filtrer cet objet vers le bas, saisir uniquement l'ID. Cela nous donne maintenant un pointeur unique sur le bouton qui a été enfoncé. Nous pouvons maintenant supprimer cela d'un journal de console, stocker à l'intérieur d'une constante appelée direction. Maintenant, ce que nous allons faire, c'est que nous allons parcourir notre tableau d'images tout en haut. Nous veillerons à couvrir ces cinq images. Nous déterminerons ensuite si le bouton gauche ou le bouton droit a été cliqué, puis nous l'utiliserons pour réorganiser nos images. Ces nouvelles images seront stockées à l'intérieur d'un nouveau tableau appelé NewarRay, qui aura la valeur initiale d'un tableau vide, puis nous pourrons parcourir toutes nos images en boucle. Faites cela avec une boucle FoReach, passez notre fonction. Ensuite, à l'intérieur de cette fonction, il va prendre en compte deux choses. abord, comme toujours, nous transmettrons un nom de variable, qui sera chaque image de cette boucle particulière, puis nous pourrons également accéder au numéro d'index. Pour la première boucle, il s'agit du premier élément, qui est notre plage avec un indice de 0. Ensuite, cela sera incrémenté d' un sur chaque boucle. Pour réorganiser ces images, nous devons d'abord vérifier si la direction commence par la gauche. Sinon, nous ajouterons une autre section qui s' exécutera si la direction est égale à droite. Réfléchissons à ce que nous voulons faire si la direction est laissée. Si vous cliquez sur ce bouton gauche, nous devons parcourir le tableau d'origine que nous faisons et pour le tout premier élément à l'intérieur d'ici, nous voulons le pousser jusqu'à la fin de notre nouveau tableau, puis pour les quatre images restantes en bas, nous voulons les déplacer d'une position vers le bas. Nous pouvons le faire à l'intérieur du bouton gauche. Nous allons vérifier si le numéro d'index auquel vous aurez accès ici est égal à 0, est-à-dire qu'il s'agit de l'image principale en haut de la page. Si c'est le cas, nous voulons le pousser jusqu' au bout de notre nouvelle baie. Nous pouvons le faire en accédant à cette variable. Nous pouvons positionner cela à la toute fin en accédant à notre propriété images.length. Pour cet exemple, il devrait s'agir notre nouveau tableau dans l'index Position 5. Nous allons définir cette image pour être la première. Saisissez notre première image de la matrice originale ou la poussez jusqu'à la fin de notre nouvelle image. Nous l'appellerons également NewarRay.Shift au cas où il y aurait quelque chose au début de ce tableau. C'est la toute première image prise en charge, mais qu'en est-il des quatre autres ? Eh bien, pour les quatre images restantes, il suffit de saisir le numéro d'index actuel et de le déplacer d'un. Nous pouvons le faire à l'intérieur d' une autre section juste après , en plaçant autrement. Ce sera le cas pour les quatre autres images. Tout ce que nous voulons faire est de saisir notre nouveau tableau, sélectionner l'indice actuel, d' adopter la valeur d'un et de le définir comme égal à notre image actuelle. Par exemple, si notre image actuelle est l'index numéro 3, elle sera déplacée vers le numéro 2, ce qui sera identique pour les quatre images restantes. Avant d'aller plus loin, essayons ça. Actuellement, notre fonction est appelée et elle réordonne le tableau, nous devrons également remplacer le tableau d'images d'origine par notre nouveau. Nous pouvons le faire en bas de notre fonction, définir notre tableau d'images pour qu'il soit égal au nouveau tableau. De plus, une fois que nous avons réinitialisé notre tableau d'images, nous devons appeler la fonction set images, qui est en fait en boucle sur ce tableau et les affiche à l'écran. Nous allons le faire en bas. Appelez cette fonction, et essayons cela. Actualisez. Si nous cliquons sur la « Flèche droite », nous obtenons une erreur car nous n'avons pas encore traité cette affaire. Essayons à gauche. Nous avons les éléphants, qui ont maintenant atteint la première position d'index. Cliquez à nouveau sur « Gauche ». Cela est passé à la fin. Tout cela semble bien fonctionner. Pour résumer, nous saisissons la toute première image puis la poussons à la fin de notre nouvelle matrice. Actuellement, c'est la plage, ça va jusqu'au bout, et les quatre autres images seront déplacées vers la gauche par un numéro d'index. Ensuite, nous allons nous occuper de la section L, c' est-à-dire si le bouton droit a été cliqué. Ce que nous allons faire ici est essentiellement le contraire de cette ligne juste ici. Nous devons, plutôt que de supprimer un numéro d'index pour le déplacer vers la gauche, nous devons en ajouter un pour déplacer chacun vers la droite. Nous allons coller cela dans, le tout à un numéro d'index de 1. Cette fois-ci, plutôt que de vérifier si nous accédons à la première image, nous devons vérifier si nous accédons à la dernière image. S'il s'agit de la dernière image , elle doit être supprimée de la fin du tableau et placée au tout début. Nous pouvons le faire à l'intérieur d'une section si. Si l'index plus un est égal à des images ou à une longueur. La raison pour laquelle nous l'avons fait, car rappelez-vous que numéros d' index commencent à 0, mais lorsque nous accédons à la longueur du tableau, il s'agit du nombre réel. Actuellement, il s'agit de 5, mais l'indice ne va que jusqu'à 4, ce qui signifie qu'il faut plus 1. Vérifiez si cette valeur est également égale à 5. Donc, si cela est égal à 5, il s'agit de notre toute dernière valeur dans le tableau. Nous devons définir cela au tout début. Le tout début de notre nouveau tableau sera l'index numéro 0, que nous pouvons définir pour être l'image actuelle. Tout comme nous l'avons fait lorsque nous avons retiré le tout premier élément du tableau, cette fois, nous devons supprimer le tout dernier, NewarRay.pop. Sauvons ça et essayons celui-ci. À droite, nous devrions voir les maisons se déplacer vers le haut et la plage vers la gauche. Bien. Maintenant, le lac, l'herbe, les éléphants. Cela fonctionne désormais parfaitement dans les deux sens. 68. Carousel- Images de swapping: Notre prochaine et dernière tâche pour ce projet consiste à permettre à l'utilisateur de cliquer sur l'une de ces petites vignettes, puis elle sera échangée avec l' image principale en haut. La petite image sera placée dans la grande section et la grande image sera ensuite descendue jusqu'à la zone des vignettes. Pour celle-ci, nous créons nos petites images de n'importe quelle fonction d'images de jeu, sautez dans la section autre, où nous ajoutons la classe des petits. Ce que nous allons faire ici, c'est que nous ajouterons un écouteur d'événements à chacun d'eux. Juste après avoir ajouté la classe. Avant de l'ajouter à notre wrapper, nous sélectionnerons nos éléments, ajouterons un écouteur d'événements, où nous écouterons le clic, ce qui va déclencher une fonction qui créera juste une moment appelé SwapImages. Vers le bas. Notre fonction permet d'échanger des images. À l'intérieur, nous avons ajouté l'écouteur d'événements, qui va déclencher cette fonction, chaque fois que nous cliquons sur l' une des petites images, mais juste par mesure de précaution supplémentaire, nous ajouterons une déclaration if pour revenir à cette fonction si vous avez cliqué sur la grande image. Ce que nous allons faire, c' est qu'il s'agit d'un événement, cliquez sur « Événement », nous analyserons les informations sur l' événement, nous accéderons aux éléments avec e.target. Ensuite, nous pouvons vérifier si la ClassList contient, à l'aide d'une méthode contains, la classe de grande taille. Si c'est le cas, nous reviendrons de cette fonction. C'est juste à titre de précaution. Ensuite, ce que nous allons faire, c'est que nous allons saisir à l'aide des informations événements.target, l'image réelle sur laquelle on a cliqué. Il suffit de saisir l'attribut source, découvrir laquelle de ces images doit être placée dans la zone en vedette. Nous pouvons le faire, l' installer à l'intérieur d' une constante appelée source d'image, définir cette valeur égale à e.target. Nous utilisons GetAttribute, où nous allons saisir la source. Nous avons maintenant cette source d'image, qui est le chemin d'accès au fichier. Nous pouvons l'utiliser pour saisir le numéro d' index de notre tableau. Nous allons récupérer notre tableau d'images. Nous utiliserons ensuite la méthode appelée IndexOf, puis nous analyserons dans notre source. Ainsi, les images, IndexOf, comme dans notre nom de variable, qui est source d'image. Cela va renvoyer un numéro d'index que vous pouvez stocker à l'intérieur d' une constante appelée SelectedImageIndex. Ce que nous avons maintenant, c'est le numéro d'index de la vignette cliquée. Nous devons maintenant échanger cela avec l'image qui se trouve à la position d'index 0. Mais avant de procéder à cet échange, nous devons d'abord stocker quelle image est actuellement en position d'index 0. Nous allons stocker cela à l'intérieur d'une constante appelée FirstImage. Définissez ces deux images au numéro d'index 0. Ensuite, nous pouvons réaffecter la première image d' origine, sorte que les images 0 seront désormais égales aux images et analyseront cet index d'image sélectionné. Cela remplace la première image la vignette cliquée sur la vignette, par la vignette cliquée sur la vignette, puis nous devons faire l'inverse en sélectionnant, encore une fois, nos images dans le SelectedImageIndex. Échangez cela avec notre première image. C'est la raison pour laquelle nous commençons FirstImage, car sur la ligne suivante, nous réaffectons la première image. Par conséquent, il nous donne la mauvaise valeur en bas. À la fin, nous appellerons notre fonction SetImages, pour réactualiser le navigateur avec le nouvel ordre de la baie. Essayons ça pour l'herbe. La plage tombe au fond, nous allons essayer celle-ci. Bien. Cela vient compléter notre projet de carrousel d'images. J'espère que ça vous a plu et appris nouvelles astuces en cours de route. 69. Suivez-moi sur Skillshare: Je félicite énormément d'avoir atteint la fin de ce cours. J'espère que vous l'avez vraiment apprécié et que vous en avez tiré quelques connaissances. Si vous avez apprécié ce cours, assurez-vous de consulter le reste de mes cours ici sur Skillshare, me suivre pour toutes les mises à jour et d' être informé des nouveaux cours dès qu'ils seront disponibles. Merci encore une fois, bonne chance, et j'espère que je vous reverrai dans un futur cours.