Modernes JavaScript für Anfänger: Teil 2 | Chris Dixon | Skillshare

Playback-Geschwindigkeit


1.0x


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

Modernes JavaScript für Anfänger: Teil 2

teacher avatar Chris Dixon, Web Developer & Online Teacher

Schau dir diesen Kurs und Tausende anderer Kurse an

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

Schau dir diesen Kurs und Tausende anderer Kurse an

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

Einheiten dieses Kurses

    • 1.

      Einführung

      2:23

    • 2.

      Projektordner herunterladen

      0:59

    • 3.

      Teile deine Arbeit auf Skillshare!

      1:09

    • 4.

      Für Schleifen

      10:18

    • 5.

      Für...in und For...in

      6:25

    • 6.

      Während und tun...

      5:22

    • 7.

      Wenn / andere Aussagen und Nesting

      5:56

    • 8.

      Sonst wenn

      4:22

    • 9.

      Die Switch-Anweisung

      7:57

    • 10.

      Bedingter Betreiber (ternary)

      4:12

    • 11.

      Geben Sie die Coersion und Umwandlung

      10:00

    • 12.

      Truthy & Falsey

      4:35

    • 13.

      Optionale Verkettung

      6:22

    • 14.

      Neue Objekte erstellen und ändern

      5:47

    • 15.

      Objektkonstruktorfunktion

      9:21

    • 16.

      Prototypen

      6:41

    • 17.

      Vererbung von Objekten

      10:09

    • 18.

      Object

      4:38

    • 19.

      Objekte im Stil von CSS

      4:35

    • 20.

      Looping mit Objekten

      9:26

    • 21.

      Dynamische Objekte

      5:44

    • 22.

      Primitive und Referenztypen

      5:27

    • 23.

      Objekte vergleichen

      6:41

    • 24.

      Abschnitt Einführung

      3:24

    • 25.

      Auflistung von Bestellungen

      12:30

    • 26.

      Auflistung von Bestellungen

      5:24

    • 27.

      Element Helper

      6:33

    • 28.

      Die Auswahl der aktuellen Bestellung

      9:13

    • 29.

      Setze die aktuelle Pizza

      5:30

    • 30.

      Methoden aufteilen

      10:50

    • 31.

      Den Backofen hinzufügen

      9:24

    • 32.

      Das Spiel beginnen und beenden

      9:09

    • 33.

      Einführung in Javascript Math

      7:08

    • 34.

      Mit Math neue Pizzen erzeugen

      8:36

    • 35.

      setInterval

      9:17

    • 36.

      setTimeout

      4:47

    • 37.

      Clearing

      3:56

    • 38.

      Einführung in das Javascript Datum

      5:26

    • 39.

      Die Kochzeit einstellen

      4:43

    • 40.

      Einführung in die Leinwand und Co-Ordinates

      13:03

    • 41.

      Die Zutaten einrichten

      7:45

    • 42.

      Drawing

      6:38

    • 43.

      Zeichnen von mehreren Stücken

      13:00

    • 44.

      Das Lappen

      4:33

    • 45.

      Pizzen verschwenden

      2:35

    • 46.

      Schritte überprüfen

      16:23

    • 47.

      Bestellungen abschließen

      12:48

    • 48.

      Bestellungen entfernen

      3:33

    • 49.

      Die Benutzeroberfläche aktualisieren

      9:55

    • 50.

      Einführung in den Umfang

      5:49

    • 51.

      Nesting

      5:35

    • 52.

      Block-und Funktionsumfang

      3:35

    • 53.

      Hissen

      7:48

    • 54.

      Temporal tote Zone

      5:17

    • 55.

      Verschlüsse

      9:34

    • 56.

      Ein bisschen Hintergrund

      6:25

    • 57.

      Callback-Funktionen

      15:20

    • 58.

      Versprechen

      11:23

    • 59.

      Der Promise

      7:51

    • 60.

      Umgang mit mehreren Versprechen

      7:15

    • 61.

      Async / Warten

      6:42

    • 62.

      Umgang mit mehreren Warten

      4:02

    • 63.

      Fehlerbehandlung

      8:49

    • 64.

      So bald zu gehen

      8:01

    • 65.

      Image Carousel- Die Bilder einstellen

      9:15

    • 66.

      Bild Carousel- Die Pfeile schaffen

      7:01

    • 67.

      Image Carousel – Bilder neu bestellen

      8:11

    • 68.

      Bild Carousel- tauschen

      4:04

    • 69.

      Folge mir auf Skillshare

      0:23

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

Von der Community generiert

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

394

Teilnehmer:innen

13

Projekte

Über diesen Kurs

Willkommen auf modernen JavaScript für Anfänger!

Dies ist Teil 2 des Kurses, der auf der Grundlage des Grundsatzes aufgebaut ist, das du in Teil 1 gelernt hast. Wenn du noch nicht an der 1 teilgenommen hast, solltest du diesen Kurs zuerst durchlaufen, es sei denn, du hast schon einige is und möchtest die Themen in diesem Abschnitt abdecken.

Dein starter vom ersten Teil wird in diesen Kurs fortfahren, wenn du es nicht hast, kannst du es hier herunterladen:

Schnapp dir die Startdateien hier.

Die Projektphasen des schnellen Chefs finden Sie hier.

Jede neue Fähigkeit zu lernen, kann hart sein und Javascript ist keine Ausnahme!

Javascript hat so eine große Auswahl an Funktionen und Dingen, die es tun kann. Manchmal haben wir als Anfänger keine Ahnung, wo wir überhaupt anfangen sollen.

Deshalb habe ich diesen Kurs erstellt…

Dieser Kurs umfasst viele Themen im JavaScript, einschließlich Schleifen und bedingte Aussagen, einen tiefen Blick auf Objekte, Mathematik, Datum und Timer und Zeichnungen auf die Leinwand.

Dies ist alles, wenn du die Beispiele und Demonstrationen aus der Welt siehst und ein Pizzakoch entwickelt hast, um viele Teile dessen, was du gelernt hast, zu kombinieren. Dieses Projekt wird ziemlich groß sein, aber wir werden es in überschaubare Abschnitte unterteilen.

Später entdecken wir einige der kniffligen Teile wie async Umfang, Heben und Verschlüsse, bevor wir mit 2 weiteren Projekten fertig werden. Wir bauen eine kleine App mit der sogenannten Verlassen so bald, was ein Popup für die Ausreise ist, um die Besucher mit einem Angebot zu locken, wenn sie versuchen, deine Website zu verlassen. Bevor du den Kurs mit einem voll funktionierenden JavaScript bekommst.

Vielen Dank für dein Interesse an diesem Kursein, und ich sehe dich in der ersten Kurseinheit…

Triff deine:n Kursleiter:in

Teacher Profile Image

Chris Dixon

Web Developer & Online Teacher

Kursleiter:in

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... Vollständiges Profil ansehen

Level: Intermediate

Kursbewertung

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

Warum lohnt sich eine Mitgliedschaft bei Skillshare?

Nimm an prämierten Skillshare Original-Kursen teil

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

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

Lerne von überall aus

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

Transkripte

1. Einführung: [MUSIK] Hey, willkommen in dieser Klasse. Wie wir alle wissen, kann es schwierig sein, neue Fähigkeiten zu erlernen , und JavaScript ist keine Ausnahme. JavaScript verfügt über eine so breite Palette von Funktionen und Dingen, für die es verwendet werden kann, und dies kann Anfänger oft in einer schwierigen Situation dazu bringen, sich zu fragen, wo sie überhaupt anfangen sollen. Deshalb habe ich dies erstellt -Klasse. Dies ist Teil 2 der Klasse, die auf dem Fundament aufbaut , das Sie in Teil 1 gelernt haben. Wenn Sie Teil 1 nicht besucht haben, sollten Sie diese Klasse zuerst durchlaufen, es sei denn, Sie haben bereits eine JavaScript-Erfahrung und möchten die Themen in diesem Abschnitt behandeln. Wenn du noch nie an einem meiner Kurse teilgenommen hast, heiße ich Chris und ich baue seit über 20 Jahren Websites. Ich lehre diese Fähigkeiten auch seit über sieben Jahren, beide Videokurse neben führenden Bootcamps für Webentwicklung. Diese Klasse hat viele JavaScript-Themen, darunter Schleifen und bedingte Anweisungen, einen tiefen Blick auf Objekte, Mathematik, Datum und Timer sowie das Zeichnen auf die Leinwand. All diese Themen habe ich auf klare und strukturierte Weise behandelt klare und strukturierte Weise während ich dabei praktische Projekte erstellt habe, einschließlich realer Beispiel-Anwendungsfälle und auch einige kleine Herausforderungen , während ich dabei praktische Projekte erstellt habe, einschließlich realer Beispiel-Anwendungsfälle und auch einige kleine Herausforderungen mit dem Aufbau eines Pizzakoch-Spiels, um viele Teile dessen, was Sie gelernt haben, zu kombinieren . Dieses Projekt wird einigermaßen groß sein, aber wir werden es aufschlüsseln, damit Sie sehen können, wie alle Teile zusammenpassen. Später werden wir einige der schwierigeren Teile wie asynchrone JavaScript, Umfang, Heben und Schließungen entdecken der schwierigeren Teile wie asynchrone JavaScript, . Bevor wir mit zwei weiteren Abschlussprojekten abschließen , werden wir eine kleine Anwendung namens Leaving so bald, die ein Exit-Intent-Pop-up ist, das verwendet wird, um Besucher mit einem Angebot zu locken , wenn sie versuchen, Ihre Website zu verlassen. Wenn alle die Klasse getreu abschließen funktionierendes JavaScript-Bildkarussell. Es enthält einen Projektordner, wir hinzufügen werden, wenn wir in dieser Klasse vorankommen , und er wird sich auch in Zukunft als nützliche Referenz entwickeln . Vielen Dank für Ihr Interesse an diesem Kurs und wir sehen uns in der ersten Lektion. 2. Projektordner herunterladen: Wenn Sie den ersten Teil dieser Klasse bereits abgeschlossen haben, können Sie mit genau denselben Starterdateien fortfahren , die wir in Teil 1 verwendet haben. In diesem Teil 2 der Klasse beginnen wir bis zum Ende bei Abschnitt Nummer 6. Ich fange mit der ersten Lektion an, die for-Schleifen ist. Wenn Sie das haben, können Sie sich für die nächste Lektion begeben. Wenn Sie in Teil 2 springen, ohne Teil 1 zu nehmen, ist das auch völlig in Ordnung, aber Sie müssen zu github.com gehen und die Starterdateien herunterladen, die wir dabei verwenden werden -Klasse. Folgen Sie dem Link, den Sie hier auf dem Bildschirm sehen können. Sobald Sie auf dieser Seite gelandet sind, klicken Sie auf die Schaltfläche grüne Kohle und laden Sie diese dann als Zip-Datei herunter. Öffnen Sie diesen Projektordner in Ihrem bevorzugten Texteditor. Ich werde Visual Studio Code verwenden, aber Sie können jeden verwenden, was Sie bevorzugen. Das ist alles, was du brauchst, um loszulegen , und wir sehen uns als nächstes. Wir schauen uns zunächst for-loops an. 3. Teile deine Arbeit auf Skillshare!: Wenn Sie an einem Kurs teilnehmen, ist es wirklich wichtig, dass Sie sich nicht angewöhnen diesen Kurs zu verfolgen , nur um eine weitere Vorlesung abzuhaken. Nehmen Sie sich die Zeit, jede Lektion zu bearbeiten, den Code, den Sie schreiben, zu überprüfen und darüber nachzudenken, wie Sie diese Lösungen selbst angehen könnten . Vor diesem Hintergrund ist dieser Kurs projektbezogen und bietet Ihnen die Möglichkeit, wirklich etwas Persönliches und Einzigartiges zu schaffen. Sie müssen sich nicht zu sehr verirren und vom Unterricht ablenken . Sie können sogar einen Schritt zurücktreten, nachdem Sie den Kurs beendet haben, und danach zurückkommen und einige Projektänderungen vornehmen. Das gibt dir wirklich eine gute Gelegenheit, das Gelernte außerhalb des Unterrichts zu üben . Denken Sie auch daran, Ihr Projekt auch hier auf Skillshare zu teilen und nur ich werde es mir ansehen, aber es wird auch Kommilitonen inspirieren. Weitere Informationen zum Klassenprojekt findest du auf der Registerkarte Projekt und Ressourcen, wo du nicht nur dein Projekt hochladen kannst, sondern auch andere Klassenprojekte sehen kannst. In diesem Sinne freue ich mich darauf zu sehen, was Sie hier auf Skillshare erstellen und hochladen. 4. Für Schleifen: Willkommen zurück. In diesem Abschnitt dreht sich alles um Loops. Wir werden die Dinge mit einer for-Schleife beginnen. Als wir früher anfingen, mit Arrays zu arbeiten, haben wir uns verschiedene Möglichkeiten angesehen, bestimmte Aufgaben mit diesen Schleifen zu wiederholen. Die Arten von Schleife, die wir uns angeschaut haben, waren map und forEach, beide waren Array-Methoden. Loops bedeuten, dass wir Aufgaben viel einfacher wiederholen können. Obwohl es verschiedene Arten von Schleifen gibt, wiederholen sie eine Aufgabe in der Regel mehrmals. Oft besteht der Hauptunterschied darin, wie wir der Schleife anweisen , diese Map dann zu stoppen, und forEach-Schleifen waren Array-Methoden, aber Schleifen sind nicht ausschließlich für Arrays vorgesehen. Es gibt auch verschiedene Arten von Schleifen, die wir verwenden können , um so ziemlich alles, was wir brauchen, durchlaufen zu können. Dieses Video wird sich auf eine for-Schleife konzentrieren. So sieht eine grundlegende For-Loop aus. Es setzt sich ein bisschen wie eine Funktion oder eine if-Anweisung aus. Beachten Sie innerhalb der Klammern , die zwei Semikolons sind. Diese werden verwendet, um die freien Ausdrücke zu übergeben , die festlegen , wie unsere Schleife funktionieren wird. wirklich einfaches Beispiel ist , es zu verwenden, um die Zahl zu erhöhen , und wir werden uns in nur einem Moment einige bessere Beispiele ansehen . Für den ersten Ausdruck enthält er jedoch den Anfangs- oder Startwert für unsere Schleife. Wenn wir nur bei einer Zahl Null beginnen oder jedes Mal erhöhen wollen , richten wir eine Variable auf Null ein, genau wie diese. Zweitens haben wir eine Bedingung und hier werden wir sehen, dass die Nummer weniger als 10 ist. Diese Bedingung bestimmt, ob die Schleife weitergehen soll. Wenn dies der Fall ist, geht die Schleife weiter. Wenn falsch, endet die Schleife dann. Schließlich, wenn wir nicht in jeder Schleife etwas tun, wird die zweite Bedingung immer wahr sein. Hier erhöhen wir den Wert der Zahl in jeder Schleife um eins. Daher können wir den Zustand nach jeder dieser Änderungen überprüfen . Um dieses Beispiel zu durchlaufen, nachdem jede Schleife ausgeführt wurde, wird die Zahl um eins erhöht , bis sie Nummer 10 erreicht, was dazu führt, dass die zweite Anweisung dann zu „false“ führt, was dazu führt, dass die Schleife dann enden. In diesem speziellen Beispiel protokollieren wir 10 Werte, die von Null bis Nummer neun sind. Wenn Sie die Variable bereits außerhalb der for-Schleife deklariert haben , können Sie die zweite und dritte Anweisung auslassen und einfach einbeziehen , und die Dinge laufen immer noch wie zuvor. Es ist auch erwähnenswert, dass Sie viele Beispiele mit dem Variablennamen, dem Buchstaben i, sehen werden viele Beispiele mit dem Variablennamen, dem Buchstaben i, , der für den Initialisierer oder den Anfangswert kurz ist. Dies ist im Allgemeinen der Fall, wenn wir diese Variable nur für die Zwecke der Schleife verwenden und keine beschreibenden Variablennamen an anderer Stelle benötigen . Beachten Sie, dass wir die Semikolons immer noch an Ort und Stelle halten müssen , damit wir diese drei Werte klar auf einige Beispiele aufteilen können . Lasst uns in unsere Starter-Dateien springen. Springen Sie für diesen Abschnitt in Abschnitt Nummer 6, was Schleifen und Bedingungen sind. Die erste Lektion, die for-loops ist, springt auf die Indexseite, die vorerst ziemlich leer ist. Dann kopieren wir den Pfad dazu und fügen ihn dann in den Browser ein. Wir haben momentan keinen Inhalt, nur den for-loops-Titel und dann das leere Skript unten, und dann das leere Skript unten in dem wir arbeiten können. Springen wir in den Skriptbereich und wir können damit beginnen, unsere erste for-Schleife zu erstellen. Wie wir zuvor nachgeschlagen haben, verwenden wir das Schlüsselwort for, Bracket starten unsere kostenlosen Anweisungen und dann die geschweiften Klammern. In diesem Beispiel simulieren wir jemanden, der eine Pizza mit 10 verschiedenen Scheiben isst. Dann ziehen wir nach jeder dieser Schleifen eine Pizzascheibe ab. Zuallererst unser Initialisierer oder unsere Variable, die wir Slices nennen werden. Wir legen fest, dass dies der Anfangswert von 10 ist, und im nächsten halten wir die Schleife so lange wie diese Slices gleich oder größer als der Wert von einem Add a Semikolon sind. Dann ziehen wir den Wert von Slices jedes Mal um den Wert von eins ab. Jetzt, um es zusammenzufassen, beginnen wir mit 10 Slices oder dem Wert von 10. Nachdem die Schleife beendet ist, wird ein Slice abgezogen, um dann gleich neun zu sein, neun ist größer oder gleich eins, sodass die Schleife daher weiter läuft. Dann läuft es ein zweites Mal. Dann werden die Pizzascheiben auf acht und dann sieben, dann sechs abgezogen . Es läuft weiter, bis der Wert größer oder gleich eins ist. Innerhalb der geschweiften Klammern fügen wir den Code hinzu, den Sie ausführen möchten. Nehmen Sie ein einfaches Beispiel, wir können ein Konsolenprotokoll mit dem Wert von Slices erstellen. Dies wird von 10 bis zu eins abgezogen . Danach ein zweites Konsolenprotokoll mit dem Text jedes Slice. Wir können hier auch Dinge wie bedingte Aussagen hinzufügen . Diese bedingte Anweisung wird prüfen, ob die Slices dem Wert von eins entsprechen. Wenn ja, werden wir in einem Konsolenprotokoll mit dem Text ohne Scheiben vorhanden sein. Speichern wir das und springen wir in die Developer Tools. klicken Sie mit der rechten Maustaste und „Inspect“ in die Konsole. Wir sehen, dass der Wert von 10 der ersten Schleife jedes Mal vom Wert einer abgezogen wird . Wir kommen den ganzen Weg auf den Wert von eins und dann braucht es eine Notiz der übrig gebliebenen Scheiben. Etwas, das Sie vielleicht sehen, aber wahrscheinlich fehlt nicht so viel ein zweiter Wert, was diese Bedingung ist. Wir müssen jedoch das Semikolon an Ort und Stelle lassen , und bevor wir dies testen, Sie möglicherweise bereits ein Problem fest. Wenn Sie keine Bedingung haben. Wir haben keine Möglichkeit, eine Schleife zu stoppen. Das wird einfach unendlich weiterlaufen. Darauf müssen wir beim Erstellen von Schleifen achten . Wir müssen sicherstellen, dass die Loops-Bedingung schließlich falsch wird. Andernfalls würden wir in einer Endlosschleife landen, was daher zum Absturz des Browsers führen würde. Tun Sie das nicht und folgen Sie diesem Beispiel nicht. Aber ich zeige Ihnen, was im Browser passiert. Wenn wir das speichern, aktualisieren Sie es. Wir sehen, dass die Schleife tausende Male läuft, was alle Ressourcen des Browsers in Anspruch nimmt schließlich zum Absturz führt. Um dieses Zerkleinern oder diese Endlosschleife zu vermeiden, müssen wir das Schlüsselwort break innerhalb der Schleife manuell verwenden , wenn es dann stoppt. Wenn wir zum Beispiel zu diesem unteren Abschnitt gehen, wissen wir in der if-Anweisung, dass dies die letzte Schleife ist. Was wir tun können, ist, dass wir das Schlüsselwort break hinzufügen können. Dies bricht dann aus der Schleife aus und stoppt dann die Ausführung des Codes. Wir können dies testen, indem wir den Browser erneut öffnen. Öffnen Sie die Index-Seite und springen Sie dann in die Developer Tools und die Konsole und unsere Schleife, sie funktioniert jetzt wie erwartet. Eine weitere nützliche Sache, die wir mit for-loops tun können , ist das Erstellen mehrerer Elemente wie Listenelemente. Mit einer Schleife können wir sagen, 10 Elemente mit viel weniger Code erstellen, 10 Elemente mit viel weniger Code als wir es tun würden, wenn wir dies 10 Mal ausschreiben würden. Lassen Sie uns das nur innerhalb des Skripts machen, wird eine Konstante namens ul erstellen, wo wir eine neue ungeordnete Liste erstellen. Wir machen das mit document.createElement. Übergeben Sie die ul-Elemente , die Sie erstellen möchten. Kurz bevor wir mit der Erstellung der Listenelemente beginnen, hängen wir unsere ungeordnete Liste an den Körper an. Schnappen Sie sich den Körper mit document.body.appendChild geben Sie unsere ul Variable ein. nur zu dem zurückgehen, was wir uns vorher angeschaut haben, werden wir unser Pizza-Beispiel ändern und dies durch den Variablennamen i ersetzen. Denken Sie daran, dass ich eine übliche Benennungskonvention für eine Variable innerhalb von eine Schleife. Wir werden dies zunächst auf einen Wert von eins festlegen. Wir werden das von vorhin umgekehrt machen. Wir beginnen mit dem Anfangswert von eins und dann lassen wir die Schleife laufen, solange ich kleiner oder gleich dem Wert von 10 ist. Daher müssen wir dies um den Wert von eins in jeder Schleife erhöhen , wodurch die Schleife 10 Mal ausgeführt wird. Wir können alle Inhalte hier von innen verschieben und dann unsere Listenelemente erstellen. Lassen Sie uns unser Listenelement erstellen. Wir wählen den document.createElement-Pass im Listenelement aus. Bewahren Sie dies in einer Konstante namens Li auf. Dies gibt uns dann einen leeren Listeneintrag. Wir müssen den Inhalt dann in das öffnende und schließende Tag platzieren . Wir können dies mit Documents.createTextNode tun, und wir können in jedem Beispieltext platzieren wir hier verwenden möchten. Anstelle einer regulären Zeichenfolge füge ich eine Variable mit den Backticks ein. Wir sagen, dass Listenelement in unserer Variablen mit dem $ -Symbol und den geschweiften Klammern platziert ist. Wir wissen von oben, dass wir eine Variable namens i haben, die dem Wert von eins entspricht. Wenn Sie dann weiter um den Wert von eins für jede Schleife ansteigen . Wir können uns das ansehen, indem wir das hier hineinlegen. Dies sollte mit dem Wert von Listenelement eins, Listenelement zwei usw. beginnen . All das innerhalb einer Konstante, sagen wir Text. Dann können wir diese beiden zusammenführen , indem wir auf das übergeordnete Element zugreifen, das ist das Listenelement use AppendChild. Platzieren Sie dann unseren Text in das Listenelement. Wenn wir schließlich jedes dieser Listenelemente erstellen, möchten wir uns dann zu unserer ungeordneten Liste bringen. Auf die gleiche Weise wie bei unserem Listenelement. Wir wählen unsere ungeordnete Liste AppendChild aus, an die wir unseren Listeneintrag übergeben. Schauen wir uns das an, aktualisieren Sie den Browser. Das muss nur ich sein, um mit der variablen Aktualisierung übereinstimmen zu können. Jetzt sehen wir den Wert des Listenelements eins bis zur Liste von Punkt 10. Wie Sie sich vorstellen können, würde dies zu viel mehr Code führen , wenn wir diese 10 separate Male erstellen würden. Die Verwendung dieser Schleife macht es zu einem viel kürzeren Beispiel. 5. ...in & für...von: Wir werden jetzt zwei weitere Arten von Schleifen abdecken, die for-In und auch for-of genannt werden. Sie sehen ziemlich ähnlich aus und beide bewegen sich über etwas, wie Sie es erwarten würden, aber der Hauptunterschied ist, was sie durchlaufen können. Lasst uns die Starterdateien öffnen und sehen, was wir haben. die Seitenleiste springen zur Lektion Nummer 2 in diesem Abschnitt, die for-in und für-of ist, und öffnen Sie diese dann im Browser. Zunächst sehen wir einen For-In-Abschnitt, in dem ein Produktobjekt mit verschiedenen Eigenschaften verschachtelt ist. Wie Sie vielleicht erwarten, funktioniert eine For-In-Schleife auf diese Weise. Wir verwenden diese Art von Schleife, um die Eigenschaften innerhalb eines Objekts zu durchlaufen, z. B. den Namen und die Größe. Nun wird dies den for-of-Abschnitt haben, und dies wird verwendet, um iterierbare Objekte zu überlaufen. Ein iterierbares Objekt ist im Grunde einige von ihnen, die wir durchlaufen haben, z. B. ein Array oder eine Knotenliste. Beginnen wir ganz oben mit unserer For-In-Schleife, und wir werden diese verwenden, um unsere Produktobjekte zu durchlaufen. Wir können das direkt unten machen. Das sieht ein bisschen wie unsere for-Schleife aus dem vorherigen Video aus, wir haben das for-Schlüsselwort, die Klammern und dann die geschweiften Klammern eingerichtet . Springen Sie zum ersten Satz von Klammern, und so funktioniert eine For-In-Schleife. Wir richten eine Variable ein und rufen diese Eigenschaft auf, da wir alle Eigenschaften in diesem Objekt durchlaufen , das sich in unserem Produktobjekt befindet. Hier kommt der Begriff for-In, wir haben das Schlüsselwort for und dann das Schlüsselwort in den Klammern. Wir schleifen über dieses vollständige Produktobjekt und speichern dann den Wert der Eigenschaft innerhalb dieser Konstante. Mal sehen, wie es mit einem Konsolenprotokoll über den Wert unserer Variablen aussieht , nämlich Eigenschaft, Refresh, und wir sehen den Wert der SKU, den Namen, die Größe und die Farbe. Dies gibt uns den Wert des Schlüssels, aber was ist mit dem tatsächlichen Immobilienwert wie cooles Hemd, Medium und auch Blau? Nun, wir können dies auch tun, indem wir auf unser Produkt zugreifen und dann die eckigen Klammern verwenden. Werfen wir einen Blick darauf, wie das in einem Konsolenprotokoll aussieht. Wir können die Back-Ticks verwenden, um eine Variable einzufügen, und wir fügen zunächst den Wert der Eigenschaft ein. Dies sind nur die Schlüssel, die wir bereits in der Konsole sehen werden , aber fügen Sie danach einen Doppelpunkt hinzu, um dies zu trennen , und fügen Sie dann unsere zweite Variable ein. Die zweite Variable wird jedes dieser Produkte sein. Wir schnappen uns das Produkt und können dann die eckigen Klammern verwenden, um dies auf eine bestimmte Eigenschaft einzugrenzen. Wir geben den Wert von SKU, Name, Farbe oder Größe weiter. Wenn wir dies speichern und aktualisieren, haben wir jetzt für jede dieser Eigenschaften eine neue Zeichenfolge erstellt , die sowohl den Schlüssel als auch den Wert der Eigenschaft enthält . So funktioniert eine For-In-Schleife, um über ein Objekt zu schleifen. Werfen wir jetzt einen Blick auf for-of. Ich möchte diesen Abschnitt kommentieren und dann nach unten unter unseren Berechtigungen gehen. Dies beginnt auch mit dem Schlüsselwort for, den Klammern und den geschweiften Klammern, und es nimmt auch eine Variable auf. Nehmen wir an, const value , der auf jeden der Werte innerhalb des Arrays festgelegt wird . Dieses Mal, anstatt das Schlüsselwort in zu verwenden, das wir verwenden, und geben Sie dann genau das ein, was wir durchlaufen möchten. In unserem Fall ist es das Berechtigungs-Array von oben. Dies ist in Berechtigungen, und dann können wir innerhalb der geschweiften Klammern auf unseren Wert zugreifen. In der ersten Schleife ist der Wert user, die zweite Schleife ist Editor und dann Admin, Speichern und Aktualisieren, und es gibt unsere drei Werte in der Konsole. Wie Sie oben in seinen Kommentaren sehen können, können auch Dinge wie eine Knotenliste überlaufen werden. Denken Sie daran, wenn wir etwas wie den Abfrageselektor verwenden , um mehrere Elemente zu erhalten, erhalten wir eine Knotenliste zurück. Um dies auszuprobieren, brauchen wir auch einige Elemente, die Sie durchlaufen müssen. Ich springe aus diesen Skripten erstelle eine ungeordnete Liste mit einigen Beispiellistenelementen direkt darin. Lassen Sie uns dies noch zweimal duplizieren , anstatt Nummer 2 und 3 zu drehen, und dann können wir unsere drei Listenelemente durchlaufen, die dann eine Knotenliste zurückgeben, daher können wir die for-of-Schleife verwenden. Schritt 1 besteht darin, auf alle drei dieser Listenelemente zuzugreifen. Ich werde direkt über unserer for-Schleife einen konstanten Anruflink erstellen, einen konstanten Anruflink erstellen, diese mit document.QuerySelector abrufen, tatsächlich brauchen wir QuerySelectorAll, da wir auf mehrere Elemente zugreifen und sobald Sie unsere Liste aufrufen Gegenstände. Anstatt auf unsere Berechtigungen zuzugreifen, werden wir nun auf alle Links zugreifen, nämlich unsere drei Listenelemente , unsere drei Listenelemente , und dann den Variablennamen in den Link ändern. Der Wert von Link unserer ersten Schleife ist das erste Listenelement und das zweite Listenelement und dann das dritte. Mit diesen Links können wir alles tun, was wir wollen. In diesem Beispiel greife ich auf unsere Links zu und verwende dann addEventListener. Hören Sie sich einen Klick auf eines dieser Punkte an. Dies führt dann eine Funktion aus, wir geben die Ereignisinformationen erstellen eine Warnung. Um auf die Inhalte in jedem dieser Listenelemente wie 1, 2 und 3 zuzugreifen, können wir dies tun, indem wir auf die Ereignisinformationen zugreifen und e. target auswählen, das die Informationen darüber bestimmtes Listenelement, auf das geklickt wurde, und zeigt dann das innerHTML dieses Elements an. Probieren wir das mal aus. Wenn wir jetzt aktualisieren, haben Sie unsere kostenlosen Links oben, klicken wir auf Nummer 2, da ist das InnerHTML. Nummer 3 und auch Nummer 1 funktioniert auch richtig. Dies ist ein paar wirklich nützliche Varianz der for-Schleife , mit der wir Dinge wie Arrays, Knotenliste und auch Objekte durchlaufen können . 6. Während & do...: Meiner Meinung nach sehen Loops etwas einfacher aus als die vier Schleifen , die wir vorher nachgeschlagen haben. Das Basis-Setup ähnelt wieder vielen anderen Dingen in JavaScript, z. B. einer Basisfunktion und if-Anweisungen und sogar der for-Schleife. Eine While-Schleife läuft weiter, solange eine Bedingung auf „true“ gesetzt ist. In diesem Beispiel haben wir eine einfache Zahlenvariable und dann läuft die Schleife weiter während die Zahl kleiner als 30 ist. Diese Überprüfung wird durchgeführt , bevor der Code in der Schleife ausgeführt wird Wenn er also falsch ist, stoppt die Schleife. Wie bei der for-Schleife brauchen wir auch eine Möglichkeit, Dinge tatsächlich zu stoppen , damit es nicht zu einer Endlosschleife wird. Wir tun dies innerhalb der Schleife, indem wir den Wert der Zahl in jeder Schleife um eins erhöhen . Das heißt, es wird 30 Mal laufen, bevor es dann aufhört. Gehen wir zu unseren Starterdateien und probieren Sie es aus. Die nächste Lektion, die wir brauchen, ist Nummer 3. Es ist der While-Loop-Abschnitt. Öffnen Sie dies und auch innerhalb des Browsers. Wie Sie sehen können, haben wir eine leere Starterdatei mit dem Skript unten. Was wir hier machen werden ist ein paar Variablen einzurichten. Zuallererst eine Konstante namens StadiumCapacity, und setzen Sie diese auf einen Wert von 100. Dies ist die Stadionkapazität und als nächstes werden wir eine zweite Variable einrichten, die für die Anzahl der Fans gilt , die wir derzeit betreten haben. Da dies erhöht werden kann, müssen wir das Schlüsselwort verwenden und dieses auf einen Wert von currentlyEnted-Wert setzen, der mit dem Wert Null beginnt. Was wir tun wollen, ist, eine Schleife weiter auszuführen, während der Wert von currentlyEnted-Wert kleiner ist als der stadiumCapacity. Eine While-Schleife ist dafür ideal. Wir richten unser While-Schlüsselwort, die Klammern und dann die geschweiften Klammern kurz danach ein. Was wir tun werden, ist, diese Schleife am Laufen zu halten , während der Wert von CurrentlyEnted-Wert , der Null ist, kleiner ist als der StadiumCapacacity. Grundsätzlich wird der Code hier ausgeführt, wenn Null weniger als 100 ist. Platzieren Sie ein Konsolenprotokoll mit einem Eingabetext, und wir sollten in der Lage sein, zur Konsole zu gehen und dies zu überprüfen. Aber kurz bevor wir das tun, gehen wir einen Schritt zurück und schauen uns diese Schleife an. Wenn wir darüber nachdenken, möchten wir einen Blick auf unseren Zustand werfen in dem sie derzeit geringer ist als die stadiumCapacity. Im Moment haben wir keine Möglichkeit, diese beiden variablen Werte zu ändern. Im Grunde wird dies immer der Wert von true sein. Dies führt dann zu einer Endlosschleife und verursacht erneut einen Absturz im Browser. Um diese While-Schleife nur eine bestimmte Anzahl von Malen auszuführen, benötigen wir eine Möglichkeit, den Wert von CurrentlyEnted-In jeder Schleife zu erhöhen . Das ist ziemlich einfach. Wir greifen einfach auf unseren Wert zu und verwenden dann plus plus, was dies um den Wert einer in jeder Schleife bis zum Wert von 100 erhöht . Sobald dies den Wert 100 erreicht hat, wird diese Bedingung nicht mehr wahr sein, was bedeutet, dass unsere Schleife gestoppt wird. Schauen wir uns das im Browser an, aktualisieren und in die Konsole springen. Gut und wir sehen, dass unser Text der Eingabe 100 Mal wiederholt wurde. Die Varianz dieser While-Schleife ist Do-while. Dies ist eine umgeschaltete Version dieser While-Schleife. Bevor ich in den Folien bin, habe ich erwähnt, dass der Code in dieser Schleife immer ausgeführt wird, nachdem diese Bedingung überprüft wurde. Wenn dies zu „false“ führt, wird der Code in dieser Schleife grundsätzlich nie einmal ausgeführt. Wir können dies umdrehen und sicherstellen , dass der Code mindestens einmal ausgeführt wird , und dann den Check anschließend durchführen. Dies ist nützlich, wenn wir immer sicherstellen möchten , dass der Code mindestens einmal ausgeführt wird , bevor die Schleife beendet wurde. Um dies zu tun, erstellen wir direkt über unserem While-Abschnitt einen Do-Bereich. Wir sagen tun, öffnen Sie die geschweiften Klammern, und da wir immer wollen, dass dies einmal läuft, springen wir einfach direkt in die geschweiften Klammern, wir müssen keine Bedingung hinzufügen. Dann können wir unseren Code aus der While-Schleife abrufen . Schneide das fehl am Platz. Fügen Sie dies in den Abschnitt „Do“ hinzu. Ich entferne die geschweiften Klammern aus der While-Schleife. Wie Sie sehen können, befindet sich der Code jetzt im Abschnitt „do“, was bedeutet, dass dieser immer mindestens einmal ausgeführt wird , bevor wir unseren Check überhaupt durchführen. Unser Scheck ist immer noch wahr, dies wird in unserem Fall das zweite Mal bis zu 100 laufen . Schauen wir uns das an. Wir können dies speichern und den Browser aktualisieren. Wir haben immer noch genau die gleichen Ergebnisse wie zuvor erzielt. Wir können dies testen, indem wir den Wert von currentlyEnted-Wert auf 100 setzen, wodurch dies dann auf „false“ festgelegt wird. Wenn wir dies jetzt speichern und aktualisieren, sehen wir unseren Log-Wert für eine einzelne Konsole von enter, da unser Code zuerst ausgeführt wird und dann die Überprüfung innerhalb der While-Schleife durchführt. Dies ist nur eine Alternative, je nachdem , ob der Code immer zuerst ausgeführt wird oder zuerst die Bedingung testen soll, bevor wir zuerst ausgeführt wird oder zuerst die Bedingung testen soll einen Code in unserer Schleife ausführen. 7. Wenn / Sonstige Aussagen & Nesting: Springen Sie für dieses Video in den Abschnitt „If-else-Anweisungen“ und öffnen Sie dies auch im Browser. Sie können oben sehen, dass wir ein Benutzerobjekt bereits eingerichtet haben und auch die if-Anweisung direkt unten. Also haben wir if-Anweisungen schon einige Male in früheren Beispielen verwendet . Es gibt nicht viel mehr zu ergänzen als das, was wir bereits behandelt haben. Sie führen einfach etwas Code zwischen diesen geschweiften Klammern aus. Wenn die Bedingung in hier auf „wahr“ eingestellt ist. In diesem Beispiel haben wir oben ein Benutzerobjekt. Dies würde zur Folge haben, da wir ein Objekt vorhanden haben, was bedeutet, dass unser Konsolenprotokoll funktioniert. Wenn der Benutzer abgemeldet wäre, würde er möglicherweise unsere Variable auf Null setzen , genau wie folgt, so dass der Benutzer gleich null ist, was zu einem falschen Wert und dem Code innerhalb des if führen würde Anweisung würde nicht laufen. Also hier kümmern wir uns darum, ob die Bedingung wahr ist. Aber was ist, wenn wir auch damit umgehen wollen, wenn die Bedingung falsch ist? Nun, hier kommen andere Aussagen ins Spiel. Wir platzieren diese unmittelbar nach der if-Anweisung und dieser Codeblock wird in allen Fällen ausgeführt , die nicht durch den if-Abschnitt abgedeckt werden. Wir haben diese ähnlichen Beispiele innerhalb der Starterdateien eingerichtet innerhalb der Starterdateien und hier behandeln wir die Bedingung nur , wenn der Benutzer angemeldet ist. Vielleicht denken Sie darüber nach, warum nicht einfach mit der Abmeldebedingung darunter umgehen. Oder wir könnten so etwas machen. Wir könnten ein Konsolenprotokoll oder einen beliebigen Code erstellen, in dem wir sagen können, dass der Benutzer abgemeldet ist. Nun, lass uns das testen und sehen, was passiert, wenn wir aktualisieren und in die Konsole springen. Hier sehen wir, dass das Konsolenprotokoll zweimal ausgeführt wurde. Wir haben den Benutzer angemeldet und auch der Benutzer ist ausgeloggt. Für etwas sicherheitsempfindliches, z. B. wenn ein Benutzer ein- oder ausgeloggt ist, möchten wir natürlich sicherheitsempfindliches, z. B. wenn ein Benutzer ein- oder ausgeloggt ist, nur eine dieser Bedingungen ausführen. Dies können wir unsere if-Aussagen einrichten, die wir oben haben, gefolgt von der else-Aussage. Entfernen wir das Konsolenprotokoll. Ich platziere den anderen Abschnitt und füge unseren Code hier hinzu. Lassen Sie uns aktualisieren und wir sehen, dass der Benutzer angemeldet ist, da oben ein Benutzerobjekt vorhanden ist. Wenn wir dies auch ändern , um das Gegenteil zu sein, und setzen den Benutzer auf einen falschen Wert von null. Dies sollte dann sein, dass der Benutzer abgemeldet ist. Wenn wir wollten, könnten wir auch mehrere if-Anweisungen hinzufügen und lassen Sie uns unsere else-Aussage einfach nach unten schieben. Dann können wir dazwischen eine zweite if-Anweisung hinzufügen , genau wie oben. Wir können eine zweite Bedingung wie einen Benutzer oder eine Rolle überprüfen, die derzeit auf admin eingestellt ist. Wir können überprüfen, ob dies ein bestimmter Wert ist und ob es sich innerhalb der geschweiften Klammern befindet, führen wir ein Konsolenprotokoll durch, sagen wir, Hey admin, testen Sie dies, aktualisieren. Jetzt sehen wir, dass der Benutzer angemeldet ist und auch die Admin-Rolle ist. Das funktioniert, aber das stellt auch ein Problem dar, wir müssen bei dieser Art von Setup sehr vorsichtig sein. Denn diese sonste-Aussage, die wir unten haben werden folgt sofort der zweiten if-Anweisung. Dies bedeutet, dass der Abschnitt else jetzt nur ausgeführt wird , wenn die Rolle des Benutzers nicht auf admin eingestellt ist, was keinen Sinn ergibt. Wir hatten also einen Benutzer wie null, also sind wir mit dem nicht angemeldet. Aktualisieren. Dies wird nun einen Fehler auslösen, da wir versuchen, auf die Benutzerpunktrolle zuzugreifen, die nicht mehr verfügbar ist, da wir unsere Benutzerobjekte nicht mehr haben. dieses Beispiel zu verwenden , um es ein bisschen sinnvoller zu machen und praktikabler zu sein, möchten wir nur überprüfen, ob die Rolle des Benutzers dem Administrator entspricht, hat sich tatsächlich angemeldet. Um dies zu tun, können wir unsere if-Aussagen verschachteln indem wir die zweite if-Aussage ausschneiden. Wir können das in den ersten einfügen. Dies bringt uns zurück zum ersten Beispiel. Wir haben zwei Top-Level-Checks. Wir haben die if-Anweisung, der Benutzer ist angemeldet, gefolgt von dem anderen Abschnitt unten. Dann wird die if-Anweisung, die darin verschachtelt ist, immer nur ruiniert, wenn sich der Benutzer tatsächlich angemeldet hat. Wenn der Benutzer angemeldet ist, wird dieses Konsolenprotokoll ausgeführt. Wenn sie dann auch als Admin-Rolle angemeldet sind, wird auch das zweite Konsolenprotokoll ausgeführt. Probieren wir das mal aus. Aktualisieren, und der Fehler ist jetzt gelöscht. Wir sehen, dass der Benutzer abgemeldet ist , da der Benutzer auf null eingestellt ist. Lassen Sie uns dies wieder einsetzen, der Name entspricht allem in der Rolle zurück zum Admin. Da dies jetzt vorhanden ist, haben wir jetzt einen Benutzer. Das erste Konsolenprotokoll sollte also ausgeführt werden. Wir haben auch eine Benutzerrolle , die dem Administrator entspricht. Wir sollten jetzt zwei Konsolenprotokolle hier sehen. So können wir „if else“ -Anweisungen auf oberster Ebene verwenden und auch wie wir eine if-Anweisung auch darin verschachteln können. Wenn Sie möchten, könnten Sie auch kurz nach dem verschachtelten if-Abschnitt noch weiter enden, wir könnten auch in einen anderen Abschnitt platzieren damit wir ein Konsolenprotokoll erstellen können. Für diesen Abschnitt wissen wir, dass der Benutzer tatsächlich angemeldet ist, aber wir möchten auch prüfen, ob er nicht der Administrator ist. Also hier läuft das, wenn sie der Admin sind. Ansonsten sagen wir einfach: Hey user, aktualisieren. Wir sehen immer noch hey admin, da die Rolle darauf eingestellt ist. Wenn wir dies jedoch als Abonnent ändern, ist die verschachtelte if-Anweisung jetzt falsch, was bedeutet, dass der Abschnitt hey user jetzt ausgeführt wird. Wenn du willst. Sie könnten auch so tief gehen, wie wir wollten, indem Sie mehrere, wenn sonst auch Abschnitte innerhalb der verschachtelten Abschnitte verschachtelt haben. Aber wir müssen darauf achten, nicht über Bord zu gehen und den Code schwer zu lesen und auch für andere Entwickler zu verstehen. In der Regel können wir die meisten Anwendungsfälle in der Regel abdecken , ohne in die Tiefe gehen zu müssen. Wenn Sie also feststellen , dass Sie vielleicht drei oder vier Ebenen tief mit if-Anweisungen oder Schecks sind , gibt es normalerweise einen besseren Weg, Dinge zu tun. 8. Sonst wenn: Im Ordner dieser Lektion , der der andere if-Abschnitt ist, finden Sie direkt unten im Skript das gleiche Beispiel aus dem vorherigen Video. Hier kümmern wir uns um zwei Top-Level-Bedingungen, die wir einchecken. Zunächst einmal, wenn der Benutzer angemeldet ist und dann im Abschnitt erfassen, was passiert wenn der Benutzer nicht angemeldet ist. Innerhalb des angemeldeten Abschnitts haben wir auch einen verschachtelten Abschnitt, wenn sonst. Fügen Sie eine andere Begrüßung hinzu, wenn der Benutzer dem Administrator entspricht. Wir haben zwei Optionen auf der obersten Ebene und auch zwei verschachtelte Optionen. Aber was ist, wenn wir auch eine dritte Option wollten? Dafür haben wir auch anderes wenn. Werfen wir einen Blick darauf, wir werden dieses Beispiel vereinfachen , indem wir die verschachtelten Anweisungen entfernen. Im Inneren von hier entfernen wir das verschachtelte, wenn uns sonst ein einfaches eingeloggt oder ausgeloggt bleibt. Wenn Sie sich an das vorherige Video erinnern, haben wir uns angeschaut, wie Sie kurz mit einer dritten Bedingung umgehen können, indem wir eine zweite if-Anweisung hinzugefügt haben, genau wie diese. Aber das Problem, das uns verursacht, ist, dass der andere Abschnitt jetzt mit unserer zweiten if-Aussage verbunden ist. Im Wesentlichen bedeutet, dass unsere erste if-Anweisung jetzt getrennt ist. Wenn wir immer noch alle drei davon in Verbindung bringen wollen, können wir diese zweite in einen anderen Ort verwandeln , wenn, an einem anderen Ort. Kurz vor dem if-Abschnitt können wir hier eine zweite Bedingung hinzufügen. Zunächst möchten wir prüfen, ob der Benutzer angemeldet ist, und dann können wir mit dem doppelten kaufmännischen Und-Zeichen auch einen zweiten Check durchführen. Wir können überprüfen, ob die user.role gleich dem Abonnenten ist, und wenn ja, führen wir den Code hier aus. Jetzt platzieren wir einfach ein einfaches Konsolenprotokoll, das besagt , dass der Abschnitt sonst ausgeführt wurde , speichern Sie diesen und dann zum Browser und wir werden sehen, was hier passiert. Wir sehen den Text des angemeldeten Benutzers. Sie fragen sich vielleicht, warum wir den Text nur des angemeldeten Benutzers sehen und nicht auch den sonst, wenn der Abschnitt ausgeführt wurde, da der gesamte Benutzer anwesend ist und auch die user.role gleich dem Abonnenten ist. Nun, der Grund ist, dass nur einer dieser Abschnitte ausgeführt wird. Wenn die Bedingung erfüllt wurde, wird der Code im Inneren ausgeführt und der Rest dieser Abschnitte wird nicht weiter nach unten gehen . Effektiv wird nur das erste Match ausgeführt. Wenn wir möchten, dass es mit dem ersten Abschnitt genauer ist, können wir diesen user.role auch in den ersten Abschnitt kopieren in den ersten Abschnitt und wir können auch prüfen, ob dies dem Admin entspricht. Da unsere Benutzerrolle dem Abonnenten entspricht, sollten sie jetzt falsch sein. Denn nirgendwo sonst, wenn der Abschnitt jetzt laufen soll. Speichern wir das und testen Sie dies im Browser aus. Der sonst if-Abschnitt wird jetzt ausgeführt. Da dies unser erster Abschnitt ist , der dazu führt, können wir jetzt in jedem dieser Abschnitte tun, was wir wollen , können wir Inhalte je nach Rolle des Benutzers ein - und ausblenden . Wir können sie in einen Kontobereich umleiten. Wir können Funktionen deaktivieren die der Benutzer möglicherweise nicht zugreifen darf, oder irgendetwas anderes, was Sie sich vorstellen können. Wir können auch mehrere andere Abschnitte verwenden. Wenn wir mehr als diese drei Bedingungen überprüfen wollten, könnten wir das Gleiche auch gleich nach dem anderen if-Abschnitt tun , in einem zweiten platziert wurde. Es ist wahrscheinlich von oben konditioniert. Dieses Mal prüfen wir, ob die user.role gleich dem Autor ist. Wenn es in einem Konsolenprotokoll platziert wird, speichern Sie dies und wie erwartet, sollten wir das gleiche Ergebnis wie zuvor sehen da wir den Abonnenten festgelegt haben , der diesem Abschnitt entspricht . Aber wenn wir dies jetzt ändern, um das Angebot zu sein, ist der if-Abschnitt jetzt falsch und dann der erste andere, wenn der Abschnitt auch falsch ist und unser neues Konsolenprotokoll mit dem Text des Autors würde der erste andere, wenn der Abschnitt auch falsch ist und unser neues Konsolenprotokoll mit dem Text des Autors nun ausgeführt wird in der Konsole. Schließlich, wenn keine davon, wenn Abschnitte wahr sind, also ändern wir uns so etwas wie Benutzer, sollten wir nun zurückgreifen , um den anderen Abschnitt unten zu verwenden. 9. Die Switch-Anweisung: Switch-Anweisung ist eine Möglichkeit, basierend auf einer einzigen Bedingung so viele Ergebnisse zu liefern , wie wir benötigen. Wir können auch mehrere Ergebnisse mit if-Aussagen liefern und wenn sonst Aussagen, wie wir es zuvor gesehen haben. Aber wie wir herausgefunden haben, müssen wir für jede dieser Bedingungen etwas hinzufügen , das wir überprüfen können, z. B. wenn wir Dinge wie die Rolle des Benutzers für jede dieser Bedingungen überprüfen. Mit einer Switch-Anweisung testen wir jedoch nur für jede einzelne Bedingung. Gerade hier mit unserer Lieblingspizza-Variable. Die Switch-Anweisung direkt darunter sieht in ihrem Setup wieder ähnlich wie leere if-Anweisungen und auch for-loops. Wir geben dann ein, was wir überprüfen möchten, wie unsere Lieblingspizza-Variable. Dann haben wir drinnen die verschiedenen Fälle eingerichtet, um mit der Lieblingspizza umzugehen . Hier haben wir drei verschiedene Fälle, um zu behandeln, was für jeden Wert zu tun ist. Wir können so viele dieser Fälle haben, wie wir wollen. Schauen wir uns den ersten an. Wir prüfen, ob die Lieblingspizza Peperoni entspricht. Wenn ja, führen wir einen Code darin aus, wie dieses Konsolenprotokoll. Wir stellen dann das break-Schlüsselwort zur Verfügung, um aus der Switch-Anweisung auszubrechen , sobald wir eine Übereinstimmung haben, und dies verhindert, dass der Rest des Codes und der Rest der unten stehenden Schecks ausgeführt wird. Dies ist das gleiche Break-Schlüsselwort, das wir zuvor in diesem Abschnitt verwendet haben , um zu verhindern der Browser eine Endlosschleife erstellt. Dies wird so lange laufen, bis eine Übereinstimmung gefunden wird, aber wenn eine nicht gefunden werden kann, können wir auch eine Standardklausel hinzufügen. Dies wird immer laufen, wenn es keine anderen Übereinstimmungen gibt. Rüber zum Projekt und lasst uns das mal ausprobieren. Dieses Mal befinden wir uns im Abschnitt Switch-Anweisungen und innerhalb der Starterdatei haben wir nur ein einfaches Benutzerobjekt mit der Name-Eigenschaft und auch der Rolle. Wir können eine Switch-Anweisung einrichten, um die Rolle des Benutzers zu überprüfen und zu entscheiden, ob der Benutzer etwas auf unserer Website bearbeiten kann. Dies können wir in einer Variablen namens CanEdit starten. CanEdit wird also zunächst auf den Wert false festgelegt, sodass dem Benutzer standardmäßig keine Bearbeitungsberechtigungen zugewiesen werden . Dann können wir eine Switch-Anweisung verwenden, um die jeweilige Rolle des Benutzers zu überprüfen. Wenn die jeweilige Rolle des Benutzers einer höheren Ebene wie dem Administrator oder sogar einem Editor entspricht, können wir CanEdit so einstellen, dass CanEdit gleich true ist einer höheren Ebene wie dem Administrator oder sogar einem Editor entspricht, . Genau wie wir es in den Folien gesehen haben, richten Sie unsere Switch-Anweisungen ein und dann übergeben wir die Bedingung , die user.role ist. Öffne die geschweiften Klammern, dann können wir unsere Fälle hier hinzufügen. Der erste Fall wird der Benutzer sein. Dies ist nur ein regulärer angemeldeter Benutzer. Füge den Doppelpunkt hinzu. Danach fügen wir hinzu , was wir für diesen speziellen Fall tun wollen. Nun, in unserem Fall möchten wir CanEdit so lassen, dass er falsch ist, da sie weder über die Administratorberechtigungen noch den Editor verfügen. Wenn dieser spezielle Fall zutrifft, möchte ich das Schlüsselwort break nicht verwenden, um aus den restlichen dieser Switch-Anweisungen auszubrechen. Das ist der erste Abschnitt. Dann gehen wir zum zweiten Fall und dieser wird ein Abonnent sein. Dies würde einfach den gleichen Zustand widerspiegeln wie oben. Wir können festlegen, dass canEdit gleich false ist. Fügen Sie die Break-Schlüsselwörter hinzu. Das ist unser zweiter Fall, der jetzt abgeschlossen ist. Im nächsten Schritt fügen wir einen Fall für den Editor hinzu. Und wie es klingt, ist der Editor ein Fall, in dem wir dem Benutzer erlauben möchten , bearbeiten zu können. Dafür setzen wir unsere canEdit-Variable auf „true“ brechen dann aus der Switch-Anweisung aus. Schließlich wird der letzte Fall für den Admin sein. Im Admin möchten wir alle Berechtigungen erteilen, die sie benötigen, um dann unsere Website zu bearbeiten. Wie oben setzen wir CanEdit auch auf true und brechen dann aus der Switch-Anweisung aus. Wie wir in den Folien gesehen hätten, müssen wir auch einen Standardfall hinzufügen , der ausgeführt wird, wenn keiner der oben genannten Fälle übereinstimmt. Sehr einfaches Beispiel: Platzieren Sie einfach ein Konsolenprotokoll und wir sagen, dass die Benutzerrolle nicht gefunden werden kann. Wir setzen CanEdit auch auf „false“. Jetzt müssen wir das nur noch testen. Als wir hier angefangen haben, haben wir die Benutzerrolle, die dem Benutzer entspricht. Dies sollte darauf setzen , dass CanEdit gleich false ist. Testen wir das, indem wir nach unten gehen, wir werden in ein Konsolenprotokoll den Wert von CanEdit platzieren. Wir werden sehen, ob sich das für jeden unserer Fälle ändert. Wie wir wissen, wird kein CanEdit gleich false sein, da wir derzeit die Benutzerrolle haben, um dem Benutzer gleich zu sein. Lassen Sie uns in die Entwicklertools in die Konsole springen. Es ist falsch wie erwartet. Lassen Sie uns unsere zweite Bedingung überprüfen, indem die Rolle auf den Abonnenten umstellen, Sie die Rolle auf den Abonnenten umstellen, aktualisieren und wie erwartet, ist dies falsch. Der dritte ist der Herausgeber, das sollte jetzt stimmen. Schließlich können wir den Admin testen. Das stimmt auch. die Standardbedingung unten zu ermitteln, sollten wir das Konsolenprotokoll sehen und sie können Edit gleich false sein wenn wir keine dieser vier Bedingungen erfüllen. Lassen Sie uns dies zu etwas völlig Zufälligem machen. Wir geben einfach eine beliebige zufällige Rolle in hier ein. Aktualisieren. Dies ist falsch und das Konsolenprotokoll wird jetzt wie erwartet ausgeführt. Nur eine Sache, auf die Sie achten sollten, wenn wir mehrere passende Fälle haben. Wenn ich zwei oder mehr Fälle habe, die beide übereinstimmen, wird der erste passende Fall verwendet. Auch als Abkürzung, wenn wir mehrere Fälle haben, genau wie wir es hier haben, die denselben Code darin ausführen. Der Benutzer wird festlegen, CanEdit ist gleich false und auch der Abonnent. Dies ist ein doppelter Abschnitt, der für die letzten beiden Fälle gleich ist. Beide setzen CanEdit so , dass er gleich true ist. Wir können diesen Code ein wenig verkürzen , um ihn ein bisschen einfacher zu machen. Für die ersten beiden, die genau gleich sind, können wir den Code aus dem ersten entfernen. Beide Fälle folgen sofort aufeinander. Dann wird dieser Code kurz danach für jeden dieser Fälle ausgeführt. Genau das Gleiche für diese beiden unten unten. Wir können den CanEdit und auch die Pause verschieben. Diese beiden sind jetzt im Wesentlichen zusammengefasst. Wir können das einfach testen und wenn wir aktualisieren, sehen wir immer noch, dass die Standardklausel unten ausgeführt wird. Versuchen wir es mit dem Redakteur. Es sollte wahr sein. Der Admin stimmt auch. Der Benutzer sollte falsch sein. Endlich der Abonnent. Dies ist es für die Switch-Anweisungen. Nur eine kurze Sache, bevor wir weitermachen. Wenn wir vergessen, in einem dieser Fälle ein break-Schlüsselwort zu setzen , würden auch alle folgenden Fälle laufen würden auch alle folgenden Fälle laufen, bis eine Pause endgültig gefunden wurde. Wenn wir beispielsweise eine Break-Klausel innerhalb dieses Abschnitts verpasst hätten eine Break-Klausel innerhalb , können wir diese entfernen. Wenn wir eine Übereinstimmung mit dem Benutzer oder dem Abonnenten haben , ist CanEdit immer noch gleich false, aber es würde dann den Code direkt darunter ausführen und dann den CanEdit überschreiben, um „true“ zu sein. Probieren wir das mal aus. Wir haben die Rolle, die dem Abonnenten entspricht. Aktualisieren. Jetzt ist der Abonnent CanEdit wirksam geworden, aber das Programm ist immer wieder zum Editor und auch zum Admin-Bereich gegangen Editor und auch zum Admin-Bereich und hat eine Überschreibung verursacht, so dass CanEdit jetzt gleich true ist. 10. Bedingter Operator (ternary): Als Alternative zu den if-else-Anweisungen, die wir uns angesehen haben, verfügt Javascript auch über einen bedingten Operator, der oft als ternärer Operator bezeichnet wird, da er aus drei Teilen besteht. Da es funktioniert, genau wie wenn sonst, besteht der Hauptgrund dafür darin, eine einfache, einzeilige Alternative anzubieten . dieses Benutzerobjekt ansehen, möchten wir möglicherweise das Alter des Benutzers überprüfen bevor wir ihn einlassen. Der bedingte Operator kann dabei helfen. Es ist wie eine Frage dargelegt. Hier fragen wir, ob das Alter des Benutzers unter Verwendung des Fragezeichens größer oder gleich 18 ist . Vorher habe ich gesagt, dass das Ternär aus drei Teilen besteht. Die Frage ist nur dieser erste Teil. Der zweite und dritte Teil sind das, was wir tun wollen, wenn die Frage wahr oder falsch ist. Wenn das stimmt, können wir alles andere tun dieses einfache Beispiel nur den Text von Enter enthält. Wenn es falsch ist, was für dieses Beispiel korrekt ist, wird stattdessen der Code nach dem Doppelpunkt ausgeführt. Gehen wir nun zu den Starterdateien und wir können uns das Beispiel dort ansehen. Hier finden Sie ein Beispiel wie wir eine if-Anweisung verwenden können, um zu überprüfen, ob ein Benutzer Administrator ist , der etwas auf unserer Website bearbeiten kann. Das Benutzerobjekt hat die Rolle des Admins, und derzeit legen wir die CanEdit-Funktionalität auf „false“ fest. Die if-Anweisung prüft, ob die Rolle des Benutzers, die gerade hier ist, der Admin entspricht. In unserem Fall können wir die Variable canEdit auf true setzen, sodass der Benutzer etwas wie einen Blogbeitrag veröffentlichen kann. Wenn nicht, ist CanEdit gleich false und entfernt alle Berechtigungen, die sie möglicherweise haben. Was wir tun werden, ist, dieses Beispiel zu konvertieren , um den ternären Operator zu verwenden , der dieses Beispiel in eine einzige Zeile vereinfachen wird . Genau wie wir es in diesen Folien gesehen haben, der erste Teil darin, die Frage tatsächlich zu stellen. Die Frage, die wir stellen möchten, ist, ob die user.role der Admin-Zeichenfolge entspricht . Verwenden Sie ein Fragezeichen, gefolgt von unseren wahren und falschen Ergebnissen. Wenn der Benutzer dem Administrator entspricht, möchten wir festlegen, dass dieser CanEdit genauso wie im Abschnitt true in der if-else-Anweisung entspricht genauso wie im Abschnitt true in der . Setzen Sie canEdit auf „true“, dann getrennt durch einen Doppelpunkt. Wir fügen die falsche Anweisung hinzu, bei der wir sagen, dass CanEdit gleich false ist. Abhängig von den Einstellungen oder Plugins Ihres Texteditors können Sie diese beiden Anweisungen möglicherweise auch in die Klammern eingeschlossen sehen . Das ist vollkommen in Ordnung. Was ich jetzt tun möchte, ist, die ursprünglichen If-else-Anweisungen zu kommentieren oder zu entfernen, und dann können wir diese speichern und zum Browser gehen, aktualisieren, und wir sehen, dass dieses Beispiel auf true gesetzt ist. Dies ist der Fall, weil die user.role gleich admin ist. Aber wenn wir dies ändern, um etwas anderes zu sein, versuchen wir es mit dem Abonnenten, Sie sollten dies aktualisieren, um den Wert von false zu haben. Wir können dieses Beispiel auch noch weiter verkürzen, indem das Ergebnis dieses ternären Operators dieser Variablen direkt zuweisen . Was wir damit meinen, ist, dass CanEdit nicht gleich wahr oder falsch Wenn wir den vollständigen bedingten Operator hier herausschneiden, können wir dann die erste Zuweisung von false entfernen und diese einfügen. Anstatt unsere Variable festzulegen, setzen wir einfach den wahren Wert auf true“ und den falschen Wert auf „false“. Jetzt wird das Ergebnis „true“ oder „False direkt unserer canEdit-Variablen zugewiesen. Testen wir das noch einmal. Derzeit haben wir diese Einstellung auf false gesetzt, aber wenn wir dies wieder als Admin ändern, ist dies jetzt gleich wahr. Sowohl der bedingte Operator die if-else-Version sind beide vollkommen gültig. Der bedingte Operator ist, wie wir gerade gesehen haben, normalerweise kürzer und in einer einzigen Zeile platziert. Einige argumentieren, dass eine if-else-Anweisung klarer und lesbarer ist, aber am Ende ist es Ihre Wahl, die Sie verwenden möchten und welche Sie bevorzugen. 11. Typ Coersion & Umrechnung: In den kommenden paar Videos werden wir einige Typen und auch einige wahre oder falsch verwandte Dinge behandeln , die Ihnen seltsame oder unerwartete Ergebnisse liefern können. sich dessen bewusst sind, können Sie Dinge wie warum und wenn die Anweisung nicht korrekt ausgeführt wird, verstehen Dinge wie warum und wenn Anweisung nicht korrekt ausgeführt wird, und Ihnen auch viel Zeit beim Debuggen sparen. Der erste ist der Typ Zwang. Wir wissen bereits über Typen wie Objekte, Strings und Booleans Bescheid. Typ Zwang bezieht sich darauf , wie die Werte von Datentypen in andere Datentypen konvertiert werden. Wenn Sie in den Unterrichtsordner schauen, der Typ Zwang und Vergleich lautet , springen Sie in die index.html, wo wir ein einfaches Beispiel haben. Wir haben oben zwei Variablen mit Zahlen, und dann werden wir beide zusammen hinzufügen und innerhalb der Gesamtsumme speichern . Eine Sache, die zwischen diesen beiden Zahlen zu beachten ist, ist, dass die erste in diese Zitate eingeschlossen in diese Zitate also ist dies technisch gesehen eine Zeichenfolge. Die zweite ist eine Zahl, wie Sie erwarten würden. Aber was denkst du passiert, wenn wir beides zusammenfügen? Wenn wir Strings hinzufügen , wissen wir vielleicht, was zu erwarten ist, da dies zu einem Satz oder einem Wort kombiniert werden kann . Wenn wir auch zwei Zahlen addieren, würden diese beiden Zahlen addiert , um eine neue Summe zu erzielen. Aber da wir eine Zeichenfolge und eine Zahl hinzufügen, was glauben Sie, wird passieren? Nun, anstatt einen Fehler zu verursachen, soll JavaScript einen Datentyp auswählen , in den er automatisch konvertiert werden soll. Das nennt man Zwang. Aber in diesem Beispiel kann es konvertiert werden, damit es sich um beide Strings handelt oder beide Zahlen sind. Nun, raten wir nicht. Lasst uns das speichern und in die Konsole gehen und genau sehen, was passieren wird. Springen Sie in die Konsolenregisterkarte und aktualisieren Sie es und wir sehen den Wert von 72. Der Wert von 72 bedeutet, dass dies in eine Zeichenfolge konvertiert wird da wir den Wert sieben gefolgt vom Wert von zwei und nicht den Wert von neun haben sieben gefolgt vom Wert von zwei , was passieren würde, wenn dies wäre konvertiert für beide Zahlen. Diese Umwandlung hat für uns automatisch stattgefunden und dies kann als implizit bezeichnet werden , und diese implizite Umwandlung ist der Zwang. Nicht zu verwirren, aber etwas Ähnliches ist die Typkonvertierung. Dies funktioniert ähnlich wie Zwang, indem ein Wert von einem Datentyp in einen anderen konvertiert wird. können wir aber auch selbst manuell machen. Wenn wir möchten, dass dies manuell in eine Zahl konvertiert wird, uns eine Zahlenfunktion zur Verfügung. Wir können dies verwenden, besteht darin, unsere Nummer eins zu schneiden, nämlich eine Zeichenfolge. Wir können auf eine Zahlenfunktion zugreifen und dann in das platzieren , was wir in eine Zahl konvertieren möchten. Hier wandeln wir eine Zeichenfolge in eine Zahl um. Wenn wir das jetzt sparen, sollten wir den Wert von neun in der Konsole sehen , was bedeutet, dass beide sich als Zahlen anziehen. Um sich zusammenzufassen, geschieht der Zwang implizit oder automatisch. Typkonvertierung kann auch manuell erfolgen, genau wie wir es bei dieser Zahlenfunktion sehen. Manchmal werden diese Wörter synonym verwendet, aber dies ist die offizielle Zeile in beiden. Wenn du wolltest, könnten wir auch das Gegenteil tun. Anstatt diese in eine Zahl umzuwandeln, könnten wir die zweite in eine Zeichenfolge umwandeln. Wir machen das mit der String-Funktion. Geben Sie die Zahl ein, die Sie in eine Zeichenfolge konvertieren möchten , und diese würde dann wieder zum Zeichenfolgenwert von 72 zurückkehren . Aus diesem Grund kann es gut sein, eingehende Daten immer so zu konvertieren eingehende Daten immer so zu wie genau der Datentyp wir haben möchten. Wenn wir beispielsweise Daten von einem Dritten wie einem Server oder einer API erhalten, können wir Fehler und Fehler beseitigen, können wir Fehler und Fehler beseitigen indem wir sicherstellen, dass unser Datentyp korrekt ist. Aus diesem Grund haben Sie möglicherweise von Tools wie TypeScript gehört , die uns dazu zwingen, die Art der Daten zu deklarieren, die Sie im Voraus verwenden möchten , wodurch Fehler in unserem Code beseitigt werden Daten zu deklarieren, die Sie im Voraus verwenden möchten , können. So funktionieren die Dinge mit dem Plus-Operator, aber die anderen Betreiber können uns auch erwartete Ergebnisse liefern , nachdem der Zwang angewendet wurde. Wir können diesen Zwang auch mit dem größeren oder kleineren Betreiber in Aktion sehen . Sehen Sie, dass dies die Konsolenanmeldung mit dem Wert ändert oder die Ergebnisse von Nummer eins größer als Nummer zwei sind. Mal sehen, was passiert. Wir bekommen den Wert von true. Dies mag etwas seltsam erscheinen, da wir hier im Konsolenprotokoll immer noch eine Zeichenfolge mit einer Zahl vergleichen. In diesem Fall vergleicht JavaScript sie jedoch so, als wären sie beide Zahlen. Dies ist ein verrücktes Verhalten für Leute, die an andere Programmiersprachen gewöhnt sind , das stark typisiert ist. Das heißt, die Daten sind auf einen bestimmten Typ beschränkt und nicht konvertiert. Obwohl dieser Zwang hinter den Kulissen stattfindet, haben die Beispiele, die wir sehen werden, manchmal ein ziemlich vernünftiges oder vorhersehbares Verhalten. Aber oft sehen wir einige seltsame Ergebnisse wie diese. Wir können auch einige seltsame Ergebnisse sehen , wenn es um das Inkrementieren geht. Sehen Sie dies, anstatt eine Konstante für unsere Zeichenfolge zu haben, werden wir dies tun , um es zu lassen. Daher können wir diesen Wert von Nummer eins aktualisieren. Lass uns das gleich unten machen. Wir greifen auf unsere Variable Nummer eins zu und verwenden dann plus plus, um dies um den Wert eins zu erhöhen. Die Konsole protokolliert den Wert unserer Variablen und sehen wir uns an, was in der Konsole passiert. Aktualisieren Sie und wir sehen den Wert von acht. Dies mag seltsam erscheinen, weil wir wissen, dass Nummer eins anfänglich eine Zeichenfolge ist. Technisch gesehen sollten wir dies nicht um den Wert eines erhöhen können , wie wir es bei einer Zahl tun würden. Was hinter den Kulissen mit Zwang passiert ist, dass die Nummer eins in eine Zahl umgewandelt wird, daher können wir den Inkrementor verwenden. Ich glaube, du würdest den Wert von acht in der Konsole sehen. Stellen Sie sich als ein anderes Beispiel vor, dies sei auch ein Array. Wenn wir dies in den eckigen Klammern umgeben würden, die unsere Zeichenfolge enthalten, was würde Ihrer Meinung nach jetzt in der Konsole passieren? Wir erhöhen diesen Wert immer noch. Sagen wir das und sehen, was hier drin passiert. Aktualisieren. Auch dies ergibt keinen Sinn. Wir erhalten immer noch den Wert von acht, aber das ist die Welt von JavaScript. Was ist, wenn wir dieses Plus kommentieren und diesem Array direkt einen Wert hinzufügen würden. Sagen wir plus 2, speichern, aktualisieren und wir sehen den Wert von 72. Auch dies mag wie verrücktes Verhalten erscheinen, aber was hinter den Kulissen passiert ist, wie Sie vielleicht vermutet haben, ist, dass dies eine Zeichenfolge konvertiert wurde. Wenn Sie beweisen wollten, dass dies eine Zeichenfolge ist, oder wenn wir es noch einmal überprüfen wollten, könnten wir auch typeof innerhalb des Konsolenprotokolls verwenden. Ich gebe Saft vor unserer Nummer eins ein, speichere dies und dies wird dann den Datentyp ausgeben , der eine Zeichenfolge ist. Auch hier ist auch etwas ganz Seltsames. Dies ist eine Zeichenfolge, wie wir gerade gesehen haben, aber was glauben Sie , würde passieren, wenn wir die Inkremente erneut einführen? Nun, lasst uns das auskommentieren, speichern und aktualisieren, und wir sind jetzt wieder bei einer Nummer. Was ist, wenn wir auch den Typ entfernen und sehen können, was passiert, wenn wir die Sieben und die beiden zusammenfügen und dann auch das Inkrement verwenden. Lasst uns das aufheben. Dies gibt uns nun das Ergebnis des Zahlenwerts von 73. Das bedeutet, dass das, was ursprünglich für Nummer eins passiert , ist, dass wir 7 und 2 zusammengefügt werden, um eine Zeichenfolge von 72 zu erstellen, genau wie wir es zuvor gesehen haben. Dies ist immer noch eine Zeichenfolge, aber wenn es zur nächsten Zeile kommt, wie wir auch zuvor gesehen haben, wenn wir das Plus Plus verwenden, addiert es den Wert von 1 und gibt uns den Wert von 73 in der Konsole. Neben all dieser Verrücktheit führt der Gleichstellungsbetreiber auch eine ganz neue Welt von Dingen ein, auf die man achten muss. In unserem Konsolenprotokoll können wir beispielsweise prüfen, ob 1 gleich true ist. Das stimmt. Aber was ist, wenn wir dies in eine andere Zahl wie 11 umwandeln ? Dies gibt uns jetzt den Wert von false. Um es zusammenzufassen, war der Wert von eins gleich wahr, aber der Wert von 11 war gleich falsch. Versuchen wir eine weitere Zahl wie zwei, aktualisieren und dies ist auch der Wert von false. Aber das ist eine weitere Eigenart von JavaScript, aber kurz bevor wir es erklären, möchte ich unten nur ein paar Kommentare hinzufügen. Wahr ist also, dass Nummer 1 und 0 gleich falsch ist. Um dies besser zu verstehen, müssen wir verstehen, dass bei der Verwendung des Double Equals genau so die lockere Gleichheit ist, was bedeutet, dass wir nicht nach Datentypen suchen, die unwahrscheinlich sind dreifach gleich. was wir schon mal gesehen haben. Alles, was wir tun, ist zu prüfen, ob zwei Werte unabhängig vom Datentyp gleich sind . Da wir hier eine Zahl mit einem booleschen Wert auf der rechten Seite vergleichen , überprüfen wir sie nicht durch gleiche Typen. JavaScript wird mit Zwang konvertiert und in diesem Fall konvertiert es den booleschen Wert in eine Zahl. Genau wie wir zuvor geschrieben haben, ist die Nummer eins gleich wahr und JavaScript verwendet die Zahl Null, um falsch zu sein. Wir können dies im Konsolenprotokoll testen. Wir können prüfen, ob der Wert von eins gleich falsch ist, was nicht stimmt. Es sollte uns den Wert falsch in der Konsole geben. Wenn wir es jedoch in den Wert Null ändern, ist Null gleich falsch, genau wie wir es unten gesehen haben, und es sollte dann zu genau wie wir es unten gesehen haben, und es true führen. Das ist eine Menge Eigenartigkeit und es endet auch dort nicht. JavaScript hat so viele dieser Dinge, auf die Sie achten müssen. Ich erwarte nicht, dass du dich zu diesem Zeitpunkt an alle erinnerst. Aber wenn Sie wissen, dass dieses Verhalten existiert, und geben Sie einen guten Vorsprung zu wissen, wo Sie suchen müssen, wenn Sie Fehler in Ihrem Code stoßen. 12. Truthy & Falsey: In vielen dieser Beispiele in diesem Abschnitt und der JavaScript-Codierung im Allgemeinen prüfen wir, ob ein Wert wahr oder falsch ist. Wenn es stimmt, führen wir etwas Code aus, und wenn es falsch ist, machen wir etwas anderes. Aber es ist nicht nur ein boolescher Wert von true und false , den wir verwenden können, wie wir im letzten Video gesehen haben, dass andere Werte auch als wahr und falsch bewertet werden können. Wie Null wird in falsch ausgewertet, und die Zahl möchte gleich wahr sein. Es gibt auch viele weitere Beispiele, z. B. eine Textzeichenfolge ist wahr und eine leere Zeichenfolge ist das Gegenteil von false. Dies wird als wahrheitsgetreu oder falsey bezeichnet. Wahrhaftig ist, wenn ein Wert als wahr ausgewertet wird, z. B. dass unsere Textzeichenfolge vorhanden ist, und falsey ist, wenn ein Wert als falsch ausgewertet wird, z. B. unsere leere Zeichenfolge oder unsere Zahl Null. Springen Sie in unseren Editor, und wir können uns einige Beispiele in unserem leeren Skript ansehen. If-Anweisungen werden nicht nur für einen booleschen Wert von true ausgeführt , sondern auch für jeden anderen wahrheitsgemäßen Wert. Sagen wir dies, indem wir zuerst eine leere Wenn-else-Anweisung einrichten , dann drinnen von hier, werden wir einfach zu einfache Konsolenprotokolle einfügen. Für den ersten Abschnitt wir etwas als wahr bewerten, wir werden den Text von true V weitergeben . Im L-Abschnitt wird das Gegenteil tun. Fügen Sie den Text von falsey hinzu. Natürlich wird dies im Moment nicht laufen, da wir keine Bedingung innerhalb der if-Anweisung haben. Aber wir fangen mit dem an , was wir bereits wissen. Zuvor haben wir uns die Werte Null und eins angeschaut, wobei der Wert von Null gleich falsch ist. Dies würde zu Falsey ausgewertet werden, aber das Gegenteil gilt für den Wert von eins. Außerdem können wir die Zeichenfolge testen , die Sie kurz zuvor erwähnt haben. Wir haben eine Zeichenfolge mit etwas Inhalt darin, wie zum Beispiel den Text von hey. Dies wird auch als wahrheitsgemäß ausgewertet da wir einen Wert innerhalb der Zeichenfolge haben. Wenn wir dies jedoch entfernen und eine leere Zeichenfolge haben würden, würde dies in JavaScript auf den Wert von falsey ausgewertet. Der Zwang, über den wir gesprochen haben, geschieht hinter den Kulissen, und Werte wie unsere Zahlen Null und eins und auch dieser String-Wert werden hier in ein boolesches Äquivalent konvertiert. Wir können feststellen, ob solche Dinge nicht ausgeführt werden sollen. Falschlicherweise sind Werte, wie Sie erwarten würden, im Allgemeinen leere Werte wie Null, die wir uns gerade angesehen haben, und auch diese leeren Strings. Werfen wir einen Blick auf einige weitere Beispiele wie nein. Das ist auch Falsey. Undefiniert sollte dies auch falsch sein. Im Allgemeinen alles, was keinen Barwert hat, also das Wort falsch. Wie zu erwarten, würde dies auch auf Falsey ausgewertet werden. Notieren Sie sich abschließend die Zahl, die NaN ist. Das ist auch Falsey. Wir können so ziemlich alles andere als wahrheitsgemäß betrachten, wie z. B. die Strings, die wir uns gerade angesehen haben, Arrays, andere Zahlen als Null und tatsächlich jeden Objekttyp wie eine Funktion, Array oder ein Das tatsächliche Objekt wird dazu führen, dass es wahrheitsgemäß ist. Dies gilt auch unabhängig davon, ob wir den Konstruktor oder einen Literaltyp verwenden , genau so. Wir könnten den Konstruktor gebrauchen. Wir haben uns in der Vergangenheit Dinge wie neues Array und neues Objekt angeschaut . Das wird wahrheitsgemäß sein. Versuchen wir einen Funktionskonstruktor, der auch wahrheitsgemäß sein wird, und schließlich das Objekt. Genauso, wenn wir einen Konstruktor wie diesen verwenden wollen und dies buchstäblich so verwenden , wie wir es in diesen Videos häufiger getan haben , z. B. das Erstellen eines Arrays mit unterschiedlichen Werten im Inneren. Dies wäre wahrheitsgemäß wie der Konstruktor, zusammen mit dem Platzieren eines Objekts in einer wörtlichen Schriftart. Dieser Zwang, kombiniert mit dem Verständnis, wie Werte wahrheitsgetreu oder falsch umgewandelt werden, ist eine gute Sache, innerhalb von JavaScript zu verstehen , da er Ihnen wirklich helfen kann , Probleme zu vermeiden Zukunft und helfen auch bei Debugging-Problemen. 13. Optionale Verkettung: Dieses Video konzentriert sich auf etwas, das als optionale Verkettung bezeichnet wird, das in ES2020 in JavaScript eingeführt wurde. Wie wir bereits wissen, müssen wir Zugriff auf bestimmte Elemente eines Objekts haben , wie zum Beispiel unseren Namen und auch auf unsere Rolle als Administrator. Wie wir wissen, können wir auch noch tiefer gehen, indem wir auch auf Objekte zugreifen , die innerhalb eines Objekts verschachtelt sind. Was passiert, wenn Eigenschaften innerhalb dieser Kette nicht vorhanden sind? Sehen Sie sich einige Beispiele für Verkettung im Ereignisbereich an, dem wir auf das Ereignisobjekt zugreifen. Wir gingen dann tiefer in Eigenschaften wie das Ziel, den übergeordneten Knoten, die Kinder und dann in den inneren Textwert ein. Wenn zu irgendeinem Zeitpunkt in dieser Kette keine Eigenschaft existiert, würden wir einen Fehler erhalten. Das ist jedoch keine schlechte Sache, da wir Fehler bekommen sollten, wenn wir etwas falsch machen. Aber was ist, wenn die Immobilie nur manchmal da ist und manchmal nicht? Ein Beispiel dafür ist das, was wir bereits innerhalb des Skripts verwendet haben. Es wird den aktuellen Benutzer haben , der auf ein angemeldetes Benutzerobjekt eingestellt ist , und wir haben alle Informationen, die wir benötigen, wie den Namen und die Rolle. Wenn wir also zu den if-Anweisungen gehen und prüfen, ob die Rolle des Benutzers dem Administrator entspricht. Wir wissen, dass dies fehlerfrei funktionieren sollte, aber mit Benutzern, obwohl wir sie nicht immer eingeloggt sind. Der aktuelle Benutzer ist nicht immer so eingestellt, dass er ein Objekt wie dieses ist. Wenn der Benutzer beispielsweise nicht angemeldet ist, anstelle dieses Benutzerobjekts sehen wir anstelle dieses Benutzerobjekts möglicherweise den Wert null. Wenn wir nun versuchen, die if-Anweisung auszuführen, haben wir keinen Zugriff auf die Eigenschaft is.role. Gehen wir deshalb in die Konsole und sehen, was passiert. In der Konsole sehen wir diese rote Fehlermeldung, die uns sagt, dass es ein Problem beim Lesen unserer Rolle gibt. Dies geschieht, weil der aktuelle Benutzer kein Objekt mehr ist , das die rolleneigenschaft enthält und daher einen Fehler verursacht. Aber wir brauchen immer noch eine Möglichkeit, diese Rolle innerhalb der if-Aussage aktiv zu halten . Aber nachdem sich der Benutzer angemeldet hat. Hier kommt die optionale Verkettung ins Spiel. Was wir tun können, ist, dass wir ein Fragezeichen einfügen können, um zu erklären, dass die Eigenschaft möglicherweise nicht immer da ist. Wir fügen dies nur vor.role hinzu. Wenn wir dies jetzt speichern und anstelle des Fehlers in der Konsole aktualisieren, da er jetzt als false ausgewertet wird, wird der else Abschnitt jetzt in der Konsole ausgeführt. Was in hier passiert ist, dass wir zu den if-Aussagen kommen. JavaScript liest dann den aktuellen Benutzer, der der Wert von null ist. Deshalb weiß es, mit dem Rest unserer Kette nicht weiter zu gehen . Es überspringt jetzt den Fehler und gibt stattdessen Wert undefined zurück , den wir im Konsolenprotokoll überprüfen können. Derzeit wissen wir, dass der Abschnitt else läuft , weil wir den Wert von false gesehen haben. Stattdessen können wir auf den aktuellen Benutzer zugreifen, ein Fragezeichen, da dies nicht immer bei der optionalen Verkettung vorhanden sein wird . Dann können wir den Wert der Rolle erhöhen. Wenn wir dies speichern und aktualisieren, können wir nun bestätigen, dass wir den Wert von undefined zurückerhalten. Dies ist sehr nützlich, wenn wir wissen, dass eine bestimmte Objekteigenschaft im Voraus immer vorhanden sein kann oder auch nicht. Es ist üblich, dass solche Objekte im Laufe der Zeit wachsen und wir wissen nicht immer, wie sich unsere App in Zukunft entwickeln könnte. Möglicherweise müssen wir zusätzliche Funktionen hinzufügen oder weitere Informationen sammeln. Diese optionale Verkettung kann eventuelle Fehler vermeiden. Beispielsweise müssen wir in Zukunft möglicherweise weitere Informationen über die Anmeldequelle des Benutzers hinzufügen . Wir könnten ein verschachteltes Objekt hinzufügen, genau so kehren wir zum Benutzerobjekt zurück. Lassen Sie uns den Namen und die Rolle wieder einsetzen. Dann ein zweites verschachteltes Objekt , in dem ich die Anmeldedaten aufrufe, das wird ein verschachteltes Objekt darin sein . Wir werden das Datum eintragen. Aber jetzt ist eine leere Zeichenfolge in Ordnung. Es spielt keine Rolle und bestätigt, dass es gleich wahr ist. Dann, noch weiter unten, als sich unsere App noch weiter entwickelt hat, müssen wir möglicherweise noch tiefer auf dieses Objekt eingehen. Beispielsweise möchten wir möglicherweise weitere Details über die Anmeldequelle des Benutzers innerhalb dieses Objekts sammeln . Wir können auch die Quelle hinzufügen, bei der es sich auch um ein Objekt handelt, bei dem wir die URL der Anmeldequelle gesehen haben. Auch hier ist dies nur ein Beispiel, damit wir alles innerhalb der Zeichenfolge im Browser hinzufügen können , aus dem der Benutzer stammt. Jetzt müssen wir längere Ketten benötigen, um auf diese verschachtelten Informationen zugreifen zu können. Wenn wir diese if-else Anweisungen einfach entfernen, vereinfachen wir dies mit einem Konsolenprotokoll. Wir müssen zuerst auf die Benutzerobjekte zugreifen, bei denen es sich um den aktuellen Benutzer handelte. Das Objekt, in dem sich Anmeldedaten befanden, so.signupdata, Wenn wir beispielsweise auf den Browser zugreifen wollten, müssten wir auch kurz davor in die Quelle springen. Das Quellobjekt und dann der Browser aktualisieren und dies sollte jetzt der Wert von Chrome sein. Aber denken Sie daran, all dies zu einem späteren Zeitpunkt dem Objekt hinzugefügt wurde. Einige der früheren Anmeldebenutzer haben die Anmeldedaten nicht mit ihren Objekten verknüpft. Was wir tun können, können wir dies simulieren , indem wir diesen Abschnitt auskommentieren , der dann einen Fehler verursacht, genau wie wir es zuvor gesehen haben. Auch hier kann eine optionale Verkettung uns dabei helfen indem unser Code stillschweigend fehlschlägt, anstatt einen Fehler in der Konsole anzuzeigen. Innerhalb der Anmeldedaten hätten keinen Zugriff mehr auf die Quelle oder den Browser. Wir können die optionale Verkettung hier hinzufügen, aktualisieren und jetzt sehen wir die Ergebnisse von undefined. Allgemeine Fehler sind gut, um uns mitzuteilen , wann wir etwas falsch gemacht haben. Aber in Fällen wie diesem wissen wir, dass wir eine Immobilie haben die möglicherweise vorhanden ist oder auch nicht. Die optionale Verkettung kann uns wirklich helfen, indem wir still scheitern und uns daher erlauben , mit dem Irrtümer selbst. 14. Erstellen und Ändern neuer Objekte: So ziemlich alles, was wir uns vorstellen können, hat bestimmte Eigenschaften, kann ein guter Anwendungsfall für ein Objekt in JavaScript sein. Zum Beispiel kann eine Person ein Objekt sein, und die Eigenschaften könnten der Name, das Alter, die Größe und jede andere Information sein Alter, die Größe und jede andere Information , die wir einer Person geben möchten. Ein Computer könnte auch ein Objekt mit Eigenschaften wie der Marke, dem Modell, der CPU, dem Herstellungsjahr und auch dem Speicher sein. Wenn wir an solche Objekte denken, werden die Anwendungsfälle riesig. Wie bei Arrays gibt es verschiedene Möglichkeiten, ein Objekt zu konstruieren, und der Stil, den wir bisher betrachtet haben , wird Objektliteral genannt. Dies wird verwendet, um ein neues Objekt mit den geschweiften Klammern zu erstellen und zu definieren , das einige Eigenschaften enthält, genau wie wir es hier haben. Rüber zu den Startdateien. Springen Sie in die Datei dieser Lektion, die der Objektkonstruktor ist, und öffnen Sie diese im Browser. Wie bereits bei den Folien erwähnt, haben wir zwei verschiedene Möglichkeiten , ein Objekt zu erstellen. Wir haben den wörtlichen Ansatz, genau wie wir es zuvor verwendet haben, und wir haben auch einen Ansatz, der als Konstruktor bezeichnet wird. Der Konstruktor ist nichts Neues. Wir haben uns das vorher mit Arrays angeschaut. In der Regel haben wir Arrays mit einem wörtlichen Ansatz erstellt , z. B. ein Pizza-Array, und unsere Eigenschaften innerhalb dieser eckigen Klammern eingerichtet . Neben diesem wörtlichen Ansatz können wir auch ein Array mit dem Konstruktor erstellen. Wenn wir beispielsweise eine Reihe von Inhaltsstoffen wollten, können wir dies mit dem neuen Schlüsselwort gefolgt von einem Array einrichten . Dies ist ein wörtlicher Ansatz und so können wir mit dem Konstruktor ein leeres Array erstellen . Wir können dann auf unser leeres Array zugreifen und neue Werte mit Methoden wie Push hinzufügen , um diesem Array einen neuen Wert hinzuzufügen. Genau wie unsere Arrays hier können wir das Gleiche auch für andere Objekte tun. Was ich tun werde, ist, diesen wörtlichen Ansatz zu kommentieren und diesen mit dem Objektkonstruktor neu zu erstellen. Zunächst erstellen wir eine neue Variable namens user, um die obigen Objekte nachzuahmen und diese auf ein neues Objekt zu setzen. Dieses neue Objekt wird ein Objekt-Wrapper sein , der leer ist, und dann können wir neue Eigenschaften auf dieses Objekt übertragen . Wir tun dies, indem wir auf unsere Variable zugreifen. Dann können wir den Namen der Eigenschaft direkt auf unser Objekt setzen . Erstens wird es der Schlüssel sein, genau wie wir es hier haben. Dann weisen wir dies einem bestimmten Wert zu. Dies ist gleich einer Reihe von Chris. Dann ist der zweite für den Nachnamen, auch eine Zeichenfolge. Die dritte war die Besatzung. Als Nächstes haben wir den angemeldeten Boolean von true für user.logged.in. Dies ist ein boolescher Wert, daher brauchen wir die Zitate nicht. Schließlich können wir auch allen Food-Eigenschaften ein Array zuweisen . Ich kopiere dieses Array einfach von oben. Wir können testen, dass dies jetzt funktioniert, indem ein Konsolenprotokoll für den Wert des Benutzers erstellen und dann in die Entwicklertools in die Konsole springen. Es gibt unser Objekt, in dem alle unsere Eigenschaften darin verschachtelt sind. Wir können auch über eine Punktnotation auf einzelne Eigenschaften zugreifen . Das funktioniert genau wie bei der wörtlichen Herangehensweise. Wir können user.first verwenden. Dies druckt unseren Vornamen in der Konsole aus. Neben dieser Punktnotation können wir, wie wir es zuvor verwendet haben, wie wir es zuvor verwendet haben, auch mit der Bracket-Notation auf unsere Eigenschaften zugreifen . Was wir tun müssen, ist, unseren Eigenschaftsnamen in diesen eckigen Klammern zu umgeben und den Punkt zu entfernen. Dies muss auch eine Zeichenfolge sein. Beide ergeben genau das gleiche Ergebnis. Wenn wir wollten, könnten wir auch eine unserer Immobilien direkt aktualisieren , also user.first. Wir können dies dann neu zuweisen oder dies als neuer Wert aktualisieren. Dann können wir das auf der Konsole ausdrucken. Dies gibt uns unseren aktualisierten Wert. Als Randnotiz, wenn wir versehentlich mehr als eine Eigenschaft haben , die ein Duplikat ist, genau wie hier, wo wir den Vornamen zweimal in unserem Code haben , seit ES 2015, der letzte Das Auftreten wird verwendet, anstatt einen Fehler auszulößen. Darüber hinaus können wir eine dieser Eigenschaften auch mit dem JavaScript-Löschoperator löschen. Was wir tun müssen, ist delete hinzuzufügen, das auf unseren Vornamen verweist, diesen speichern und aktualisieren, und wir drucken einfach das vollständige Benutzerobjekt aus. Öffnen Sie dies, und dies wird nun den Vornamen aus unserem Use-Objekt entfernen . Dies sind zwei verschiedene Möglichkeiten, ein Objekt in JavaScript zu erstellen . Persönlich bevorzuge ich den wörtlichen Ansatz , den wir ganz oben hatten , da es mir sauberer und einfacher zu bedienen erscheint. Aber das liegt ganz an Ihrer persönlichen Präferenz. In kommenden Videos erläutern wir , wie Sie eine vorlagenähnliche Funktion zum Erstellen mehrerer Objekte einrichten . 15. Objektkonstruktorfunktion: Großartig. Wir kennen jetzt zwei verschiedene Möglichkeiten, Objekte innerhalb von JavaScript zu erstellen. Wenn Sie in die Datei dieser Lektion springen, bei der es sich um Objektkonstruktorfunktionen handelt, sehen wir, dass wir hier nur ein leeres Skript haben. Die zwei verschiedenen Möglichkeiten , wie wir Objekte erstellt haben besteht darin, eine neue Variable wie diese zu erstellen, und dann können wir unsere Eigenschaften direkt innerhalb der geschweiften Klammern hinzufügen . Alternativ können wir auch ein neues Objekt verwenden, das der Konstruktoransatz ist, und dies gibt uns auch ein leeres Objekt in unseren Eigenschaften. Beide Ansätze funktionieren einwandfrei, beschränken sich aber auch darauf nur ein einzelnes Objekt zu erstellen. Es wäre hilfreicher, wenn wir eine Objektvorlage haben könnten , damit wir mehrere darauf basierende Objekte erstellen können , die jeweils dieselben Eigenschaften und Methoden aufweisen. Wir können dies auch mit der Konstruktorfunktion machen. Was wir tun werden, ist, dass wir dies entfernen und eine neue Konstruktorfunktion erstellen. Es empfiehlt sich auch, diese Konstruktorfunktionen mit einem Großbuchstaben zu benennen . Wir verwenden in unserem Benutzerbeispiel, dass es sich um ein Großbuchstaben-U handelt, und erstellen dann den Rest unserer Funktion. Der Zweck dieser Konstruktorfunktion für unseren Benutzer besteht darin, mehrere Benutzer basierend auf dieser Vorlage zu erstellen . Innerhalb unserer Funktion werden wir auch einige Werte weitergeben , die wir hier brauchen werden. Die erste, wir werden das ziemlich einfach halten, wir sagen nur Vorname, Nachname und Beruf. Wir kommen in nur einem Moment wieder auf diese Funktion zurück. Aber bevor wir genau so ein neues Objekt erstellt haben, haben wir das neue Schlüsselwort und dann die Objektfunktion verwendet . Anstatt jedoch ein neues leeres Objekt zu erstellen, möchten wir jetzt eine neue Instanz unseres Benutzers erstellen. Anstelle eines neuen Objekts sagen wir neues User Capital U, wo wir die tatsächlichen Werte übergeben , die Sie für unsere Funktion verwenden möchten. Wir müssen den Vornamen, den letzten und den Beruf übergeben, und dies werden die tatsächlichen drei Werte sein , die wir für unseren Benutzer benötigen. Wir sagen Chris, den Nachnamen und schließlich die Besatzung. Wir können dies auch so oft ich möchte duplizieren, denn wie bereits erwähnt, Zweck der Erstellung dieser Konstruktorfunktion darin, als Vorlage zu fungieren, um so viele Objekte zu erstellen , wie wir möchten. Wir kreieren unseren zweiten, haben einen anderen Namen und auch acht verschiedene Beschäftigung. Bei diesen beiden neuen Benutzern können wir dies auch innerhalb von Konstanten oder Variablen speichern , damit wir später darauf zugreifen können. Sagen Sie also const Chris gleich unserem, und dann ist der zweite gleich Homer. Großartig. Was wir jetzt tun werden, ist, den Wert eines dieser neuen Benutzer zu protokollieren. Platzieren Sie ein Konsolenprotokoll, den Wert von Homer, und springen Sie dann in die Konsole. Wie Sie sehen können, haben wir ein Benutzerobjekt. Aber wenn wir das öffnen, haben wir keine Immobilien hier drin. Alles was wir haben ist ein leeres Benutzerobjekt. Dies ist zu erwarten, da unsere Konstruktorfunktion, die wir zuvor erstellt haben , leer ist. Wir haben keinen Code innerhalb der geschweiften Klammern. Wir erhalten in den Werten innerhalb der Funktion aber wir machen damit noch nichts. Um dies zu tun, müssen wir etwas festlegen, das diesen drei Werten entspricht. Wir müssen etwas so einstellen, dass es unserem ersten entspricht, einige Dinge, die unserem letzten entsprechen, und etwas, das unserem Beruf entspricht. Aber was machen wir, um diese in unsere Objekteigenschaften umzuwandeln ? Nun, um eine Eigenschaft festzulegen, müssen wir das Schlüsselwort dieses verwenden . Um das Schlüsselwort ein bisschen besser zu verstehen, möchte ich Sie schnell zu einer früheren Datei in diesem Projektordner zurückführen . Wenn wir zurück in Nummer drei springen, also Funktionen, und dann Nummer fünf, was eine Funktion oder eine Methode ist, springen Sie hier auf diese Indexseite. Darin erinnern Sie sich vielleicht daran, dass wir ein Objekt namens Check Recipes erstellt haben . Check Rezepte hatten einige Eigenschaften wie die aktuelle Anzahl von Rezepten, die maximalen Rezepte und auch eine Methode namens Rezepte übrig, die die aktuelle Anzahl von Rezepten abzog das Maximum. Denken Sie daran, dass eine Methode nur eine Funktion ist, die sich auf diesem Objekt befindet. Innerhalb dieser Methode haben wir das Schlüsselwort, dieses Schlüsselwort verwendet, um auf andere Eigenschaften dieses Objekts zuzugreifen. Wir greifen auf die maximalen Rezepte zu, die sich auf diesem Objekt befinden, und auch auf die aktuellen Rezepte. Das Schlüsselwort dieses kann in JavaScript eine komplexe Sache sein, die man verstehen kann, aber unter diesen Umständen wird es einfach auf das Objekt verweisen, das hier gehört. heißt, wir können auf jede der anderen Eigenschaften in diesem Objekt zugreifen . In diesem Sinne können wir zurück zu unserer aktuellen Datei alle Eigenschaften auf die gleiche Weise hinzufügen, indem wir das Schlüsselwort, gefolgt vom Eigenschaftsnamen, verwenden. Zum ersten wird dies.FirstName und auch das Gleiche für die anderen sagen , this.lastName, und schließlich this.occupation. Dies wird nun unsere beiden Benutzerobjekte mit den Eigenschaften konstruieren , die wir hineinführen. Speichern Sie dies und aktualisieren Sie mit unserem Konsolenprotokoll noch vorhanden. Unser Homer-Benutzer ist jetzt korrekt konstruiert und wir können dies auch für unseren ersten Benutzer duplizieren. Dies gibt uns jetzt zwei einzigartige Objekte, die beide auf derselben Vorlage basieren . Wenn wir zusätzliche Eigenschaften und Methoden hinzufügen müssen, haben wir auch einige Optionen. Wir können sie direkt zu einem unserer Objekte wie diesem hinzufügen. Genau wie wir es im vorherigen Video angesehen haben, können wir auf unsere Variable wie Homer zugreifen. Wir können Leben sagen und dies auf unseren Wert setzen. Wir können unseren Objekten auch Methoden hinzufügen. Wir können auf unser Objekt zugreifen, das Homer ist, und dann können wir diesem einen Eigenschaftsnamen geben , der den vollständigen Namen haben wird , und dies auf eine Funktion setzen wird. Die Verantwortung dieser Funktion besteht darin, eine neue Zeichenfolge zurückzugeben, die der Vorname ist, der dem zweiten Namen hinzugefügt also unsere Zeichenfolge zurück, die Homer.FirstName ist, fügen Sie einen hinzu Leerzeichen dazwischen und fügen Sie dann zum Ende homer.lastName hinzu. Probieren wir es mal aus. Zuallererst probieren wir das Liveseigentum aus. Fügen Sie dies der Konsole hinzu, aktualisieren Sie es und wir erhalten den Wert von Springfield. Dann können wir als nächstes unsere Methode ausprobieren, die der vollständige Name war. Aktualisieren Sie den Browser. Whoops, wir haben einen Wert von undefined, also schauen wir uns das an. Wir haben Homer.FirstName, das ist in Ordnung. Nur ein Rechtschreibfehler ganz oben in der Luft, also ändern wir das. Jetzt sehen wir, dass dies Homer Simpson ist, also funktioniert das völlig gut. Diese werden jedoch nur zu unseren einzelnen Objekten hinzugefügt. Diese werden nur große Homer-Variable hinzugefügt. Wenn wir versucht haben, auf unsere Chris Variable zuzugreifen und dies in der Konsole auszuprobieren, sehen wir hier einen Fehler. Dieser Ansatz ist nur nützlich, wenn Sie ein bestimmtes Objekt ändern möchten. Wenn wir diese auf alle erstellten Objekte anwenden möchten , müssen wir diese in der Konstruktorfunktion oben platzieren . Zunächst müssen wir also das Eigentum des Lebens an unsere Funktion weitergeben das Eigentum des Lebens und dann können wir diese unseren beiden Objekten unten hinzufügen. Chris, Wert von Großbritannien und Homer, der Wert von Springfield. Wir müssen auch unseren Funktionskörper modifizieren. Wir werden dies duplizieren und wir sagen, dass dies.lives dem Wert von Leben entspricht, an dem Sie weitergeben. Wir müssen die Methode auch weitergeben . Die Methode wird immer dieselbe sein, sie verwendet nur den vorhandenen Vor- und Nachnamen. Ich schneide das einfach aus und füge es in unsere Funktion ein. Schneide das aus, füge das in unsere Funktion ein. Dieses Mal entfernen wir Homer, ersetzen Homer durch das Schlüsselwort, dieses. Auch das Gleiche innerhalb unseres Funktionskörpers. Denken Sie daran, dass dieses Schlüsselwort genau wie im vorherigen Beispiel im früheren Video auf jede andere Eigenschaft dieser Benutzerfunktion verweist . Schließlich können wir auch homer.lives entfernen. Wir brauchen das nicht mehr, also können wir dies jetzt speichern und aktualisieren. Jetzt funktioniert die vollständige Namensmethode für unsere beiden Objekte. 16. Object: Wenn Sie die Rolle des Prototyps in den frühen Videos nicht ganz verstanden haben, es hoffentlich helfen, ihn jetzt mit unseren eigenen Objekten in Aktion zu sehen kann es hoffentlich helfen, ihn jetzt mit unseren eigenen Objekten in Aktion zu sehen, einige Dinge zum Klicken zu bringen. Im Starterprojekt beginnen wir mit dem Objektprototyp-Abschnitt mit dem gleichen Beispiel aus dem vorherigen Video. Wir haben eine Konstruktorfunktion zum Erstellen von Vorlagen oder Blueprints. Dies bedeutet, dass wir mehrere Objekte mit den gleichen verfügbaren Eigenschaften und Methoden erstellen können . Wir haben uns dann angeschaut, wie Eigenschaften und Methoden sowohl für einzelne Objekte als auch für die Funktion hinzugefügt sowohl für einzelne Objekte als auch werden, damit sie für alle neu erstellten Objekte gelten . Neben dem Hinzufügen zur Konstruktorfunktion können wir auch direkt zum Prototyp hinzufügen. Bevor wir dies tun, sollten wir zuerst auffrischen, was wir über den Prototyp wissen. Unten führen wir ein Konsolenprotokoll mit dem Wert Homer durch, das von unserem Konstruktor ein neues Benutzerobjekt erstellt hat. Wenn wir dies im Browser öffnen und in die Developer Tools in die Konsole springen , schauen wir uns an, was wir hier drinnen sehen. Aktualisieren Sie, und wir sehen unseren Benutzer. Lasst uns das aufmachen. Es enthält unsere Immobilien. Wir haben den Vornamen, den Nachnamen und alle Werte, die Sie unten sehen. Unten haben wir dann diesen Prototyp, der eine Verbindung zur Prototypkette darstellt. Mach das auf. Im Inneren können wir unseren eigenen Konstruktor sehen , der unser Benutzer ist. Daneben ist auch ein zweiter Prototyp Objekte. Das erste Protokoll, das hier oben oben steht , deutet auf unsere eigenen Prototyp-Ergänzungen hin, die wir uns bald ansehen werden. Dann die zweite, die wir gerade geöffnet haben, das hat jetzt viele Dinge drin, die wir selbst nicht hinzugefügt haben. Wir haben Dinge wie ValueOf, ToString. Dies sind keine Dinge, die wir selbst erschaffen haben. Denken Sie daran, dass JavaScript-Objekte von früher Zeit Eigenschaften und Methoden von übergeordneten Objekten erben. Ganz oben in dieser Vererbungskette steht das Objekt. Loggen wir dies nun zur Referenz an der Konsole an. Nur mit Homer mache ich ein zweites Konsolenprotokoll mit dem Wert von object. Speichern wir dies nun und aktualisieren den Browser, so dass wir den Hauptobjekttyp neben unserem eigenen Heimobjekt erhalten. Dieser erste Objektwert ist ein leeres Objekt, das Sie sehen können, wenn Sie dieses öffnen. Es ist leer, wenn es darum geht, keine Eigenschaften von Werten zu haben, wie wir es hier haben. Der Zweck dieses Objekts der obersten Ebene jedoch darin, die minimalen Eigenschaften und Methoden zu enthalten, die die Prototypkette an andere Objekte weitergegeben über die Prototypkette an andere Objekte weitergegeben werden. Wir können das sehen, wenn wir das öffnen. Dies enthält all diese Eigenschaften und Methoden, auf die wir jetzt über unsere eigenen erstellten Objekte zugreifen können . Wenn wir jetzt unser eigenes Heimobjekt eröffnen, gehen Sie zum Prototyp. Dann sehen Sie, dass der zweite Prototyp hier darin die gleichen Eigenschaften und Methoden von unseren Top-Level-Objekten geerbt hat die gleichen Eigenschaften und . Dies bedeutet jetzt, dass diese jetzt für unsere eigenen benutzerdefinierten Objekte verfügbar sind. Wie wir uns bereits angeschaut haben, Dinge wie benutzerdefinierte Arrays deshalb haben Dinge wie benutzerdefinierte Arrays deshalb Methoden zur Verfügung, z. B. für jeden Push und Pop. Wir haben diese Methoden nicht wirklich selbst entwickelt. Stattdessen werden sie von der Prototypkette geerbt. Alle Strahlen können sie nutzen. Wir sollten nicht unsere eigenen Eigenschaften und Methoden zu Objekten hinzufügen , die wir nicht selbst erstellt haben, aber wir können sie unserem eigenen benutzerdefinierten Konstruktor wie diesem Benutzer hinzufügen . Wir können dies tun, indem wir auf die Prototypeigenschaft dieses Benutzers zugreifen . Gleich darunter. Lasst uns etwas Platz schaffen. Greifen Sie auf unseren Benutzerkonstruktor zu. Dann der Prototyp. Wir können hier eine neue Eigenschaft festlegen, also jeden Wert. Dies können andere Datentypen wie Strings, Zahlen oder sogar Methoden sein. Wir können auch das erste Objekt entfernen unser zweites Homer-Objekt an Ort und Stelle lassen. Aktualisieren, öffnen Sie das, springen Sie in den Prototyp. Jetzt öffne ich dieses Prototyp-Objekt. Wir sehen auch die benutzerdefinierte Eigenschaft, die wir gerade festgelegt haben. Wir sehen, dass cool nicht neben dem Vornamen auf dem ursprünglichen Objekt platziert neben dem Vornamen auf dem ursprünglichen Objekt wird. Aber wenn wir versuchen, darauf zuzugreifen, cool, dann werden Sie in der Prototypkette nachgeschlagen. Wenn es nicht an unserer Prototypkette wäre, die Sie hier sehen, würde sie die Erbschaftskette noch weiter nach oben schauen . Wir können das ausprobieren. Springe in das Konsolenprotokoll. Jetzt, homer.cool. Denken Sie daran, dass .cool auf unserem ursprünglichen Konstruktor nicht verfügbar ist . Es wird dann die Prototypkette nach unten schauen , aktualisieren. Wir bekommen den Wert von true. Das Gleiche gilt auch für Methoden. Wir können dem Prototyp auch verschiedene Methoden hinzufügen. Anstatt diese Methode unserem Konstruktor verfügbar zu haben, werde ich diese kopieren und kommentieren. Fügen Sie dies außerhalb unseres Benutzers ein. Anstatt dieses Mal auf das Objekt zuzugreifen, greifen wir genau wie zuvor auf unseren user.prototype zu . Diesmal wird der vollständige Name unserer Funktion entsprechen. Testen wir das unten in unserem Konsolenprotokoll. Der Name war diesmal FullName. Da dies die Methode ist, müssen wir auch mit den Klammern darauf zugreifen. Dies sollte jetzt unseren FirstName zurückgeben zu unserem LastName hinzugefügt. Gut. Wenn Sie auch überprüfen möchten, ist dies auf dem Prototyp neben cool. Wir können FullName entfernen. Melden Sie sich bei der Konsole an, den Wert von Homer. Öffne das, springe in den Prototyp und unsere beiden neuen Editionen sind hier drin. Zu Beginn mag der Prototyp komplex erscheinen, aber es ist nur eine Möglichkeit, Eigenschaften und Methoden von einem Elternobjekt zu erben , sogar von einem Elternteil, das wie unser Benutzer oder vom Objekt der obersten Ebene erstellt wurde welches JavaScript zur Verfügung stellt. Um es zusammenzufassen, ist der Prototyp eine Eigenschaft für ein Objekt. Es wird zur Verfügung gestellt, um von anderen Objekten geerbt zu werden. Ein Beispiel dafür waren unser FullName und unsere coolen Ergänzungen. Beide wurden unserem Prototyp hinzugefügt, was bedeutet, dass diese nun anderen Objekten zum Erben zur Verfügung gestellt wurden , z. B. unseren Homer-Benutzer unten. 17. Erbliche Objekteigenschaften: Wir haben bisher ein wenig darüber gesprochen, wie wir dieses wichtigste übergeordnete JavaScript-Objekt haben , das einen Prototyp hat, und wie man neue erstellen würde, die automatisch bestimmte Dinge durch die Prototypkette erben. Aber was wäre, wenn wir auch zulassen wollten unsere eigenen Objekte vererbt werden? In einer Startdateien haben wir ein ähnliches Benutzerbeispiel aus dem vorherigen Video. Wir haben ein Benutzerobjekt, und wir können feststellen , dass dieses Benutzerobjekt einige Einschränkungen für unsere spezielle Verwendung aufweist. Hier erschaffen wir echte Menschen wie mich und auch knapp unter einer fiktiven Figur. Aber wenn wir darüber nachdenken, benötigen echte und fiktive Menschen möglicherweise unterschiedliche Eigenschaften. Wir können zum Beispiel den Namen der Show hinzufügen , aus der der fiktive Charakter stammt. Dies würde jedoch nicht für eine reale Person gelten. Dies erschwert es jetzt, dieses Objekt viel weiter zu erweitern. Was wir jedoch tun können, ist, dieses Benutzerobjekt als Basis zu verwenden, einschließlich der minimalen Eigenschaften einschließlich der minimalen Eigenschaften, die sowohl für den realen als auch für den fiktiven Benutzer gelten. Dann erstellen wir zwei weitere Objekte, die beide von diesem ursprünglichen Benutzer erben. Wir haben immer noch Zugang zu all den Dingen wie den Namen und den Berufen. Aber dann wird es auch spezifische Eigenschaften haben , die wir für jeden Anwendungsfall benötigen. Um dies zu tun, haben wir eine Objektmethode namens create. Kurz bevor wir dies zu unserem aktuellen Beispiel hinzufügen, schauen wir uns an, wie wir dies mit einem normalen Standalone-Objekt machen können . Fügen wir zunächst ein reguläres Objekt unten hinzu. Entfernen Sie vorerst unser Konsolenprotokoll erstellen Sie ein neues Objekt namens product1. Öffne die geschweiften Klammern und wir fügen unsere Eigenschaften hinzu. Der Titel ist wieder ziemlich generisch, also ein erstaunliches blaues Hemd. Auch die Beschreibung. Einfach alles blaue Shirt. Als eigenständiges Objekt handelt es sich ein generisches Objekt, das auf mehrere blaue Hemden gelten könnte. Der Titel und auch die Beschreibung passen zu anderen blauen Hemden. Wir könnten auch einige Details wie Marke oder Größe für andere Produkte ändern . Wir könnten dann diese Object.create-Methode verwenden, die wir zuvor erwähnt haben , um ein zweites Produkt auf dieser Grundlage zu erstellen , dieses innerhalb einer Variablen namens product2 zu installieren und dieses auf object.create zu setzen. Innerhalb von object.create geben wir unser Produkt1 ein, was bedeutet, dass es ein neues Produkt namens product2 erstellt , das auf unserem Originalprodukt1 basiert. Protokollieren wir dies auf dieser Konsole, Produkt2, und sehen Sie, was hier passiert. Aktualisieren. Aktualisieren wir diesen Link einfach im Browser. Anfangs sehen wir ein leeres Objekt. Wir haben keine Eigenschaften oder Methoden, die damit verbunden sind. Aber wenn wir den beigefügten Prototyp öffnen , haben wir Zugriff auf unseren Titel und auch auf unsere Beschreibung, die von unserem Produkt geerbt wurde1. So funktioniert die create-Methode. Es erstellt ein neues Objekt und verwendet das vorhandene Objekt, das wir übergeben, als Prototyp. Beachten Sie auch, dass wir auch einen zweiten Prototyp haben. Wir haben zuerst unser eigenes, das ist die Beschreibung und dann der Titel. Dann weiter oben in der Kette haben wir alle Eigenschaften und Methoden, die wir zuvor gesehen haben die von der Spitze der Kette vom Objekt geerbt werden. Wie wir bereits erfahren haben, können wir, obwohl unser eigenes Objekt leer ist, obwohl unser eigenes Objekt leer ist, weiterhin auf diese geerbten Eigenschaften von product1 mit ihrem Namen zugreifen . product2, denken Sie daran, dass dies komplett leer ist , wie wir es gerade in der Konsole gesehen haben. Wir können auf die geerbten Werte wie Titel zugreifen. Wir können auch unsere eigenen Eigenschaften und Methoden hinzufügen , wie Sie es erwarten würden. Direkt unter unserem Produkt2 können wir mit dem Namen darauf zugreifen und dann neue Eigenschaften wie die Größe festlegen , z. B. klein. Melden Sie dies in der Konsole an, die dann unser Objekt aktualisiert. Jetzt können wir all dieses Beispiel entfernen und wir können dieses Wissen verwenden , das wir gerade gelernt haben. Wir können nun versuchen, das gleiche Beispiel auf unseren Benutzer anzuwenden. Der Hauptunterschied besteht jedoch darin, dass wir eher eine Konstruktorfunktion als ein tatsächliches Objekt haben. Wenn wir dasselbe tun würden wie zuvor, erstellen wir eine Variable namens copy, die auf object.create festgelegt ist. Wenn wir dann versuchen, eine Kopie unseres Benutzers zu erstellen, schauen wir uns an, was in der Konsole passiert. Speichern und aktualisieren. Die Kopie ist eine Kopie der Funktion, die nicht das ist, was wir wollen. Was wir suchen, ist eine Möglichkeit, konstruktivere Funktionen zu erstellen , die alle die Eigenschaften dieses Benutzers erben. Fangen wir mit dem Charakter an. Erstellen Sie direkt unter unserem Benutzer unseren neuen Objektkonstruktor namens Charakter. Denken Sie daran, dass dieser Funktion darin besteht, alle Basiseigenschaften von unseren Benutzerobjekten zu erben . Wir werden auch einige zusätzliche Eigenschaften hinzufügen , die nur für unseren Charakter gelten. Diese zusätzlichen Informationen , die wir weitergeben ist die Show, aus der der Charakter stammt. Dann greifen wir wie oben auf this.show zu und setzen dies gleich dem Wert, der an diesen Konstruktor übergeben wird . Nun erstellen wir ein neues Zeichenobjekt mit der show -Eigenschaft und erben auch alle diese Eigenschaften. Aber das müssen wir auf unseren Charakter eingehen und zuerst auf unsere Benutzerkonstruktorfunktion zugreifen, die wir dann auf eine Aufruffunktion zugreifen können. Diese Aufrufmethode ist für den Prototyp einer Funktion verfügbar und ermöglicht eine Funktion, die zu einem Objekt gehört , das innerhalb eines anderen Objekts aufgerufen wird. heißt, wir können jetzt eine Benutzerfunktion aus unserer Charakterfunktion aufrufen . Diese Aufrufmethode ist nicht exklusiv für diesen Anwendungsfall. Es kann jederzeit verwendet werden, wenn ich auf eine Funktion oder eine Methode zugreifen möchte , die sich auf einem anderen Objekt befindet. Diese Benutzerfunktion nimmt auch diese vier Parameter auf. Wir können diese kopieren und dies auch unserem Charakter hinzufügen. Denken Sie daran, dass Homer ein Charakter ist Anstatt dies also auf den neuen Benutzer zu stützen, werden wir dies auf den neuen Charakter stützen. Wie die vierten Argumente, die ich zeigen werde, können wir kurz nach Springfield unseren letzten Wert, nämlich die Simpsons, weitergeben . Diese fünf Werte stimmen jetzt mit den fünf Zeichen übergebenen Werten überein, die an unseren Konstruktor übergeben wurden . Probieren wir das mal aus. Wir können unsere Kopie von vorher entfernen und stattdessen protokollieren wir den Wert von Homer. Dies zeigt jetzt, dass Homer ein Charakterobjekt ist. Es hat die Showeigenschaft mit dem Wert der Simpsons. Wir wissen, dass homer.show jetzt auch funktionieren sollte. Aber was ist mit den anderen geerbten Eigenschaften? Wir konnten vor dem Homer-Objekt sehen, dass es nur Zugriff auf die Showeigenschaft auf der obersten Ebene hatte. Wir hatten nichts anderes wie den FirstName und LastName, den Beruf oder das Leben. Nun, probieren wir das aus und sehen, was passiert. Versuchen Sie es zuerst mit dem Beruf. Aktualisieren Sie, und wir erhalten den Wert von undefined zurück . Versuchen wir es noch einmal. homer.lives und das ist auch undefiniert. Die geerbten Eigenschaften scheinen hier nicht zu funktionieren. Dies liegt daran, dass uns einige Details fehlen, wenn wir unsere Benutzerfunktion innerhalb unseres Charakters aufrufen. Zuallererst müssen wir alle diese übergebenen Parameter kopieren und diese auch zu unserer Aufrufmethode hinzufügen. Darüber hinaus müssen wir dieses Keyword auch weitergeben . Wir haben bereits erwähnt , dass dieses Schlüsselwort komplexe Sache sein kann , die es zu verstehen gilt. Wir werden später mehr dazu haben. Dies bedeutet jedoch im Grunde, dass beim Ausführen unserer Funktion wir beim Ausführen unserer Funktion auf die Werte zugreifen können. So wie wir oben waren. nach unten scrollen, versuchen wir immer noch homer.lives zu protokollieren. Lasst uns das aktualisieren und wir erhalten jetzt den Wert von Springfield. Wir können noch einen ausprobieren, den FirstName. Das funktioniert alles richtig. Genau als Zusammenfassung, da dies ziemlich verwirrend sein kann, erstellen wir ein neues Homer-Objekt unserem Charakter basiert. Diese Zeichenkonstruktorfunktion hat nur eine eigene Eigenschaft, nämlich die Show, zu der das Zeichen gehört. Aber es erbt auch alle Eigenschaften und Methoden von unseren Benutzerobjekten, die wir gerade hier weitergeben . Tatsächlich müssen wir diese Shows auch nicht hinzufügen, da sie zu dieser speziellen Funktion gehören. bei all dieser Komplexität überprüfen möchten, Wenn wir bei all dieser Komplexität überprüfen möchten, welcher unserer Konstruktoren ein bestimmtes Objekt wie Homer erstellt hat, können wir etwas verwenden, das als instanceof bezeichnet wird. Wir können dies im Konsolenprotokoll überprüfen. Wir können prüfen, ob das Homer-Objekt ein Instanceof Charakter ist. Sollte der Wert von wahr sein, da wir Grundlage unseres neuen Charakters sind. Aber wenn wir unseren Benutzer weitergeben würden, wird dieser falsch sein. So macht JavaScript Dinge. Es hat von Anfang an Objekte , von denen wir es erben können. Als Neuling wissen wir nicht einmal, dass dies hinter den Kulissen passiert. Aber wenn wir so etwas tiefer graben würden, können wir verstehen, dass dies so jedes neue Objekt ist , Objekte, die sich auch auf andere Typen wie Arrays und Funktionen beziehen und eine Menge haben von hilfreichen Eigenschaften und Methoden , die wir jedes Mal verwenden können, wenn wir unsere eigenen Objekte erstellen. Wie wir gerade besprochen haben, können wir diese Prototypvererbung bei Bedarf auch durch unsere eigenen Objekte nutzen . 18. Kopieren von Objekteigenschaften: In den vergangenen Videos sind wir ziemlich tief in Objekte mit Dingen wie Objektkonstruktoren und Kopieren und Prototypen eingedrungen. Aber manchmal möchten wir einfach nur die Eigenschaften von einem Objekt auf ein anderes kopieren . Es gibt ein paar verschiedene Möglichkeiten, dies zu tun. Zuallererst haben wir den Basischarakter mit Informationen, die für alle neuen Simpsons-Charaktere gelten könnten , die wir erstellen. Ziemlich generische Informationen, und unten haben wir auch ein Homer-Objekt mit einigen Eigenschaften, die nur für dieses eine Zeichen gelten. Für Homer und auch alle anderen Charaktere, die wir erstellen, müssen wir auch alle Eigenschaften aus dem Basiszeichen zusammenführen . Eine einfache Möglichkeit, dies zu tun, besteht darin, dieses Basiszeichen innerhalb des Homer-Objekts zu referenzieren . Wir haben dies als Eigenschaft hinzugefügt, es im Basiszeichen und dies in der Konsole testen. Wir haben bereits ein Konsolenprotokoll für den Wert von Homer. Wenn wir das öffnen, haben wir die vier ursprünglichen Eigenschaften und wir sehen auch unseren Basischarakter. Das funktioniert völlig gut, aber es erzeugt ein Basischarakterobjekt , das wir öffnen und in das wir eintauchen müssen. Unser Basischarakter ist eine Ebene tiefer verschachtelt als alle unsere anderen Immobilien. Aber es wäre besser, wenn wir all diese Eigenschaften des Basischarakters greifen und sie effektiv neben das stellen könnten diese Eigenschaften des Basischarakters greifen und , was wir bereits haben. Eine Möglichkeit, dies zu tun, besteht darin , Objekte zu verwenden, die wir uns früher angeschaut haben, nämlich die drei Punkte. Übergeben Sie die drei Punkte vor unserem Basischarakterobjekt. Jetzt sehen wir das Basischarakterobjekt nicht das wir eintauchen müssen. Stattdessen sehen wir alle Eigenschaften von Basischaraktern neben unseren Homer-Eigenschaften. Wir könnten diese Technik auch verwenden, um so viele verschiedene Objekte zu verbreiten , wie wir wollten. Wenn wir zum Beispiel einen Homer-Simpson-Charakter mit Superkräften für eine bestimmte Episode hätten einen Homer-Simpson-Charakter mit , könnten wir so etwas machen. Wir könnten ein neues Objekt namens SuperHomer erstellen. SuperHomer müsste auch das Basiszeichen und auch alle vorhandenen Informationen von Homer erben das Basiszeichen und auch . Wir können das auch entfernen. Wir können Spreads verwenden, die in diesen beiden Objekten passieren. Das Basischarakter und auch die vorhandenen Homer-Informationen. Darüber hinaus können wir auch unsere eigenen Eigenschaften übergeben , die für dieses einzelne Objekt spezifisch sind. Zum Beispiel könnten wir festlegen, dass die Kräfte gleich wahr sind, und dies sollte jetzt ein großes Objekt im Browser anzeigen . Lassen Sie uns einfach unser Konsolenprotokoll ändern, um SuperHomer zu sein. Aktualisieren und jetzt haben wir neun verschiedene Eigenschaften für dieses Objekt. Wir haben den Sturz vom Basischarakter, der Vorderseite des Homer-Objekts und auch die auf wahr gesetzten Kräfte. Wir könnten dieses Objekt entfernen oder kommentieren, und wir werden uns nun eine andere Möglichkeit ansehen, die Objekteigenschaften in ein neues Objekt zu kopieren . Dies geschieht mit einer Objektmethode namens assign. Greifen Sie auf unser Hauptobjekt zu, die Methode zuweisen Dies wird zwei Dinge in sich nehmen. Erstens das Zielobjekt , in das Sie kopieren möchten. Wir kopieren es in unser Homer-Objekt, und das zweite ist das Objekt, das Sie kopieren möchten. Verwenden Sie unser Originalbeispiel, um alle Eigenschaften von unserem Basischarakter in Homer zu verschieben . Geben Sie dies als zweiten Wert ein. Im Konsolenprotokoll soll Homer sein. Springe in die Konsole. Dies führt jetzt alle Eigenschaften aus dem Basischarakter in unser Homer-Objekt zusammen. Funktioniert effektiv genau wie der Spread-Operator, den wir vorher nachgeschlagen haben. Auch wenn nötig, können wir dieses neue Objekt in einer Variablen wie MergeDHomer speichern . Dies sollte auch genau genauso funktionieren. Diese zugewiesene Technik und auch die vorherigen sind sehr nützlich und etwas, das Sie oft in JavaScript verwenden können. Es gibt viele Anwendungsfälle, z. B. wenn wir einen Benutzer und eine Bestellung hätten Möglicherweise möchten wir ein Benutzerobjekt an unsere Bestellung anhängen , bevor wir in die Datenbank speichern , damit wir wissen, wer die Bestellung tatsächlich aufgegeben hat. Sie werden wahrscheinlich auch viele eigene Anwendungsfälle finden . 19. CSS Style Objekte: Im DOM-Bereich haben wir unsere eigenen HTML-Elemente erstellt. Dann haben wir uns angeschaut, wie man diesen Elementen mit JavaScript CSS-Styling hinzufügen kann. In der Datei des Styles haben wir unten ein Beispiel dafür, einen einfachen Header-Abschnitt mit einem Titel ohne Fleischburger. Darunter haben wir innerhalb unseres Skripts mehrere Stileigenschaften angewendet. Das funktioniert gut, wie wir im Browser sehen können, aber es kann eine ziemlich lange Art sein, Dinge zu tun. Es ist auch für andere Elemente nicht wiederverwendbar. Eine Lösung dafür besteht darin, ein Stilobjekt zu erstellen das alle CSS-Eigenschaften und -Werte enthält , die wir benötigen. Gehen wir nach unten und wir werden all diese vorhandenen Stile kommentieren und diese innerhalb eines Stilobjekts neu erstellen. Bewahren Sie dies innerhalb einer Variablen namens Styles auf. Sagen Sie, dass dies einem Objekt entspricht, und wir werden diese hier effektiv replizieren. Zuallererst ist das Display gleich dem Wert von flex. Da es sich um ein Objekt handelt, müssen wir dies durch ein Komma trennen und das nächste ist JustifyContent. Da es sich um JavaScript handelt, müssen wir auch diesen Kamelfall machen, JustifyContent und jedes Wort nach dem ersten muss mit einem Großbuchstaben beginnen. Der Wert, dies kann der gleiche sein, dies kann ein Leerzeichen dazwischen sein. Als Nächstes haben wir einen Polsterwert. Wieder als String, Null oben und unten und 10 Pixel links und rechts. Hintergrund. Was haben wir hier? Wir haben einen RGB-Wert. Lassen Sie uns das überschreiben. Endlich die Farbe. Schnappen wir uns den Wert , den wir bereits haben , und fügen Sie ihn ein. Gehen wir zum Browser und aktualisieren Sie es. Wir haben kein Styling angewendet. Jetzt brauchen wir eine Möglichkeit, das Stilobjekt tatsächlich auf unser Header-Element anzuwenden . Genau wie das letzte Video können wir object.assign verwenden. Dadurch werden alle unsere Stilobjekteigenschaften dieses Header-Element kopiert. Unten am unteren Rand des Script-Object.assign. Wir möchten diese auf den Header anwenden. Die Objekteigenschaften , die Sie anwenden möchten, sind unsere Stile. Aber so wie es so ist, funktioniert es nicht, wenn wir den Browser aktualisieren. Der Grund dafür ist genau wie wir es ursprünglich getan haben Anstatt diese auf das Header-Element anzuwenden, müssen wir diese auf header.style anwenden, also at.style und update und es sollte jetzt alles in der -Browser. Im Moment sind Sie vielleicht etwas verwirrt warum eine Objektmethode wie assign an einem Element wie Header arbeitet. Nun, das liegt daran, dass unsere Elemente, wie viele Dinge in JavaScript auch als Objekte eingestuft werden. Wir können dies mit einem Konsolenprotokoll sehen. Wir können den typeof Operator und den Wert von Header verwenden. Dann schauen wir uns an, was in der Konsole passiert. Aktualisieren Sie und Sie können sehen, dass der Header, obwohl es sich um ein Element handelt, eine Art eines Objekts ist. Wenn wir neue Elemente erstellen, erstellen wir tatsächlich Elementobjekte und so können wir Zugriff auf Eigenschaften, Methoden und Ereignisse haben . Wir haben bereits Eigenschaften wie den Zugriff auf die Attribute, die Klassenliste und das innere HTML verwendet wie den Zugriff auf die Attribute, die , um einige zu nennen. Methoden, die wir verwendet haben gehören Queryselector und addEventListener. Diese sind alle für dieses Elementobjekt verfügbar . Aber warum sollte anstelle von regulärem CSS ein Style-Objekt erstellt werden? Nun, CSS ist wahrscheinlich für viele Anwendungsfälle einfach, aber auf diese Weise hat auch seine eigenen Verwendungszwecke. Der wichtigste für mich ist die Tatsache, dass es mit JavaScript gesteuert wird. Wir können Werte dynamisch ändern. Wenn wir zum Beispiel ein Spiel hätten, könnten wir den Hintergrund in Rot ändern , wenn das Spiel vorbei wäre. Wir können einen Count-Down-Flush schneller machen , da er näher ans Ende kommt, und so viele weitere großartige Anwendungsfälle, indem einen dieser Werte dynamisch aktualisieren. 20. Looping mit Objekten: Objekte können viele Werte haben, wie wir wissen, und genau wie bei Arrays ist Looping eine bequeme Möglichkeit, etwas für jede Eigenschaft zu wiederholen. Es gibt ein paar verschiedene Möglichkeiten, wie wir Objekte durchlaufen können , und zuerst schauen wir uns die For-In-Schleife an. In der Datei dieser Lektion haben wir oben eine Konstruktorfunktion, die wir zuvor gesehen haben, um einen neuen Benutzer zu erstellen. Beachten Sie, dass die Prototyp-Ergänzungen kommentiert sind und wir werden bald sehen warum. For-In-Schleife sollte ziemlich vertraut aussehen. Wir haben uns das bereits in der Schleife im Abschnitt angeschaut, aber ich möchte Ihnen etwas anderes zeigen, das damit zusammenhängt. Als Auffrischung sieht es so in unserem Code aus. Es beginnt mit dem Schlüsselwort for, und in diesem Beispiel werden wir unser Homer-Objekt durchlaufen . Wir müssen für jede der Eigenschaften hier eine Variable erstellen , also der Vorname, der Nachname, der Beruf und das Leben. Dies innerhalb einer Variablen oder einer Konstante namens Eigenschaft innerhalb unseres Homer-Objekts. Jetzt öffnen wir einfach die geschweiften Klammern und dann können wir hier drinnen mit dieser Eigenschaft alles tun, was wir wollen. Aber jetzt machen wir ein Konsolenprotokoll, öffnen die Back-Ticks, damit wir unsere Eigenschaftsvariable einfügen können , nämlich unser Eigenschaftsname, z. B. Vorname, Doppelpunkt hinzufügen, und danach könnten wir greifen Sie auch auf den Wert der Immobilie zu. Auch hier fügen wir dies als Variable ein, sodass wir auf unser vollständiges Homer-Objekt zugreifen müssen, und innerhalb der eckigen Klammern übergeben wir die Eigenschaft, von der wir den Wert ermitteln möchten. Speichern Sie dies, aktualisieren Sie es, und wir sehen jede dieser vier Eigenschaften in der Konsole. Wir sehen die tatsächlichen Eigenschaftsnamen wie den Vornamen, und dann wählen wir den Eigenschaftswert aus dem Homer-Objekt aus, z. B. Wir können diese Werte dann verwenden, um Elemente zu konstruieren, um sie jetzt dem DOM hinzuzufügen. Erstens ist eine ungeordnete Liste erforderlich, die wir als Wrapper für alle diese Werte verwenden können. Springen Sie also außerhalb des Skripts zu unserem Body-Bereich, eine ungeordnete Liste und der erste Schritt besteht darin, zu greifen ein Verweis auf unsere Elemente. Const ul ist gleich document.QuerySelector, geben Sie unsere ungeordnete Liste ein. Das gibt uns jetzt zwei Dinge. Wir haben eine Schleife, also durchschleifen wir alle Eigenschaften in unserem Objekt, und jetzt gibt uns dies ein Element, an das wir dies anhängen können. Da es sich um eine ungeordnete Liste handelt, müssen wir für jeden dieser Werte ein neues Listenelement erstellen . Für unser Listenelement erstellen wir dies mit document.createElement (). Ein Element ist in Li. Denken Sie daran, wenn Sie neue Elemente erstellen, dies im Allgemeinen ein dreistufiger Prozess ist. Wir erstellen die Elemente, wir erstellen den Inhalt, wie den Textknoten, und führen diese dann zusammen. Der zweite Teil davon bezieht sich auf den Text, der in unser Listenelement eingeht. Wir machen dies mit document.createTextNode (), replizieren das, was wir in der Konsole gesehen haben. Alles, was wir tun müssen, ist, den Inhalt von hier aus zu kopieren , den Inhalt von hier aus und diesen in unsere Methode einzufügen. Entfernen Sie das Konsolenprotokoll, führen Sie diese zusammen indem Sie zuerst auf unsere Elemente zugreifen und verwenden Sie die Methode namens AppendChild. Wir werden unseren Text weitergeben. Dies hat ein neues eigenständiges Element oder ein eigenständiges Listenelement erstellt , und dann müssen wir diese für jede Schleife zusammenführen oder in unsere ungeordnete Liste einfügen. Genau wie oben holen wir uns unsere ungeordnete Liste und verwenden das AppendChild. Übergeben Sie das Listenelement, das wir gerade erstellt haben. Speichern und aktualisieren. Los geht's und dies ist eine wirklich gute Möglichkeit, unsere Objekte so zu strukturieren, dass sie im Browser angezeigt werden. Aber zurück zu diesem Prototyp , den Sie zuvor erwähnt haben , der derzeit kommentiert wird. Wenn wir das Kommentieren abkommentieren, speichern wir dies und aktualisieren Sie den Browser jetzt erneut. Wir sehen jetzt auch diese beiden Prototypwerte hier. Dies ist etwas, auf das wir achten müssen, und wenn wir diese Prototypen nicht durchlaufen wollen, was oft der Fall ist, können wir sie mit einer Objektmethode namens hasOwnProperty () beseitigen , was wir innerhalb der Schleife verwenden können. Gehen wir zu unserer For-In-Schleife und fügen ganz oben eine if-Anweisung hinzu. Wir werden homer.hasownProperty () übergeben und unsere Eigenschaftsvariable übergeben. Was wir hier tun, ist, dass wir auf unser vollständiges Homer-Objekt zugreifen und dann jede Eigenschaft einzeln überprüfen. Wir prüfen, ob die bestimmte Eigenschaft zu diesem Homer-Objekt gehört oder ob sie über den Prototyp vererbt wird. Wenn dies zutrifft, möchten wir unseren Code unten ausführen. Wenn nicht, wird es ein Prototypwert sein und daher ignoriert. Wir können dies jetzt fehl am Platz schneiden und dies in unsere if-Aussagen einfügen. Aktualisieren, und dies ist eine Möglichkeit, unsere geerbten Prototypwerte zu ignorieren. Eine andere Möglichkeit, Objekte zu schleifen, besteht darin, sie zuerst in Arrays umzuwandeln. Object verfügt über einige Methoden denen Sie dies tun können, und je nachdem, ob Sie auf die Eigenschaft des Objekts zugreifen möchten , den Wert beider als Paar. Beginnen wir mit einer Methode, die zuerst Einträge ganz unten genannt wird , in ein Konsolenprotokoll für objects.entries () und unserem Objektwert von Homer platzieren . Testen Sie dies aus, springen Sie in die Konsole und es kehrt immer noch im Array zurück. Dies kehrt nicht nur wieder im Array zurück, jede der Eigenschaften ist auch ein Array. Es enthält den Eigenschaftsnamen und auch den Wert, wie Sie hier sehen können. Diese Methode enthält die Prototypwerte nicht wie bei for in. Wenn wir dies verwenden würden, könnten wir die if-Aussagen ignorieren , die wir gerade hier haben. Um dies auszuprobieren und dasselbe Beispiel beizubehalten, geben zum Beispiel nach oben und kommentieren Sie dies dann. Fügen Sie dies direkt unten ein. Ich muss erwähnen, dass wir diese if-Aussage nicht brauchen, da wir keinen der geerbten Prototypen eliminieren müssen. Entfernen Sie den Wrapper und lassen Sie diese vier Zeilen im Inneren. Dieses Mal, anstatt es über unser Homer-Objekt zu schleifen, werden wir jetzt object.entries verwenden. Wir werden dies verschieben, und genau wie im Konsolenprotokoll, indem wir Objekte ersetzen, Dateneinträge mit dem Wert von Homer. Speichern und aktualisieren. Im Browser sehen wir die Werte von undefined. Dies ist möglicherweise zunächst nicht offensichtlich, warum dies der Fall ist, aber das liegt an der Art der Schleife, die wir verwenden. Wir verwenden derzeit eine for-in-Schleife, die für Objekte verwendet wird. Aber jetzt konvertieren wir Homer in ein Array. Dies bedeutet jetzt, dass wir eine kleine Änderung vornehmen müssen und stattdessen eine for-Schleife verwenden müssen, also ändern Sie sich, um von zu sein, und erinnern Sie sich jetzt an diese Eigenschaft, anstatt eine einzelne Eigenschaft wie zuvor zurückzugeben zeigt nun auf ein Array, das zwei Werte enthält, so dass unser Vorname und Homer. Was wir stattdessen tun können ist die D-Struktur mit dem Array, das uns den Schlüssel und auch den Wert gibt. Der Schlüssel ist in diesem Fall gleich dem Vornamen, und der Wert wird für jeden unserer Artikel dem Homer entsprechen . Gib das ein. Zuallererst der Schlüssel, und dann geben wir auch unseren Wert ein. Spar dir das auf. Erneut laden. Dies funktioniert wieder wie erwartet. Dies ist eine wirklich gute Art des Loopings, was den Prototyp nicht beinhaltet. Wenn wir wollen, können wir auch auf die Schlüssel zugreifen, alle Werte auch einzeln. Die Art, das zu tun. beispielsweise in unserem Konsolenprotokoll Wenn wir beispielsweise in unserem Konsolenprotokoll nur auf die Schlüssel wie Vorname und Nachname zugreifen möchten , können wir eine Objektmethode namens keys verwenden, bei der wir unser Homer-Objekt übergeben und es gibt unsere vier Schlüssel ohne die Werte. Wenn wir andererseits nur auf die Werte und nicht auf die Schlüssel zugreifen wollten , können wir object.values verwenden, und dies wird dies zurück in die Konsole zurückgeben. Dies wird auch häufig in if-Anweisungen wie diesen verwendet. Wir könnten sagen, ob object.keys (), unser Objekt übergeben und auf die Eigenschaft length zugreifen größer als Null ist. Wir können dann drin etwas tun. Dies prüft, ob ein Objekt vor dem Ausführen eines Codes nicht leer ist , und es hängt nur davon ab, ob Sie entweder auf den Schlüssel oder den Wert oder auf beide zugreifen möchten . 21. Dynamische Objekte: Dieses Video wird konvertiert, um dynamischere Objekte zu erstellen. Damit meine ich, dass sowohl der Schlüssel als auch der Wert mit JavaScript geändert werden können. Wenn wir neue Objekte erstellen, genau wie bei diesem Home-Objekt, verwenden wir einen einfachen primitiven Wert wie Strings, aber unsere Programme werden nicht immer so starr sein. Möglicherweise müssen wir auch Daten einfügen, die sich ändern können, z. B. eine Variable. Auch bei den Schlüsselnamen wie FirstName und LastName und Beruf. Dies könnte auch alles dynamisch sein. Ich zeige dir jetzt einige Möglichkeiten, dies zu tun. Erstens, die traditionelleren Wege und dann ein Weg, der in ES2015 eingeführt wurde. Wir fügen zunächst Variablen als Werte ein, und das ist ziemlich einfach. Lassen Sie uns zuerst eine Variable namens FirstName erstellen und diese auf Homer setzen. Wir können diese Variable dann innerhalb unseres Immobilienwerts referenzieren , wenn wir unseren neuen Homer-Benutzer erstellen. Denken Sie daran, da wir uns jetzt auf eine Variable und nicht auf eine Zeichenfolge beziehen , müssen wir die umgebenden Anführungszeichen entfernen. Speichern Sie dies und aktualisieren Sie es. Das funktioniert genau wie zuvor, aber dieses Mal weisen wir jetzt auf eine Variable hin. Wir wissen bereits, dass wir auch so neue Immobilien hinzufügen können. Wir können auf unser Objekt zugreifen, auf die Likes-Eigenschaft und diese auf eine Zeichenfolge setzen. Speichern und aktualisieren, und dies wird auch zu unserem Objekt hinzugefügt. Derzeit ist der Wert von Likes auf eine Zeichenfolge festgelegt. Wir möchten vielleicht auch, dass dies auch dynamisch ist. Lassen Sie uns versuchen, dies als Variable und nicht als String festzulegen . Entfernen Sie die Zitate. Ich werde dies als Variable direkt oben erstellen, const likes, und füge unsere Zeichenfolge in die hinteren Ticks ein oben erstellen, const likes, und füge unsere Zeichenfolge in , damit wir unsere Variable einfügen können , die alle unseren FirstName übergibt. In diesem Fall wird es homerlikes sagen, gefolgt von einem bestimmten Wert. Ich sende FirstName, einen Text von Likes, und jetzt verweisen unsere Likes hier auf unsere Variable, die jetzt im Browser angezeigt wird. Es berücksichtigt auch unsere FirstName-Variable und platziert sie als Teil der Zeichenfolge. Wenn wir mehrere Likes hätten, möchten wir sie vielleicht auch nummerieren. Wir können damit beginnen, einen Anfangswert zu schaffen. Wir sagen, dass die Zahl gleich einem Anfangswert von eins ist. Hängen Sie dann diesen Zahlenwert an unsere Variable an. Wie wir erwarten würden, haben wir nur die einzige Nummer 1. Wenn wir dies duplizieren und dies in einen zweiten Wert wie Donuts ändern würden, könnten wir diese Zahl mit Plus Plus um eins erhöhen. Dies wird für jeden unserer Werte erhöht. Denken Sie daran, dass all dies mit unserer Objektkonstruktorfunktion oben konstruiert wird . All dies können wir auch mit dem Objektliteralansatz tun. Lassen Sie uns unten ein Objektliteral erstellen, und wir nennen es homer2 und setzen es auf ein literales Objekt, in dem wir unsere Eigenschaften wie FirstName festlegen oder wir auch unsere FirstName-Variable auch. Melden Sie dies bei der Konsole an. Wie Sie sehen können, kann unsere Variable auch mit diesem Ansatz eingefügt werden. Dies mag jedoch etwas verwirrend aussehen , da wir hier auf alle FirstName-Variablen verweisen, aber auch der Eigenschaftsname zeigt immer noch auf diese FirstName-Variable. Warum sehen wir diese Ausgabe als String und nicht als Wert von Homer? Nun, für den Schlüssel müssen wir diesen Namen nicht in Anführungszeichen umwickeln. Dies wird immer als String angezeigt. Wie würden wir diese Eigenschaft mit dem Namen dynamisch machen , wenn wir eine Variable nicht einfach wie diese verwenden können? Nun, eine Option wäre nur, ein leeres Objekt ohne darin enthaltene Eigenschaften zu erstellen . Dann könnten wir Eigenschaften wie oben mithilfe der eckigen Klammern hinzufügen oben mithilfe der eckigen Klammern oder alternativ eine ES2015-Funktion namens berechnete Eigenschaftsnamen verwenden . Wir könnten die eckigen Klammern direkt in unseren Objekten benutzen . Umgeben Sie also unsere FirstName-Eigenschaft mit den Klammern, die jetzt besagen, dass der Code in diesen Klammern nicht als String behandelt werden soll. Stattdessen wird es als JavaScript-Ausdruck ausgewertet, was bedeutet, wenn wir dies jetzt im Browser anzeigen , sehen wir jetzt den Wert von Homer , der unsere Variable ist. Sogar diese vollständige Kontrolle über den Eigenschaftenschlüssel und auch den Eigenschaftenwert mit JavaScript. Wir könnten unsere Immobilien auch so einziehen wie wir es von oben getan haben. Wir könnten ohne das Homer-Präfix darauf zugreifen , fügen Sie dies ein. Der einzige Unterschied ist eher als die Gleichen, wir müssen dies über einen Doppelpunkt ändern. Wir können auch unsere zweite von Donuts hinzufügen. Füge ein Komma hinzu, platziere einen Doppelpunkt. Probieren wir das im Browser aus. Mach das auf. Dies wird jetzt eingefügt, aber anstelle der Werte von eins und zwei sehen wir die Werte von zwei und drei, da wir dies bereits oben erhöht haben, können wir diesen auskommentieren. Es führt uns zurück zu unserem ursprünglichen Beispiel. Auf diese Weise können wir berechnete Eigenschaftsnamen mit unseren Objekten verwenden , um sowohl den Schlüssel als auch mithilfe von JavaScript sowohl den Schlüssel als auch den Wert dynamischer zu gestalten. 22. Primitive & Referenztypen: Wir verwenden häufig Variablen beim Codieren und JavaScript, um unsere Daten zu speichern. Aber wenn wir etwas tiefer gehen, gibt es einige wichtige Konzepte zu verstehen und das sind die wir Werte, die wir speichern, in zwei Gruppen fallen. Um dies besser zu verstehen, möchte ich zuerst aktualisieren, was wir bereits über Datentypen wissen. Wir haben primitive Werte, bei denen es sich um einfache Werte handelt, z. B. eine Zeichenfolge oder eine Zahl , die keine Methoden hat. Wir haben auch Objekttypen. Diese beiden Gruppen beziehen sich direkt auf das, was wir uns jetzt ansehen werden, und dies speichert primitive und Referenztypen. Eine String-Variable wäre primitiv, und ein Objekttyp, wie eine Array-Variable würde als Referenztyp klassifiziert. Beide Typen beeinflussen das Verhalten von Werten, wenn wir sie weitergeben und vergleichen. Lassen Sie uns zuerst in unser Starterprojekt einsteigen und einen Blick auf die Primitive werfen. Im Skript für die Datei dieser Lektion erstellen wir eine neue Variable namens Dog und setzen diese auf eine Zeichenfolge. Erstellen Sie als Nächstes eine zweite Variable namens NewDog, und wir setzen diese auf unsere ursprüngliche Hundevariable. Diese ist im Grunde eine Kopie unserer ersten Variablen. Dann werden wir NewDog neu zuweisen, um etwas anderes zu sein. Denken Sie daran, dies zu tun, besteht darin , unseren Variablennamen auszuwählen und diesen auf einen neuen Wert festzulegen. Als nächstes müssen Sie einen schnellen Test mit einem Konsolenprotokoll durchführen , beginnend mit unserer ersten Hundevariablen und dann einem zweiten Konsolenprotokoll für unseren neuen Hund. Mal sehen. Nun, das ist in der Konsole eingefroren . Wir sehen den Wert von Pudel , den Sie von unserem ersten Konsolenprotokoll erwarten würden, und das zweite Konsolenprotokoll von NewDog. Obwohl dieser ursprünglich die Variable Pudel zugewiesen wurde, wurde dies aktualisiert, um den Text von Labrador zu sein. Nichts Unerwartetes hier, obwohl wir ursprünglich eine Variable kopiert haben, ist die neue immer noch ein separater Wert, völlig unabhängig vom Original. Grundsätzlich können wir den ursprünglichen Hund oder den neuen Hund modifizieren und sie werden sich nicht gegenseitig beeinflussen. Dies ist das Verhalten von Primitiven. Die Variable zeigt auf den tatsächlich gespeicherten Wert. Das Speichern von Objekttypen verhält sich unterschiedlich. Lassen Sie uns ein Beispiel mit einem Objekt machen , das wir genauso kopieren können, wie wir es hier getan haben. Zunächst erstellen wir unsere Variable namens Laptop 1 und setzen diese auf ein Objekt, das natürlich ein Objekttyp ist. Die Eigenschaften oder Marken und die darin enthaltenen Daten spielen keine Rolle. Das Modell hat einen beliebigen Wert als String festgelegt, und dann direkt darunter erstellen wir eine Kopie davon, genau wie wir es mit unserem NewDog getan haben. Dieser wird Laptop 2 genannt, was dem Laptop 1 entspricht. die gleiche Weise, wie wir es ganz oben mit unseren Primitiven gemacht haben, aktualisieren oder weisen wir unseren Laptop 2 erneut zu, dann fügen wir eine neue Eigenschaft hinzu, z. B. die Größe. Diesmal ist für die Konsolenprotokolle der erste Laptop 1. Ich werde auch sehen, wie hoch der Wert von Laptop 2 ist. Teste das aus. Aktualisieren. Wir werden sehen, dass diese beiden Werte genau gleich sind. Dies mag sehr seltsam erscheinen, da wir die Eigenschaft size sowohl auf Laptop 1 als auch auf Laptop 2 haben, obwohl wir dies nur zu unserer zweiten Variablen hinzugefügt haben. Das bedeutet, dass dies eine Verbindung zwischen Laptop eins und Laptop 2 zu sein scheint . Als wir unsere Variablen erstellt haben, die in einem Primitiv direkt darüber mit einer Zeichenfolge gespeichert sind, zeigt die Variable auf den tatsächlichen eindeutigen Wert, der im Speicher gespeichert ist, und dies sind alles eindeutige Werte. Wenn wir jedoch eine Variable erstellen, die einen Objekttyp enthält, wird das Objekt immer noch im Speicher gespeichert. Diese Variablen, wie Laptop 2, enthalten jedoch einen Verweis auf die Position dieses Objekts nicht auf den tatsächlichen Wert, daher den Referenztyp des Namens. Hier erstellen wir unseren ursprünglichen Laptop, und jedes Mal, wenn wir eine Kopie wie Laptop 2 erstellen, zeigt alles auf dasselbe Originalobjekt. Da alle Kopien auf denselben Wert verweisen, wird daher auch das Original aktualisiert, wenn Sie eine von ihnen ändern , z. B. hier. Einige andere Sprachen erlauben es uns, dieses Verhalten zu ändern. Aber mit JavaScript ist es behoben. Genau als eine kurze Zusammenfassung und klären Sie vielleicht, ob Sie sich nicht sicher sind. Wenn wir eine Variable erstellen, die in einem Primitiv gespeichert werden soll , z. B. eine Zeichenfolge, zeigt die Variable auf einen tatsächlichen eindeutigen Wert, der im Speicher gespeichert ist, was bedeutet, dass unser Hund und auch unser NewDog vollständig sind einzigartige und unabhängige Werte. Wenn wir jedoch einen neuen Objekttyp basierend auf einem Originalobjekt erstellen , enthält die kopierte Version einen Verweis auf die Position des ursprünglichen Objekts im Speicher, daher den Namenreferenztyp. Dies ist etwas, das Sie wahrscheinlich nicht allzu sehr interessieren, bis wir vielleicht auf ein Problem stoßen , bei dem Sie ein Objekt ändern und sich alle unerwartet ändern und Sie nicht wissen, was verursacht das Problem. In diesem Sinne werden wir als Nächstes behandeln, wie wir zwei Objekte vergleichen können. 23. Objekte vergleichen: Was wir im vorherigen Video gelernt haben , ist , dass ein primitiver Wert eindeutig ist und durch einen Wert gespeichert wird und ein Objekttyp als Referenz gespeichert wird. Dies wird uns jetzt helfen, das Verhalten, das wir beim Vergleich zweier Objekte sehen werden, besser zu verstehen zu . In unseren Starterdateien haben wir zwei ähnliche Objekte mit den gleichen Eigenschaften. Sie haben beide die Marke und auch das Modell und auch die gleichen Werte. Wir werden diese verwenden, um Qualität zu vergleichen. Aus vernünftiger Vermutung würde man denken, dass sie, wenn wir beide vergleichen, als echtes Match angesehen werden. Dies wäre eine faire Annahme, da beide die gleiche Marke und auch das gleiche Modell haben . in die Konsole springen, wenn wir einen Vergleich mit Primitiven machen, ist das ziemlich einfach. Wenn 1 gleich 1 ist, würde dies den Wert „true“ zurückgeben. Dies ist einfach, da Primitive ihren eigenen eindeutigen Wert im Speicher gespeichert haben . Vergleich von Werten funktioniert wie erwartet. Objekte sind jedoch etwas weniger offensichtlich. Wie zu erwarten ist, führt der Vergleich desselben Objekts wie dieses zu „true“. Laptop 1, wenn wir das mit sich selbst vergleichen, nämlich Laptop 1, ist dies auch der Fall. Aber wenn wir Laptop 1 so ändern, dass er dem Laptop 2 entspricht, obwohl diese beide die gleiche Marke und dasselbe Modell haben, erhalten wir den Wert falsch zurück. Obwohl diese beiden Objekte genau denselben Inhalt haben , werden sie nicht als gleich angesehen. Der Grund dafür ist, dass es sich um Referenztypen handelt. Denken Sie daran, dass eine Variable des Referenztyps auf eine Position im Speicher zeigt, nicht auf den tatsächlichen Wert. Hier vergleichen wir den Inhalt dieser beiden Objekte nicht wirklich . Stattdessen vergleichen wir zwei verschiedene Speicherorte. diesem Grund ist der Vergleich falsch. Ich weiß, dass das etwas verwirrend erscheinen kann, aber so funktioniert JavaScript. wir zu dem zurückkehren, was wir im vorherigen Video angeschaut haben, was glauben Sie, wenn wir ein Objekt kopiert haben? Zum Beispiel, wenn wir die Konstante mit Laptop 3 einstellen und diese auf Laptop 1 einstellen. Nun, lass uns das ausprobieren. Wir können prüfen, ob der Laptop Nummer 1 dem Laptop 3 entspricht. Denken Sie daran, hier erstellen wir eine Kopie und dies führt zu einem Wert von true. Nun, dieser kommt wieder wahr, denn als wir Laptop 3 erstellt haben, haben wir den Inhalt von Laptop 1 nicht kopiert. Stattdessen zeigt Laptop 3 jetzt auf unseren ursprünglichen Laptop 1 Speicherort im Speicher. Unabhängig davon, wie alle diese Variablen hinter den Kulissen gespeichert werden, benötigen wir möglicherweise noch eine Möglichkeit, die Eigenschaften zweier Objekte zu vergleichen . Wir brauchen eine Möglichkeit, Laptop 1 mit Laptop 2 zu vergleichen, was wahr sein wird. Eine Möglichkeit, dies zu tun, besteht darin, eine JSON-Methode namens stringify zu verwenden . Wir werden uns mehr mit JSON-Daten befassen. Stringify ist eine Möglichkeit, ein Objekt in eine Zeichenfolge zu konvertieren , und es sieht so aus. Beim Parsen von JSON, einer Methode namens stringify, werden wir den Wert von Laptop 1 analysieren. Wenn wir dies in der Konsole testen, können wir sehen, dass unser Objekt in eine Zeichenfolge konvertiert wird. Vergleich einer String-Version von Laptop 2 mit einer String-Version von Laptop 2 wird unseren Vergleich erheblich erleichtern. Wir machen das Gleiche. Wir prüfen, ob das gleich json.stringify ist. Dieses Mal analysieren wir den Wert von Laptop 2. Springe in die Konsole. Dies ist gleich wahr, da unsere beiden String-Werte genau gleich sind. Eines der Probleme bei der Verwendung dieser Methode ist jedoch die Eigenschaften in genau der gleichen Reihenfolge sein müssen , damit dies funktioniert. Wenn Laptop 1 und die Marke unsere zweite Eigenschaft sind, würde dies zu Falsch führen. Um dies zu beheben, haben wir ein paar verschiedene Möglichkeiten, dies zu überprüfen. Der erste, der nur wirklich gut ist , um einfache Objekte wie diese zu vergleichen , ist, dass wir eine Funktion namens Check Equality erstellen können, die unsere beiden Objekte manuell überprüfen wird. Wenn wir das aufrufen, analysieren wir Objekt 1 und Objekt 2. Dann geben wir den Wert von if object 1 zurück. Die Marke ist gleich Objekt 2. Das ist unser erster Vergleich. Danach möchten wir auch prüfen, ob das Modell auch gleich ist. Das doppelte kaufmännische Und-Zeichen, prüfen Sie, ob object1.model gleich object2.model ist. Das ist ein langer Weg. Es ist eine manuelle Art Dinge zu tun, aber es würde funktionieren. Wir können dies überprüfen indem wir unsere Check Equality Funktion aufrufen. Unsere beiden Objekte werden Laptop 1 und auch Laptop 2 sein, das sind die beiden, die Sie vergleichen möchten. Um zu sehen, was der Rückgabewert ist, können wir dies in unser Konsolenprotokoll analysieren und aktualisieren. Objekt 1 ist nicht definiert, ich müsste nur sicherstellen, dass diese ein j haben, aktualisieren, und dies ist der Wert von true. Jetzt spielt es keine Rolle , in welcher Richtung sich unsere Immobilien in jedem der Objekte befinden. Wir können immer noch einen einfachen oder manuellen Vergleich von diesen durchführen. Eine andere Möglichkeit besteht darin, Objektmethoden für den Zugriff auf die Schlüssel und Werte zu verwenden . Wir haben uns diese bereits im Looping with Object Video angeschaut . Denken Sie daran, dass wir auf das Objekt zugreifen, ein Kapital O. Wir können dann die Schlüssel wie Modell und Marke oder Laptop 1 so hochgehen Marke oder Laptop 1 . Es gibt Modell und Marke. Wir können das Gleiche auch für object.values tun. Mit diesem Ansatz können wir unsere Funktion zur Überprüfung der Gleichstellung für alle Schlüssel und Werte ändern unsere Funktion zur Überprüfung der Gleichstellung für und prüfen, ob wir eine Übereinstimmung haben. Auf diese Weise bedeutet auch, dass die Reihenfolge der Eigenschaften nicht wichtig ist wie bei der ersten stringify-Methode. Wie Sie sehen können, können Objekttypen eine komplexe Sache sein. Wenn Sie nicht verstehen, wie sie in JavaScript funktionieren, braucht es nur ein bisschen Erfahrung, um sich daran zu gewöhnen. Aber ich erwarte nicht, dass du dich das erste Mal an all das erinnerst. Aber wenn Sie sich solcher Dinge nur bewusst sind, wird Ihnen in Zukunft wirklich helfen , wenn Sie auf objektbezogene Probleme stoßen. 24. Abschnitt Einführung: In Zukunft haben wir ein großartiges Projekt , dem Sie arbeiten können, und das wird Ihnen viel Übung mit dem geben was wir bisher gelernt haben. Dies wird unser Projekt sein , das Speedy Chef heißt. Die ganze Idee ist, dass wir Pizzen kochen, die per Bestellung durchkommen , und versuchen, so viele wie möglich zu erledigen, also mit dem Koch und wir können das Spiel starten, das den Service für die Küche und dann können wir sehen, wie unsere Bestellungen auf der rechten Seite vorbeikommen. Wenn wir anfangen wollen, an einer Bestellung zu arbeiten, klicken wir einfach auf eine und sie zieht sie dann in den Abschnitt Working on, uns sagt, welche Pizzen wir herstellen müssen. Für dieses Beispiel brauchen wir einen Schinken und Ananas und zwei Peperonis. Derzeit fangen wir mit dem Schinken und der Ananas an. Gehen Sie die Schritte der Methode genau hier durch und der erste ist das Rollen des Teigs. Klicken Sie hier an. Wir müssen dann unsere Sauce, Pfeffer, Käse hinzufügen und 12 Stück Schinken hinzufügen. Endlich 12 Stück Ananas und das wird alles in unserer Rubrik hier aktualisiert. Sobald wir fertig sind, können wir dies in den Ofen geben und wenn Sie einen Fehler machen würden, können wir dies auch dem Abfall hinzufügen. Klicken Sie darauf und dann hinter den Kulissen überprüft es auch, um sicherzustellen, dass wir alle richtigen Zutaten haben , die wir für unsere Pizza benötigen. Es gibt einen Schinken und eine Ananas, die in den Ofen gehen. Wir können zu den Peperoni übergehen, und sobald wir damit fertig sind, können wir unsere Bestellung abschließen und mit der nächsten übergehen. Außerdem müssen wir den Überblick behalten , da diese Bestellungen im Laufe der Zeit immer wieder eingehen werden . Dies ist ein einigermaßen großes Projekt im Vergleich zu dem, was wir bisher gebaut haben. Aber das meiste davon wirst du schon wissen. Es geht nur darum, ein kleines Feature nach dem anderen zu erstellen , und es wird Ihnen vollkommen gut gehen. Auf dem Weg dorthin gebe ich Ihnen eine Reihe von Aufgaben, um Dinge selbst auszuprobieren, aber keine Sorge, Sie sind nicht auf sich allein gestellt. Ich werde auch jede Phase durchlaufen, damit wir wie immer vergleichen und uns daran erinnern können , dass es mehrere Möglichkeiten gibt, Dinge anzugehen. Wenn wir beide verschiedene Lösungen entwickeln, die beide funktionieren, ist das in Ordnung. In den Starterdateien haben wir einen Basisstarter mit unserer Indexseite, der das gesamte ursprüngliche Layout hinzufügt, das wir benötigen. Wir haben auch etwas Styling in unseren Stylesheets und das bedeutet nur, dass wir direkt in unser JavaScript einsteigen und uns darauf konzentrieren können. Obwohl es genauso aussieht wie das Abschlussprojekt, funktioniert noch nichts und wir werden das alles während des Unterrichts codieren. Als Starter habe ich auch die pizza.svg und auch eine JavaScript-Datei eingefügt und auch eine JavaScript-Datei eingefügt , die auf unserer Indexseite verlinkt ist, die drei Arrays enthält. Diese drei Strahlen werden uns viel Tippen ersparen. Zuerst ist ein Pizza-Array und hier haben wir verschiedene Pizza-Objekte mit dem Pizza-Namen, eine Methode zur Herstellung dieser Pizza und auch die erforderlichen Schritte, die wir im Projekt verwenden, um zu überprüfen ob der Küchenchef machte die richtige Pizza und legte die Zutaten auch in der richtigen Reihenfolge auf. Dann kurz darunter ein paar Musterbestellungen, um das Spiel in Gang zu bringen und wir werden diese auch dynamisch generieren. Endlich eine Liste von Zutaten, wir in der Küche benötigen. Großartig, also ist das alles jetzt bereit zu gehen. Öffnen Sie diesen Projektordner im Browser und springen Sie dann in die nächste Lektion, in der wir daran arbeiten diese Bestellungen im Browser aufzulisten. 25. Aufträge: Dieses Video hat nur ein Hauptziel und dies besteht darin, alle Bestellungen zu durchlaufen und im Browser anzuzeigen. Denken Sie daran, dass direkt oben, mit diesem Ordner zur Verfügung gestellt wird , das älteste Array ist, das wir im Browser durchlaufen und anzeigen werden . Der Standort dafür wird auf der rechten Seite im Seitenbereich vorbei sein auf der rechten Seite im Seitenbereich vorbei . Auf der Indexseite haben wir zwei Hauptabschnitte. Wir haben diesen Hauptwrapper und dieser enthält den gesamten Inhalt, der den weißen Hintergrund hat. Dann beiseite mit der Idee der Befehle. Im Moment hat dies nur eine Überschrift der Stufe 3. Aber was wir tun werden, ist, all diese Bestellungen zu durchlaufen und diese in diesen Abschnitt zu platzieren. Um dies zu tun, erstellen wir eine Funktion namens CreateOrdersList. Diese Funktion wird das obige Orders-Array durchlaufen . Für jedes dieser Elemente im Array erstellen wir ein div, das genau wie in diesem Abschnitt aussieht. Bestimmte Teile davon werden dynamisch sein. Zum Beispiel haben wir die Bestellnummer. Dies wird dynamisch sein, zusammen mit dem Namen der Pizza und auch der Menge für jede Zeile. Sie müssen sich über diese Kommentare keine Sorgen machen. Dies sind nur ein visueller Leitfaden, der uns eine Vorstellung davon gibt, was wir tun werden. Wir beginnen unten, indem wir unsere Funktion erstellen. Die Funktion heißt CreateOrdersList , das Funktionsschlüsselwort. Die nächste Sache ist, jeden dieser Bestellungen zu durchlaufen. Wir wissen, wie das geht. Wir können eine Schleife wie forEach verwenden. Schnappen Sie sich unser Auftragsarray forEach. Denken Sie daran, dass forEach für jedes Element in unserem Array eine Funktion ausführen wird . Orte funktionieren direkt im Inneren. Wir geben jedem dieser Artikel den Wert der Bestellung. Jetzt müssen wir unsere Elemente im Grunde wie oben für jede dieser Bestellungen konstruieren unsere Elemente im Grunde wie . Wir beginnen damit, diesen Haupt-Wrapper zu erstellen, der das div ist. Wir fügen eine Klasse mit dem Namen Order Wrapper hinzu. Wir werden uns im Inneren an unseren Inhalten arbeiten . Wir wissen, wie man Elemente schafft. Wir verwenden document.createElements. Wie im Tag-Namen der Elemente , der ein div innerhalb einer Variablen oder Konstante namens orderwrapper ist. Fügen Sie dann unseren Klassennamen hinzu, indem Sie den Variablennamen von OrderWrapper auswählen. Die Eigenschaft namens ClassName. Wie wir oben sehen, wird dies Order_Wrapper sein. Also fügen wir einfach einen Kommentar hinzu. Dies ist der Hauptwrapper. Danach fügen wir einen Kommentar hinzu. Dies wird darin bestehen, die Bestellnummer hinzuzufügen. Dies ist unser erster Abschnitt in unserem Order Wrapper. Dies wird eine Stufe 4 unserer Überschrift sein. Bewahren Sie dies in einer Konstante auf. Ich erinnere mich, dass wir beim Erstellen von Elementen wie diesen das eigentliche Element und dann den darin enthaltenen Inhalt erstellen müssen . Wir brauchen also zwei Variablen. Die erste ist OrderNumber L, das ist Regalelemente. Also document.createElements. Wir brauchen ein Level für den Weg. Als nächstes der Text, der hineingehen wird, und dies ist die Bestellnummer. Der konstante Name der Bestellnummer und wir erstellen diesen mit document.createTextNode. Da dies dynamisch sein wird , weil jede Bestellung eine andere Nummer hat, die wir von dieser eindeutigen ID abrufen werden. Wir platzieren dies in die Backticks, um dies dynamisch zu machen. Erstens der Ordnungstext, der gerade hier dieser Teil ist, gefolgt von einem dynamischen Wert. Der dynamische Wert kann mit dem Dollarsymbol und den geschweiften Klammern eingefügt werden . Zuerst wählen wir unsere individuelle Bestellung aus, die in dieser Variablen gespeichert ist, und dann die Eigenschaft von ID. Wie immer haben wir beim Erstellen eines Elements genau wie dieses zwei eigenständige Informationen, die beide zusammenführen müssen. Wir tun dies, indem wir auf das übergeordnete Element zugreifen, nämlich OrderNumberElement.appendChild, wo wir unseren tatsächlichen Inhalt, nämlich die Bestellnummer, übergeben werden . Das lässt uns jetzt mit unserem div zurück, welches der Wrapper ist. Dann unser erstes Element, das unsere Überschrift der Stufe 4 ist, aber wir müssen diese Überschrift immer noch unserem Wrapper hinzufügen. Schnappen Sie sich den Order_Wrapper und dann verwenden wir erneut ApendChild, das unser Bestellnummernelement aufnehmen wird. Wir haben also den ersten Abschnitt gerade hier, und der nächste Teil besteht darin, unsere eigene Bestellliste zu erstellen. Ein kurzer Kommentar, damit wir wissen, was wir hier tun, von toller Pizza UL für jede Bestellung, und der Wrapper dokument.CreateElements. Die Elemente waren eine ungeordnete Liste. Platziert in eine Konstante namens Pizza-Liste. Dies gibt uns jetzt eine ungeordnete Liste, die der Hauptwrapper für alle Pizzen ist. Denken Sie jedoch daran, dass wir mehrere Listenelemente haben können da jede Bestellung möglicherweise mehr als eine Pizza enthält. Da unsere Bestellungen also mehrere Pizzen in einem Array enthalten, müssen wir erneut eine Schleife wie für jeden machen. Um dies zu tun, springen wir wieder in unsere individuelle Bestellung ein. Wir wählen das Array aus, das Pizzen genannt wird. Verwenden Sie die für jede Schleife , um eine Funktion für jeden Gegenstand oder jede Pizza innerhalb des Arrays auszuführen , speichern Sie diese in einer Variablen namens Pizza. Dann können wir damit arbeiten, jeden dieser Elemente zu konstruieren. Jeder dieser Elemente wird ein Listenelement sein. Aber zuerst müssen wir diesen Inhalt im Inneren erstellen. Wir haben die Menge wie eine und dann einen Bindestrich, dann ein Spanelement gefolgt vom Namen jeder dieser Pizzen. Springen Sie in unsere Funktion und für jedes dieser Elemente erstellen wir ein Span-Element, um unseren Titel zu umschließen und diesen in einer Konstante zu speichern. Dies ist die Bestellmenge L, also document.createElements. Elemente werden die Spanne sein und dann die Menge jedes einzelnen dieser Elemente, document.createTextNode. Dieser Abschnitt muss Dynamik sein oder in den Backticks platziert werden. Fügen Sie eine Variable ein. Wir können auf die Menge zugreifen, indem wir zuerst unsere Pizza auswählen. In jeder dieser Pizzen hat, wenn wir uns das Array ansehen, wenn wir uns das Array ansehen, eine Eigenschaft namens quantity. Wir werden bald auch den Namen des Eigentums verwenden. Für diesen ist das pizza.quantity, gefolgt von einem Strich kurz danach. darüber nachdenken, kann es etwas einfacher sein, wenn wir diese Menge einfach in unsere Spanne aufnehmen. Anstatt sie draußen zu haben, legen wir dies vielleicht in ein Element, anstatt es alleine draußen zu haben. Wir tun dies, indem wir auf die Bestellmengenelemente.appendChild zugreifen , das in der Mengenvariablen enthalten ist, gefolgt von unserem PizzaName. Für unseren PizzaName muss dies auch in ein Spanelement und dann den Inhalt darin gewickelt werden . Wir müssen genau das gleiche tun wie oben, wir erstellen eine Konstante namens PizzaNamel document.createelement. Element ist eine Spanne gefolgt von dem PizzaName , den wir mit Text-Knoten erstellen müssen, schnappen Sie sich unsere individuelle Pizza. Wie wir es zuvor gesehen haben, haben wir dann die Menge gefolgt von der name-Eigenschaft. Wir können darauf mit pizza.name zugreifen. Verschmelze diese beiden zusammen. Pizzanamel.appendChild war nicht im Textinhalt enthalten , nämlich PizzaName. Toll, also haben wir hier zwei separate Spannweiten. Wir haben unsere erste Spanne, die unsere individuelle Anzahl oder die Menge an Pizzen einwickelt . Dann eine zweite Spanne, die unseren PizzaName enthält. Beide Elemente müssen zu einem Listenelement zusammengeführt werden. Dann muss das Listenelement unserem Elternteil hinzugefügt werden. Also lasst uns an die Arbeit gehen. Als neuer Kommentar nur um dies klar zu halten. Dieses ist das Erstellen eines Listenelements. Zeigen Sie die Menge und den PizzaName an. Erste Elemente, die in einer Konstante namens PizzaItem, document.createElement gespeichert sind. Dies war ein Listenelement. Wir haben unser umgebendes Listenelement und dann müssen wir unsere beiden Elemente von oben zusammenführen. Die Menge, die diese Variable ist, und auch der PizzaName. Schnappen wir uns unser PizzItem. Da wir mehrere untergeordnete Elemente anhängen, können wir einfach append verwenden , und das ist jetzt unser erstes, welches das Element der Bestellmenge war. Dann das PizzanaMEElement. Wir sind jetzt fast fertig, unser Listenelement wird ohne zwei Inhalte erstellt und jetzt müssen wir diese zu unserer ungeordneten Liste hinzufügen. Ihre Bestellliste wird in der Konstante namens PizzaList gespeichert . Fügen Sie dies direkt unter seiner Liste hinzu. AppendChild war nicht in unserem Pizza-Artikel. Wir sind fast da. Jetzt haben wir unsere Listenelemente zu unserer ungeordneten Liste hinzugefügt. Aber jetzt muss die ungeordnete Liste auch zu unserem Wrapper hinzugefügt werden. Der Wrapper ist hier nur diese Order Wrapper-Variable. Aber wir müssen dies außerhalb unserer Schleife hinzufügen. Stellen Sie sicher, dass wir das Ende unserer Schleife finden. Was ich hier direkt unter dieser Zeile gemacht habe. Wählen Sie die OrderWrapper.appendChild geben Sie unsere Pizzaliste ein. Dies ist jetzt unsere vollständige Bestellung schnell eingeengt. Der nächste Schritt oder der letzte Schritt hierfür besteht darin, dies nun unserer Webseite hinzuzufügen. Wir brauchen die Abschnitte dieser beiden. Dieser Abschnitt ist die Seite. Wir können das mit der Idee von Bestellungen erfassen. direkt unter unserem Bestell-Wrapper, Verwenden Sie Document.QuerySelector direkt unter unserem Bestell-Wrapper, um unsere Bestellungen zu erhalten.AppendChild war nicht in unserem Bestell-Wrapper. Probieren wir das aus, jetzt müssen wir diese Funktion tatsächlich aufrufen, damit sie funktioniert. Schnappen wir uns die Liste der drei Bestellungen, rufen Sie uns unten an und aktualisieren Sie den Browser. Die gute Nachricht ist, dass wir die Bestellungen tatsächlich auf dem Bildschirm sehen können , aber es sieht nicht ganz so aus, wie wir es erwarten. Werfen wir einen Blick in unseren Code und sehen, was wir ändern müssen. Wir vermissen derzeit die Menge vor dem eigentlichen PizzaName, bei dem es sich um diesen Listeneintrag handelt. Wir fügen die Bestellnummer hinzu. Ich denke, das muss nur die Bestellmenge sein. Das sieht viel besser aus, jetzt haben wir die Bestellnummer ganz oben, jede davon ist in der Reihenfolge, gefolgt vom Namen und der Menge jedes einzelnen der Pizzen in der Bestellung. Wie Sie sehen können, ist dies eine ziemlich lange Funktion, und idealerweise möchten wir dies in kleinere, fokussiertere Stücke umgestalten , und das werden wir als nächstes tun. 26. Auflistung von Bestellungen Refactor: Während wir unseren Code schreiben und insbesondere wenn unser Projekt wächst. Wir möchten unseren Code, wo möglich, regelmäßig umgestalten. Im Moment funktioniert unser Code völlig einwandfrei. Darauf möchten wir uns zunächst konzentrieren, aber es ist auch wichtig, die Dinge regelmäßig zu betrachten und zu sehen, ob wir die Dinge verbessern können. In diesem Video werden wir diese eine einzige Funktion, die Sie haben, umgestalten. Zerlegen Sie es wenn möglich in kleinere. Es ist eine gute Idee, kleinere Funktionen zu haben, die sich auf einzelne Aufgaben konzentrieren , und dies hilft bei der Lesbarkeit und dem Debuggen. So wie Sie sich nähern, liegt es an Ihnen und oft persönlichen Vorlieben. Aber je näher wir eine Funktion erreichen können , um dies in einer einzigen Aufgabe zu tun, desto besser. Der erste Schritt, den wir unternehmen werden , besteht darin, den gesamten Auftragserstellungsprozess aus dieser Funktion zu entfernen den gesamten Auftragserstellungsprozess aus und in eine eigenständige Funktion zu platzieren. Wir nehmen alle Inhalte heraus, die zum Erstellen unserer Bestellung verwendet werden, und lassen unsere Funktion „ CreateOrdersList “ mit einer einfachen Aufgabe zurück. Diese Aufgabe besteht darin, das gesamte Orders-Array zu durchlaufen und sie dann zum Seitenabschnitt hinzuzufügen. Erstellen Sie dazu direkt oben eine neue Funktion. Dieser wird auf „CreateSingleOrder“ aufgerufen . Da diese Funktion für jede Reihenfolge innerhalb des Arrays wiederholt wird , nehmen wir auch die Reihenfolge als Variable an, die sich nach unten bewegt und in unsere Funktion springen. Beginnend mit „OrderWrapper“ innerhalb der Schleife, lassen Sie den gesamten Inhalt von hier ab, genau dorthin, wo wir dies zu unserem „OrderWrapper“ hinzufügen . Schneide das aus und wir sollten einfach mit unserer Schleife übrig bleiben. Dann der Abschnitt, in dem wir dies zur Seite hinzufügen . Jetzt ist das Cut-Out. Springe in unsere „CreateSingleOrder“ und füge das ein. Nun, wenn wir in unsere Schleife springen , wo wir diesen Code einfach herausschneiden. Wir können diese „ Stand-alone-Funktion“ nennen , die „CreateSingleOrder“ genannt wurde. „CreateSingleOrder“ muss auch die Reihenfolge übernehmen , da wir sie gerade hier weitergeben, die dann im Rest unserer Funktion verwendet wird. Wenn Sie jetzt darüber nachdenken, ist dies einfach keine Funktion aufrufen. Es macht eigentlich nichts damit. Alles, was wir tun müssen, ist, dass wir die Bestellung von dieser obigen Funktion zurückgeben, diese innerhalb einer Variablen speichern und diese dann zum DOM hinzufügen können. Zuerst holen wir uns unseren OrderWrapper , der den vollständigen Bestellabschnitt ist, und geben diesen von unserer Funktion zurück. Dieser Rückgabewert kann dann innerhalb einer Variablen namens „SingleOrder“ gespeichert werden . SingleOrder kann jetzt zu unserer Seitenleiste hinzugefügt werden. Probieren wir das aus, „Speichern“ und „Refresh“, und alles funktioniert immer noch wie zuvor, aber diese Funktion ist immer noch ziemlich lang. Wir können auch die Größe dieser beiden reduzieren. Wie Sie dies aufschlüsseln, hängt wiederum persönlichen Vorlieben ab. Aber was ich tun werde, ist, die Kreation „PizzaList“ in eine neue Funktion auszulagern die Kreation „PizzaList“ eine neue Funktion auszulagern , die auch in Zukunft genutzt werden könnte. Die PizzaList-Sektion ist diese Schleife. Wir müssen auch die eine Bestellliste aufrufen , in der wir diese speichern, also kopiere diese und auch die Schleife. Dann erstelle unsere Funktion und direkt oben „CreateListofPizzas“ genannt. Ich wollte nur die Pizzen mitnehmen . Dann „Einfügen“ in unserer neuen Rubrik. Stellen Sie einfach sicher, dass der richtige Abschnitt darin eingefügt wird, was unsere ungeordnete Liste ist, gefolgt von unseren vier jeder Schleife. In nur einem Moment, in dem wir diese Funktion tatsächlich aufrufen können. Denken Sie daran , dass dies alle unsere Pizzen aufnehmen wird, damit wir diesen Bestellabschnitt nicht benötigen. Wir können unsere Pizzen direkt anrufen und es ist variabel. Jetzt können wir diese Funktion von dem Ort aus aufrufen , an dem wir diesen Code gerade ausgeschnitten haben. Der Funktionsname war „createListofPizzas“. Dies müssen alle Pizzen für diese Bestellung weitergegeben werden, die wir zuerst aus unserer Bestellung entnehmen können und jede Bestellung hat das Eigentum von Pizzen. Genau wie unten müssen wir dies innerhalb einer Variablen speichern und auch etwas für unsere Funktion zurückgeben. Das, was wir am Ende zurückkehren müssen , ist unser „Pizzalist“. Der zurückgegebene Wert kann dann innerhalb einer Konstante gespeichert werden . Wenn wir diese Konstante „PizzaList“ nennen. Es passt auch gut unserem Variablennamen , den wir zuvor verwendet haben der dann zu unserem „OrderWrapper“ hinzugefügt wird. Geben Sie dies „Speichern“ und probieren Sie dies aus, „Aktualisieren“ und alle Bestellungen funktionieren immer noch wie erwartet. Refactoring-Funktionen wie diese sind möglicherweise nicht immer für Sie und Sie können entscheiden, wie weit Sie gehen möchten. In Bezug auf die Funktionsweise des Projekts ändert sich nichts . Wir sehen immer noch nur die Bestellungen auf dem Bildschirm, aber jetzt haben wir drei klare Funktionen mit einer bestimmten Aufgabe. Wir haben ganz oben „CreateListofPizzas“, das von dieser Funktion zurückgegeben wird. Diese Liste von Pizzen wird dann dem DOM hinzugefügt, wenn wir unsere einzelne Bestellung erstellen , und eine „SingleOrder“ wird dann in unserer letzten Funktion überlaufen und dann zum DOM hinzugefügt. 27. Element Helper Funktion: Ein weiterer Refaktor, den wir tun können, um uns viel Code zu sparen , besteht darin, sich anzusehen, was wir derzeit in unseren Funktionen wiederholen, und zu sehen, ob es eine Möglichkeit gibt , ihn stattdessen in eine wiederverwendbare Funktion auszulagern. Wenn wir uns unseren Code in diesem frühen Stadium ansehen, gehen wir zur CreateListofPizzas Funktion. Wir haben bereits einige Dinge, die wir gerade wiederholen. Wir wiederholen, diese Elemente in unseren drei Schritten zu erstellen . Ist Teil der Menge. Wir erstellen ein Span-Element. Wir erstellen den TextNode, und dann führen wir diese beiden zusammen. Wir machen das Gleiche für unseren PizzaName. Wir schaffen ein Element. Wir erstellen einen TextNode für den Inhalt , führen sie zusammen und gehen etwas weiter zu CreateSingleOrder. Wir machen auch etwas Ähnliches, gerade hier erstellen wir unser Textelement, das sich in einem Wrapper der Stufe 4 befindet. Wir erstellen die Inhalte und fügen diese dann zusammen, und das ist alles völlig in Ordnung. Dies ist etwas , was wir tun müssen, um unsere Elemente zu schaffen. Für jedes Mal, wenn wir in einer dieser Funktionen ein neues Element erstellen , handelt es sich um einen dreiteiligen Prozess, der drei Codezeilen verwendet wird. Es wäre schön, eine Hilfsfunktion zu erstellen um die Codemenge zu reduzieren, und dies wird die Aufgabe für dieses Video sein. Wir erstellen eine Hilfsfunktion, die den Namen des Elements aufnimmt. Dies ist der Abschnitt „ Elemente erstellen“. Sie nehmen den Inhalt auf, den TextNode ist, werden sie zusammenführen, was normalerweise unsere dritte Zeile ist, und dann geben wir dieses neue Element an alle Aufrufe unserer Funktion zurück . Lasst uns an die Arbeit gehen. Erstellen Sie eine neue Funktion , die bei diesem Namen BuildeLement helfen wird. BuildeElement muss auch zwei Dinge in sich nehmen. Es muss den Namen der Elemente wie das h4 und auch den Inhalt aufnehmen , der hineingeht. Wird dies übergeben, wenn wir diese Funktion aufrufen, und die erste wird der ElementName sein und der zweite ist der ElementContent. Innerhalb der Funktion wird es ziemlich vertraut sein , was wir bereits getan haben, und tatsächlich können wir eines dieser Beispiele kopieren. CreateSingleOrder lösen. Habe alle drei Codezeilen, in denen wir das Element erstellen, wir erstellen den Inhalt und wir führen diese zusammen. Wenn Sie möchten, können wir alle drei Zeilen kopieren und einfügen. Dann müssen wir das ein bisschen generischer machen. Beginnend mit der ersten Konstante. Dies ist für das Element. Die zweite ist für den Inhalt, und dann können wir innerhalb dieser beiden Klammern die Daten übergeben, die an alle Funktionen übergeben werden. Der erste ist für den ElementName und der zweite, den wir entfernen können, was wir derzeit haben, in ElementContent platzieren. Ändern Sie die Variablennamen. Dieser wird element.appendChild den Inhalt an dieses Element übergeben. Das letzte, was wir tun müssen, ist, dass wir derzeit ein Element schaffen. Wir müssen dies auch von unserer Funktion zurückgeben, darauf kann innerhalb unseres Codes zugegriffen werden. Gibt die vollständigen Elemente zurück, nachdem sie zusammengeführt wurden, und diese Funktion kann jetzt eine dieser drei Codezeilen ersetzen , die ein Element erstellt. Wenn wir unseren Funktionsnamen und auch die Klammern mit dem Inhalt abrufen, können wir jetzt einen dieser Abschnitte direkt oben ersetzen. Wir beginnen mit CreateSingleOrder, für alle Bestellnummernelemente, die Bestellnummer und dann die dritte Zeile und dann die dritte Zeile, die beide zusammenführt. Ich ersetze das durch unsere Funktion ElementName. Das ist ein h4. Für den Inhalt können wir dies durch genau denselben Inhalt ersetzen , den wir oben verwendet haben. Schnapp dir das und klebe das hinein. Halten Sie unsere Benennung konsistent, da wir derzeit eine Konstante namens OrderNumberel verwenden und wir darauf direkt unten zugreifen, müssen diese auch innerhalb einer Konstante mit demselben Namen speichern . was hier passiert ist, dass wir unsere Elemente in unserer neuen Funktion aufbauen. Wir geben dies dann von der Funktion zurück, die dann in dieser Konstante gespeichert wird, die wir dann im Rest unseres Codes verwenden können , sie direkt darunter. Wenn Sie möchten, können wir die freien vorhandenen Codezeilen entfernen , und dann können wir zu unserer ersten Funktion aufsteigen , die CreateListofPizzas ist. Wir haben alle drei Zeilen gerade hier. Ich werde das kommentieren, damit wir es als Referenz verwenden können. Wir müssen unsere BuildeLement-Funktion übergeben und unsere beiden Werte übergeben. Der erste Wert ist unsere Spanne. Der zweite kopiert unser Vorlagenliteral . Jetzt ist das drin. Auch dafür unten haben wir den ursprünglichen Konstantennamen des OrderQuantity Elements verwendet . Wir können dies kopieren und im Rückgabewert speichern . Entfernen Sie diese drei Zeilen, wenn Sie möchten. Als nächstes der PizzaName. Diese drei Zeilen aus. Wir erstellen unsere Konstante, die den gleichen Namen wie PizzanaMeel ist . Order-Funktion ist auch ein Span-Element, und der Inhalt ist pizza.name. Entferne diese. Beide sind gleich, wir müssen uns nur ändern, ist vorbei. Dieser sollte der PizzanaMeel sein. Wir bringen das hier rüber. Gut. Jetzt speichern wir dies und weiter im Browser und wir können es testen. Alles funktioniert immer noch gut. wir in die Konsole springen, sehen wir hier keine Fehler. Unsere Seitenleiste hat unsere generierten Bestellungen auf der rechten Seite. Wir haben die Bestellnummern, wir haben die Pizza-Namen und auch die Mengen. Das scheint jetzt alles immer noch gut zu funktionieren, und hoffentlich können Sie die Vorteile sehen , wenn Sie solche Dinge tun. Obwohl unsere Funktion ein paar Codezeilen benötigt hat, jedes neue Element, das wir erstellen reduziert jedes neue Element, das wir erstellen, drei Codezeilen in eine. Wir können dies auch in Zukunft während unseres Projekts viele Male nutzen , um noch mehr Code zu speichern. Es geht nicht nur um Lesbarkeit und Organisation. Eine einzelne Zeile wie diese bedeutet weniger Chancen auf Tippfehler und auch eine Erhöhung der Geschwindigkeit, wenn unser Programm wächst. 28. Auswahl Der Aktuellen Reihenfolge: Wir haben einige Befehle auf der rechten Seite, um uns in Schwung zu bringen, und bald werden wir auch nach dem Zufallsprinzip neue erstellen. Kurz bevor wir damit fortfahren, möchte ich Ihnen zeigen, wie die Dinge funktionieren , damit Sie sich vorstellen können, was wir tun werden. Sobald das Spiel begonnen hat, werden unsere Befehle eingehen und auf der rechten Seite angezeigt werden. Der Koch, der der Spieler ist, klickt dann auf eine Bestellung, um mit der Arbeit zu beginnen, die diese Reihenfolge dann in den Bereich Working on verschiebt . Auf diesen Abschnitt werden wir uns jetzt konzentrieren. Später werden wir dann noch weiter gehen, indem im Abschnitt Arbeit auf eine bestimmte Pizza klicken. Dann zeigt dies die Methode an und stellt sie auch als die derzeit an Pizza in der Küche arbeitende. Jetzt können wir uns einfach darauf konzentrieren, auf eine Bestellung zu klicken und sie in den Abschnitt Working on zu verschieben. Wie Sie vielleicht vermutet haben, erstellen wir dazu eine neue Funktion direkt über unserer Auftragsliste erstellen. Es ist eine neue Funktion namens SelectCurrentOrder. Um diese Funktion aufzurufen, müssen wir auf einen Klick auf eine dieser Bestellungen achten . Um dies zu tun, müssen wir zu unserer CreateSingleOrder-Funktion aufsteigen . Wenn wir nach diesem Abschnitt suchen, müssen wir jeder dieser Bestellungen einen Event-Listener hinzufügen . Wir können darauf klicken und diese bestimmte Reihenfolge dann in den richtigen Abschnitt verschieben . Gleich darunter, wo wir diese Klasse hinzufügen. Schnappen Sie sich den Order Wrapper, der das div ist, das jede dieser Bestellungen umgibt. Fügen Sie einen Ereignis-Listener hinzu. Das hört jetzt auf einen Klick, der unsere neue Funktion namens SelectCurrentOrder auslöst , gibt uns den Test durch ein Konsolenprotokoll innerhalb unserer neuen Funktion. Geben Sie die Ereignisinformationen ein, damit wir die richtigen Elemente erhalten , auf die geklickt wird. Dann protokollieren wir das mit e.target. Schauen wir uns das in der Konsole an. Jetzt müssen wir auf eine unserer Bestellungen klicken. Du siehst die Margherita. Wir sehen den Schinken und die Ananas. Das ist nicht genau das , was wir wollen. Wir können auf eine der Bestellnummern klicken, die im Inhalt enthalten sind. Aber was wir tun möchten, ist, den gesamten Bestellabschnitt aktiv zu machen , sodass es sich nur um einen einzigen anklickbaren Bereich handelt. Verstehen Sie das besser, springen wir in die Registerkarte „Elemente“ und werfen Sie einen Blick darauf. Jetzt springen wir in den Seitenbereich, der unsere Bestellungen enthält , und klicken auf einen dieser Divs mit der Klasse des Order Wrapper. Was wir wollen, ist, dass wir nur mit der Klasse des Order Wrapper auf dieses Div klicken und alle Klicks ignorieren können mit der Klasse des Order Wrapper auf dieses Div klicken und alle Klicks ignorieren , die sich auf den verschachtelten Elementen befinden. Eine Möglichkeit, dies zu tun, besteht darin, jetzt auf eines dieser verschachtelten Elemente zu klicken , z. B. die Listenelemente oder die Überschrift Ebene vier. Klettern Sie dann den Elementbaum hoch, bis er das erste div mit der Klasse des Order Wrapper findet. Um dies zu tun, können wir genau darauf achten , auf welches Element geklickt wurde, z. B. die ungeordnete Liste. Dann können wir die Kette weiter hochklettern, um zu überprüfen, ob das übergeordnete Element dieser Order Wrapper ist. Es gibt ein paar verschiedene Möglichkeiten, dies zu tun. Wir könnten einen Verweis darauf speichern auf das untergeordnete Element geklickt wurde, z. B. unsere ungeordnete Liste. Dann können wir in dieser Schleife weiter prüfen, ob das übergeordnete Element dieser Order-Wrapper ist. Oder eine einfache Möglichkeit besteht darin, eine Elementmethode zu verwenden , die als nächstes bezeichnet wird. Die nächstgelegene Methode nimmt ein Element wie das Element an, auf das wir klicken. Dann klettert es durch alle übergeordneten Knoten weiter zum Dokumentstamm zum Dokumentstamm bis es eine Selektorübereinstimmung erreicht. Der Selektor kann eine Klasse, eine ID, ein Elementname sein. Genau wie wir es mit dem Abfrageselektor tun können. Werfen wir einen Blick darauf, wie das innerhalb unserer Funktion gemacht wird. Zuerst beginnen wir einen Verweis auf unsere Elemente, auf die geklickt wird, nämlich e.target. Dann finden wir die nächstgelegenen übergeordneten Elemente mit dieser Klasse von Order Wrapper. Wir können dies tun, indem wir auf das Element zugreifen , auf das geklickt wird, die Methode namens „am nächsten“ aufrufen. Nun, wir geben die Anfrage weiter , nach der wir suchen. In unserem Fall wollen wir nach dem order_wrapper suchen. Da dies eine Klasse ist, fügen wir den Punkt als Präfix hinzu. Dies innerhalb einer Konstante namens OrderWrapper. Dann können wir das überprüfen, indem dies an der Konsole protokollieren. Wenn wir uns jetzt aktualisieren und versuchen können, auf eine dieser Bestellungen zu klicken. Stellen Sie sicher, dass die Registerkarte „Konsole“ ausgewählt ist. Wenn wir versuchen, draußen etwas anzuklicken, sehen wir nichts in der Konsole, was vom Pizza-Titel erwartet wird . Dies kehrt zurück in Richtung des Bestellungswrapper der Eltern. Wir können dies öffnen und überprüfen, ob es sich um Bestellung 1 handelt. Versuchen wir es mit einem anderen. Dies ist Order 3 und auch Order 2. Gut also jetzt, unabhängig davon , auf welchen Teil der Bestellung wir klicken, es klettert immer zum Bestellverpacker der Eltern, um den vollen Inhalt dieser Bestellung zu erhalten. Wenn mit dieser Methode keine Übereinstimmungen gefunden werden, erhalten wir den Wert null zurück . Wir können dies auch prüfen, bevor unsere Bestellung in den Abschnitt Working on aufnehmen. unterhalb der Stelle, an der wir unseren Order Wrapper auswählen, Fügen Sie unterhalb der Stelle, an der wir unseren Order Wrapper auswählen, eine if-Anweisung hinzu, an die wir unseren Order Wrapper übergeben, wir können prüfen, ob dies nicht gleich null ist. Wenn wir erfolgreich auf einen Order Wrapper geklickt haben, müssen wir uns jetzt diesen Order Wrapper holen und ihn in unseren Abschnitt „ Arbeiten an“ verschieben. Schritt 1 besteht darin, einen Working on Abschnitt zu greifen und diesen in einer Konstante namens OrderDiv zu speichern. Das ist gleich dem Dokument. QuerySelector und der Abfrageselektor, an dem wir brauchen, um zu arbeiten. Dann können wir mit append child unseren Bestell-Wrapper hinzufügen. Das OrderDiv. AppendChild übergibt unseren Order Wrapper , auf den geklickt wurde. Toll lasst uns das mal ausprobieren. Wir können die Konsole schließen und eine dieser Bestellungen ausprobieren. Versuchen wir Nummer 3 und dies erscheint jetzt in den Abschnitten, da wir dies als untergeordnete Elemente Order 2, Ordnung 1 angehängt haben dies als untergeordnete Elemente Order 2, Ordnung 1 angehängt , und das alles funktioniert großartig. Wir möchten jedoch nur an einer einzigen Bestellung gleichzeitig arbeiten können . Wir brauchen eine Möglichkeit zu prüfen, ob nur eine einzelne Bestellung ausgewählt und in diesem div platziert wird. Eine Möglichkeit, dies zu tun, besteht darin, zuerst auf den Abschnitt Working on zuzugreifen , und wir können überprüfen welche untergeordneten Elemente darin verschachtelt sind. Sehen Sie, es ist besser, wir werden einen Verweis auf unser div nehmen , platzieren Sie dies in einem Konsolenprotokoll. Dann können wir uns am Ende verketten.children . Springe in die Konsole. Klicken Sie auf eine unserer Bestellungen , um dies dem Abschnitt hinzuzufügen. Wenn wir genau hinschauen, ist das erste, was wir haben eine HTML-Sammlung mit einer Überschrift der Stufe 3. Danach haben wir unser div mit der Klasse des Order Wrapper, die wir gerade hinzugefügt haben. Wir können dies auch bestätigen, wenn wir zu unserer Indexseite gehen, die an dem Abschnitt arbeitet, nur eine einzige Überschrift der Ebene 3 hat. In diesem Sinne kann die Anzahl der untergeordneten Elemente jetzt verwendet werden, um die Funktion zu stoppen. Wenn die Anzahl der untergeordneten Elemente größer als eins ist dh wir haben unsere Überschrift Level 3 gefolgt von einer unserer Bestellungen, können wir dies in unserer Funktion „Aktuelle Bestellung auswählen“ zurücktun. Entfernen Sie das Konsolenprotokoll ersetzen Sie es durch eine if-Anweisung. Wir können prüfen, ob die Kinder sind. Länge ist größer als eins. Wenn ja, kehren wir einfach zurück ändern diese Funktion. Wir können auch die gebogenen Klammern entfernen und durch unsere Rückgabeerklärung ersetzen. Probieren wir das mal aus. Speichern und aktualisieren. Ich klicke auf die erste Bestellung das funktioniert gut. Jetzt können wir keine weiteren Bestellungen hinzufügen. Das letzte, was zu tun ist, dass wir die Reihenfolge in den Abschnitt Working on übergehen möchten die Reihenfolge in den Abschnitt Working on übergehen , besteht darin, auch den Ereignis-Listener zu entfernen. Wir brauchen diesen Abschnitt nicht mehr, um anklickbar zu sein, daher können wir diesen aus unserem Bestellwickler entfernen. Wir können dies tun, kurz bevor wir dies zu unserem div-Bereich hinzufügen. Durch den Zugriff auf die Elemente , die im Order Wrapper namens removeEventListener gespeichert sind. Der Listener, den wir entfernen möchten, die Klickereignisse gefolgt von SelectCurrentOrder, die mit unserem Ereignis-Listener übereinstimmen. möglich sollten Ereignis-Listener wie dieser entfernt werden, wenn sie nicht mehr benötigt werden. Es hilft, die Leistung aufrechtzuerhalten, da der Browser keine unnötige Aufgabe mehr erledigen muss, sondern auch unerwartetes Verhalten eliminiert. Als nächstes behandeln wir die Auswahl der Pizza, an der wir in der Küche arbeiten werden . 29. Stellen Sie Die Aktuelle Pizza: Schauen Sie sich den Ablauf unseres Projekts an, wir haben bereits den ersten Schritt gemacht, der darin bestand, die ausgewählte Reihenfolge, auf die wir klicken, in den Abschnitt „Bestellung“ in den Abschnitt Arbeiten an zu verschieben . Als nächstes müssen wir in der Lage sein, die Pizza auszuwählen , an der gearbeitet werden soll, indem wir darauf klicken. Diese ausgewählte Pizza sollte dann im Küchenbereich angezeigt werden und auch die Methode anzeigen, alle Schritte, um dies zu erstellen. Wenn Sie hier einen Blick darauf werfen, habe ich einige Schritte erstellt, mit denen wir dieses Ziel oben erfüllen dieses Ziel oben nämlich die Pizza-Namen anklickbar zu machen und sie dann in den Küchenbereich zu verschieben. Wenn Sie möchten, können Sie diese fünf Schritte ausführen und versuchen, dies selbst neu zu erstellen , oder wenn Sie es vorziehen, können Sie mir folgen. Um auf diese Pizzen klicken zu können, beinhaltet Schritt 1 zunächst das Hinzufügen einer Klasse von Pizza-Namen zu jedem dieser Artikel. Lasst uns zur Funktion von CreateListSofPizza springen , wir werden das finden. Und dann kreieren wir hier jede unserer Pizzen innerhalb der Spannelemente. Kurz bevor wir eine Anfügung vornehmen, fügen wir unsere Klasse hinzu, indem die Elementvariable Pizzamennamen auswählen. Wählen Sie die ClassList aus, die Methode namens add, wobei wir als String den Namen pizza_name übergeben werden. Das ist Schritt 1, um den du dich gekümmert hast. Scrollen wir wieder nach unten. Schritt 2 besteht darin, die SelectCurrentOrder-Funktion zu suchen. Da wir möglicherweise mehrere Pizzen haben, müssen wir alle Spannelemente auswählen. Und denken Sie daran, wenn wir mehrere Elemente haben, müssen wir ein QuerySelectorAll verwenden. Wir können all diese Elemente mit dieser Pizza-Namensklasse greifen , die wir gerade hinzugefügt haben. Suchen wir also diese Funktion SelectCurrentOrder, dann verwenden wir QuerySelectorAll, um all diese Pizza-Elemente zu greifen diese in einer Variablen namens pizzas document.QuerySelectorAll zu speichern . Wir können diese mit dem neuen Klassennamen greifen, wir gerade erstellt haben , nämlich pizza_name. Denken Sie daran, dass das Ziel darin besteht, auf einen unserer Pizza-Namen wie Schinken und Ananas oder alle Peperoni klicken zu können , auf einen unserer Pizza-Namen . So können wir jetzt einfach kostenlos auf einen dieser Namen klicken. Also schnapp dir unsere Variable, die Pizzen sind. Wir können forEach verwenden, um eine Funktion für jedes dieser Elemente auszuführen . Jede der einzelnen Pizzen wird auf einer Pizza-Variable gespeichert und dann können wir jedem dieser Pizzen einen EventListener hinzufügen jedem dieser Pizzen einen EventListener , also pizzas.addEventListener. Event wird ein Klick sein , der dann eine Funktion ausführen wird, die wir noch nicht erstellt haben, namens SetCurrentPizza. Okay? Lassen Sie uns diese Funktion unten erstellen , Funktion setCurrentPizza. Da wir dies mit einem Klickereignis auslösen, können wir die Ereignisinformationen auch an unsere Variable übergeben und überprüfen, ob dies mit einem Konsolenprotokoll funktioniert. Um also die tatsächlichen Elemente zu greifen, auf die Sie geklickt haben, wie Schinken und Ananas oder Peperoni. Um den Text zu erfassen, können wir dies mit e.target in einer Eigenschaft namens InnerText tun , prüfen Sie, ob das alles richtig funktioniert. Probieren wir das aus, springen Sie in die Konsole und aktualisieren Sie es. Das erste, was Sie tun müssen, ist, auf eine unserer Bestellungen zu klicken , und es wird ein Fehler beim EventListener ausgelöst. Werfen wir einen Blick darauf, was das verursachen könnte. Wir haben eine unbenutzte Variable, also braucht das nur ein s, da diese mehrere Pizzen enthält. Probieren wir das jetzt aus. Wir können auf unsere Bestellung klicken. Das funktioniert großartig. Wenn wir nun auf den Text von Schinken und Ananas klicken, sehen wir dies in der Konsole, Pepperoni. Gut, genau das wollen wir. Wenn wir nun wieder zu unserer SetCurrentPizza gehen, besteht das Ziel natürlich nicht darin, dies an der Konsole zu protokollieren, was wir tun möchten, ist, den Pizza-Namen in eine Variable zu speichern und dann nur hinzuzufügen nach unserem Text von Momentan machen. Wenn wir auf die Indexseite springen und diesen Abschnitt finden, können wir gleich danach sehen, dass wir eine Spanne mit der ID von current_pizza haben. Also speichern wir diesen Text in eine Variable und platzieren ihn dann in diese Spanne. Machen wir dies innerhalb unserer Funktion mit einem Konsolenprotokoll und speichern dies in einer Konstante namens PizzaName. Schnappen Sie sich unseren Spanbereich mit document.QuerySelector. Benutze #, da dies mit der ID von current_pizza war. Stellen Sie den InnerText für dieses Element auf unsere obige Variable ein. Probieren wir das mal aus. Wir brauchen die Konsole nicht mehr. Verschieben Sie eine dieser Bestellungen in den Abschnitt „Arbeiten an“. Klicken Sie auf „Pepperoni“ und es wird unser Text angezeigt, „Schinken und Ananas“ und auch die „Margherita“. Als Nächstes verwenden wir dieses ausgewählte Element, um die erforderlichen Schritte innerhalb des Methodenabschnitts anzuzeigen . 30. Aufteilen & Verbinden Methoden: Zuvor haben wir den aktuellen Pizza-Namen in der Küche festgelegt , als dieser angeklickt wurde. Jetzt werden wir mit der Darstellung der Methode zur Herstellung dieser Pizza im Methodenabschnitt fortfahren . Die Methode sind alle Schritte, die zum Herstellen jeder Pizza erforderlich sind. Wir haben dies ganz oben in unserer JavaScript-Datei. Innerhalb unserer Indexseite können wir in alle Pizza-Arrays gehen, und das hat den Pizza-Namen , den Sie bereits verwendet haben, und auch die Methode. Wenn wir diese Margherita-Methode als Beispiel nehmen, wird dies drei Schritte dauern. Die erste besteht darin, den Teig zu rollen, der zweite besteht darin, die Soße hinzuzufügen, und der dritte ist mit Käse zu überziehen. Wir werden bestätigen, dass der Chef die Schritte später mit den erforderlichen Schritten abgeschlossen hat , aber im Moment möchten wir uns nur darauf konzentrieren, diese Methode innerhalb des Browsers anzuzeigen. Wie Sie sehen können, ist diese Methode alles eine einzelne Textzeichenfolge, und was wir in diesem Video tun werden, ist jeden dieser Schritte aufzuteilen , um sie im Browser anzuzeigen. Also brauchen wir Schritt 1, wir brauchen Schritt 2 und auch Schritt 3, um diese formatiert darzustellen. Um dies zu tun, könnten wir in unsere eingestellte aktuelle Pizza-Funktion einsteigen , aber um die Dinge sauberer und abstrahierter zu halten, werde ich ganz unten eine neue Funktion erstellen . Springen Sie ganz unten in unserem Projekt. Es ist eine neue Funktion namens DisplayMethod. Dies muss auch den Pizza-Namen aufnehmen , damit wir wissen, welche Methode wir bekommen müssen Geben Sie dies also in unsere Funktion ein, und wir müssen diese Funktion jedes Mal aufrufen , wenn wir die aktuelle Pizza einstellen dh, diese Funktion direkt oben, wenn wir auf die Pizza klicken, und diese wird hier angezeigt . Wenn dies angeklickt wird, wissen wir, an welcher Pizza arbeiten muss. Dies ist sinnvoll, unsere Funktion von innen von dort aus aufzurufen . Lass uns das machen. Wir rufen unsere Funktion auf, die DisplayMethod ist, und denken daran, dass dies auch den aktuellen Pizza-Namen aufnehmen muss , den Sie in dieser Variablen gespeichert haben. Zu unserer Indexseite gibt es derzeit bereits einen Abschnitt namens Methode, den Sie hier sehen können. Dies hat die ID der Methode a Level 3 oben, und dann haben wir zwei Abschnitte. Wir haben den Pizza-Namen gefolgt von der Methode, die wir bald einfügen werden. Wie Sie sich vorstellen können, ist dies der Abschnitt , mit dem wir arbeiten werden. Wir können mit dem ersten Abschnitt beginnen , der der Pizza-Name ist. In unserer Funktion haben wir bereits den Pizza-Namen, damit wir documents.querySelector ('pizza_name') .innerHTML verwenden können documents.querySelector ('pizza_name') .innerHTML , was gesehen hätte , dass der innere Textinhalt unserer Variablen entspricht. was ist PizzaName. Bevor wir weiter gehen, probieren Sie dies im Browser aus, ich muss eine Bestellung aktualisieren und in den Abschnitt Working on weitergeben . Klicken Sie auf „Pizza“ und wir können unseren Pizza-Namen hier drüben sehen . Dies wird auch aktualisiert, wenn wir auf verschiedene klicken. Der nächste Schritt auf unserer Indexseite besteht darin, unsere Pizza-Methode zu greifen und hier eine Methode zu platzieren. Denken Sie daran, dass unser Pizza-Objekt diese Methodeneigenschaft hat , auf die wir zugreifen können, und um dies zu finden, können wir die Methode „Erase find“ verwenden, mit der wir diese bestimmte Methode filtern können , die von der Pizza-Name , den wir bereits haben, und dann können wir die Methode für jeden auswählen. Zurück zu unserer Funktion bravo full pizzas array Methode, die find und find wird eine Funktion für jeden Wert innerhalb unseres Pizzas Arrays ausführen , und Sie können eine unregelmäßige Funktion platzieren, wenn Sie möchten, aber da dies eine einfache Anweisung sein wird , füge ich diese in einer eigenen Zeile mit einer Pfeilfunktion hinzu. Diese Funktion nimmt die einzelne Pizza auf, greift dann auf den Namen jeder einzelnen Pizza auf der Schleife zu, und wir können überprüfen, ob dies unserem Pizza-Namen entspricht , der in diese Funktion übergeben wird. Der aktuelle angeklickte Pizza-Name entspricht einem unserer Pizza-Namen im Array Wir speichern diese ausgewählte Pizza in einer Variablen oder Konstante namens SelectedPizza. Als Nächstes führen wir ein Konsolenprotokoll und überprüfen, ob alles gut funktioniert, die Konstante von SelectedPizza, und lassen Sie uns dies im Browser aktualisieren. Springe zur Konsole. Klicken Sie zuerst auf eine „Oder“ und wählen Sie eine der Pizzen aus. Dies ist Schinken und Ananas, und wir können sehen, dass das volle Objekt unter Ananas zurückgegeben wurde. Versuchen wir es noch einmal. Die Peperoni. Großartig, also funktioniert das alles und wir können dies jetzt filtern, um nur die Methode zurückzugeben . Versuchen Sie es noch einmal. Die Schritte, die wir dort brauchen, und es ist für jeden von diesen unterschiedlich. Großartig, also gibt dies jetzt eine Textzeichenfolge zurück, und wir müssen diese Zeichenfolge aufteilen und jeden Schritt als Listenelement anzeigen. Dafür verfügt JavaScript über eine integrierte String-Methode namens split, die Strings durch die Prototypkette erben. Diese Methode verwendet unsere einzelne Zeichenfolge, die wir jetzt haben, sie an einem bestimmten Punkt aufteilen, den wir angeben, und gibt dann ein neues Array zurück, das und gibt dann ein neues Array zurück alle diese Teilzeichenfolgen enthält. So sieht es in unserem Code aus. Dies ist unsere Methode, also können wir dies einfach aus der Konsolenprotokollkette am Ende entfernen , die JavaScript-Split-Methode, und wir möchten übergeben, in welchem Abschnitt der Zeichenfolge wir diese teilen möchten abgesehen davon, und dann unser Fall, ist ein vollständiger Stopp ideal, und das liegt daran, dass jeder dieser Schritte, die wir haben, mit vollem Stopp endet, wenn wir uns unsere Saite ansehen jeder dieser Schritte, die wir haben, mit vollem Stopp endet, wenn wir uns . Dies ist perfekt, um unsere Zeichenfolge aufzulösen, und denken Sie daran, dass dies ein neues Array zurückgibt, das wir in einer Konstante speichern können. Bevor wir weiter gehen, führen wir schließlich ein Konsolenprotokoll durch , das unsere Konstante, nämlich MethodSteps, übergibt . Probieren wir das mal aus. Wählen Sie eine Bestellung aus, wählen Sie die Pizza aus und dies gibt nun ein neues Array mit allen unseren Schritten zurück. Wir können auch das Gegenteil tun, wenn wir wollten, und das heißt, ein Array von Werten zu nehmen, genau wie wir es hier haben , und sie in eine einzige Zeichenfolge umzuwandeln. Wir können dies mit der Methode namens Join tun. Denken Sie daran, MethodSteps ist ein Array. Wir können das Gegenteil tun, indem wir die Join-Methode übergeben. Join ist in einer einzigen Zeichenfolge. Wir können das testen, indem wir auf eine Pizza klicken. Lassen Sie eine einzelne Zeichenfolge zurück in Richtung zurückkehren und jeder Wert wird durch ein Komma getrennt. Wenn wir wollten, könnten wir dieses Trennzeichen in ein anderes Zeichen ändern , z. B. einen Bindestrich. Probieren Sie das aus. Habe jetzt einen Strich zwischen jedem dieser Werte. Dies ist nützlich, wenn Sie ein Array von Werten in einer einzigen Zeichenfolge verknüpfen müssen. Wir wissen jetzt, dass wir Arrays durchlaufen und mit jedem Wert etwas tun können , und im HTML haben wir den Pizza-Namen derzeit mit diesem Abschnitt hier festgelegt , und der nächste Schritt besteht darin, zu greifen unser zweites div mit der ID von PizzametHod. Ich setze unsere Array-Werte ein. Schnappen Sie sich das mit documents.querySelector ('#pizza_method') .inner-HTML und hier stelle ich einfach fest, dass dies einer leeren Zeichenfolge entspricht. Wenn eine Methode bereits zuvor festgelegt wurde, können wir sie löschen, bevor wir unsere neue hinzufügen. Dann listen wir unsere Schritte auf, indem unser Array schnappen, nämlich MethodSteps. Da Sie mehrere Werte haben, durchlaufen wir jeden dieser Werte mit einer für jede Schleife, die für jeden Wert eine Funktion ausführt. Wir können jeden dieser Werte in der Variablen namens Methode lösen . Dann konstruiere unsere Elemente. Installieren Sie dies innerhalb einer Konstante namens Elements. Wir haben Documents.createElements plus die Elemente, die Sie erstellen möchten. Ich wähle ein p-Element aus, und als nächstes ist der Textinhalt, document.createTextNode, document.createTextNode, und der Inhalt, den Sie übergeben möchten der Text unserer Methode. Durch Platzieren in der Methode im Inneren werden Elemente zusammengeführt . AppendChild übergibt unseren Text. Der letzte Schritt besteht darin, erneut unseren Abschnitt zur Pizza-Methode zu greifen , also kopieren wir diesen, fügen ihn ein, und dann können wir dies mit dem AppendChild hinzufügen , das unsere Elemente übergibt . Wir speichern dies und aktualisieren uns, wählen eine neue Bestellung aus. Peperoni. Da sind wir los. Es gibt unseren Pizza-Titel und auch die erforderlichen Schritte für jede der Pizzen. Gut. Das funktioniert jetzt alles und sieht gut aus. Es gibt nur einen kleinen Re-Faktor, den wir tun können. Denken Sie daran, dass wir gerade hier ein neues Textelement erstellt haben, aber wir haben auch eine Hilfsfunktion namens BuildElements, die unseren Elementnamen, Inhalt und Rückgabe als neu konstruierter Wert zurückgibt. Zurück zu unserer Schleife. Wir können dies in einer Konstante speichern, die Schritte genannt wird. Dies entspricht dem Rückgabewert aus unserer BuildeLement-Funktion. Übergeben der p-Elemente. Dann der Inhalt, der die Methode ist, die wir diese nächsten drei Zeilen verschieben und unsere Schritte durchlaufen werden. Probieren wir das aus und wählen Sie eine neue Bestellung aus. Das funktioniert alles genauso, aber wir haben ein paar Codezeilen gespeichert. Dies ist ein weiterer guter Schritt für unser Projekt, und wenn Sie ein Anfänger sind, weiß ich, dass dies hier viel passieren kann, aber das Wichtigste, woran Sie sich erinnern sollten, ist, dass wir bereits die Mehrheit von was wir hier machen. Es geht nur darum , es in kleinere Aufgaben aufzuteilen und sicherzustellen, dass jeder Schritt auf dem Weg funktioniert. 31. Pizzas In Den Ofen Hinzufügen: Die letzte Phase, um diese Pizza zu bewegen, besteht darin, sie vom Küchenbereich in unseren Ofen zu bringen. Wir haben die Pizza noch nicht kreiert, aber wir werden uns bald ansehen, wie das geht, und prüfen, dass wir die richtigen Zutaten verwendet haben. Aber im Moment können wir diesen PizzaName verwenden , den wir haben, und diesen in den Ofenbereich verschieben. Jetzt wird unser Ofen ein Array sein , um mehrere Pizzen zu speichern, wir benötigen auch einige andere Variablen. Lassen Sie uns diese beiden Funktionen gut erstellen, und erstellen Sie direkt unter unseren Zutaten unseren Ofen mit dem Schlüsselwort let, das zunächst ein leeres Array sein wird. Danach müssen wir die maximale Anzahl von Pizzen einstellen , die in unseren Ofen passen , der den Ofen istKapazität. Ich gehe für einen Wert von sechs. Als nächstes müssen wir die Pizzen im Auge behalten , die wir für eine bestimmte Bestellung angefertigt haben. Wenn Sie zum Beispiel Order 3 nehmen, heißt es vier Pizzen, Bestellung 2 hat drei Pizzen und wir müssen verfolgen, wie viele wir derzeit hergestellt haben. lass PizzasCompletedForOrder, der anfänglich Null sein wird. Jetzt haben wir diese, wir können unsere erste Funktion erstellen , die verwendet wird, um die Pizza in unser neues Ofen-Array zu schieben. Erstellen Sie nach unten eine Funktion namens AddTooven. Im Moment nimmt dieser Ofen den aktuellen PizzaName auf. Wir können das aus unserer Küche holen , wenn wir auf unsere Indexseite gehen. , Denken Sie daran, dass wir diese Spanne mit der ID von current_pizza haben, und dies speichert unseren Pizza-Namen. Schnappen Sie sich das mit document.QuerySelector ID, die current_pizza ist. Dann der InnerText. Bewahren Sie dies in einer Konstante namens PizzaName auf. Denken Sie daran, dass wir nicht immer eine Pizza ausgewählt haben. Derzeit haben wir den Wert von Schinken und Ananas, aber wenn wir auffrischen, ist dieses Element oft leer. Um dies zu überprüfen, geben wir eine if-Erklärung ein. Wir können prüfen, ob der PizzaName vorhanden ist. Wenn ja, fügen wir dies dem Ofen mit der Array-Methode namens push hinzu, übergeben den PizzaName und dann ein temporäres Konsolenprotokoll um zu überprüfen, ob dies alles funktioniert. Lass uns die Konsole haben, springe in den Browser. Wir können dieses Protokoll in nur einer Sekunde überprüfen, aber zuerst müssen wir diese Funktion tatsächlich aufrufen. Wir rufen diese Funktion auf, indem dem Button, den wir bereits haben, einen Klick-Listener hinzufügen , der sich in unserem Küchenbereich und direkt unter unserer aktuellen Pizza befindet. Habe diesen Button zu AddTooven. Es hat derzeit eine Klasse, aber wir können eine ID hinzufügen. Wähle diesen AddToOven aus und nimm diesen Ofen dann in unser Skript. documents.querySelector, der ID-Wert von AddTooven, dann können wir einen Ereignis-Listener hinzufügen. Ereignis-Listener hört einen Klick auf diese Schaltfläche, der eine Funktion namens AddTooven ausgeführt wird . Wir probieren das aus. bei der Open Console Klicken Sie bei der Open Console auf eine unserer Bestellungen. Wähle die Pizza aus. Derzeit nehmen wir Schinken und Ananas und lösen unseren Klickhörer mit Ofen aus und wir sehen, dass Schinken und Ananas auf das Array geschoben werden. Wir versuchen es mit Peperoni. Klicken Sie darauf und fügen Sie unserem Ofen immer wieder Pizzen hinzu. Großartig. Jetzt wissen wir, dass das funktioniert, wir können dies ein wenig erweitern und einen PizzaName in den Ofen geben. Derzeit sehen wir nur innerhalb des Arrays, aber wir müssen dies auch im Ofenbereich auflisten. Neben der Auflistung des PizzaName können wir auch die Zeit einstellen , die in den Ofen gestellt wurde. Dies liegt daran, dass wir später auch eine Kochzeit hinzufügen. Erstellen Sie dazu ein neues Objekt und wir tun dies innerhalb unserer if-Aussagen. Gleich darüber, wo es in den Ofen schiebt, erstellen wir ein Objekt namens PizzaForOven. Die erste Eigenschaft ist der PizzaName, der in der Variablen PizzaName gespeichert ist, die Sie bereits haben, und dann eine Eigenschaft namens timeAdded. Im Moment ist ein einfacher Platzhalterwert in Ordnung, wir werden später darauf zurückkommen. Der letzte Schritt besteht vorerst darin, die Konstante der Pizza für den Ofen in unsere Push-Methode zu integrieren. Kurz bevor wir dies testen, denken Sie daran, dass wir eine Variable namens PizzasCompletedForOrder hinzugefügt haben . Wir können dies um den Wert 1 erhöhen. Lassen Sie uns einfach überprüfen, dass alles in der Konsole funktioniert. Wir haben eine Pizza, fügen diese in den Ofen und da ist unser neues Objekt. Das Ofen-Array bekommt jetzt die Pizzen, wie wir sehen können. Als nächstes eine Funktion, um durch dieses Array zu laufen und sie im Ofenbereich anzuzeigen. Kurz nachdem wir unsere neue Pizza in den Ofen geschoben haben, rufen wir eine neue Funktion namens DisplayOvenItems auf. Wir nennen dies jedes Mal, wenn wir eine neue Pizza erstellen und sie dem Ofen hinzufügen, wodurch die Benutzeroberfläche aktualisiert wird. Wir haben das noch nicht erstellt, also fügen wir dies oben hinzu. Um innerhalb der Indexseite zu beginnen, müssen wir unseren Ofenbereich greifen und wenn wir uns unseren Code ein wenig ansehen, haben wir die Ofenverpackung mit der Überschrift Level 3 und dann dieses leere div mit der ID des Ofens, und hier fügen wir unsere neuen Pizzen hinzu. Wir können dieses Document.querySelector, die ID des Ofens, abrufen und dann setzen wir dies zuerst auf eine leere Zeichenfolge. Das räumt unseren Ofen aus, bevor wir ihn aktualisieren. Wickeln Sie unser Ofen-Array ein, und da dies kein Array ist, können wir forEach verwenden. Wir führen eine Funktion forEach-Wert darin aus, jeder Wert wird eine bestimmte Pizza sein , die wir in ein div einwickeln werden. const PizzaDiv ist gleich document.createElement, erstellt unseren div-Abschnitt. Wir fügen dazu eine Klasse für unser Styling hinzu, also ist PizzaDiv.className gleich pizza_div. Denken Sie daran, dass wir innerhalb unserer Starterdateien auch ein SVG-Bild für unsere Pizza haben. Dies wird verwendet, um jedes Mal im Ofen im Ofen anzuzeigen , wenn wir eine neue Pizza in den Ofen geben. Was wir tun können, ist, dass wir dies als Bild behandeln oder ein neues Bildelement erstellen. Wir haben document.createElement, die Bildelemente mit IMG. Dann können wir festlegen, dass die Quelleigenschaft unserer SVG entspricht. Dieser heißt pizza.svg und befindet sich auch im selben Ordner, und befindet sich auch im selben Ordner aber wir können dies mit seinem Namen referenzieren. Wir haben einen Wrapper mit einer Klasse, wir haben ein Bild, wir brauchen auch den Pizza-Namen. Um dies zu tun, können wir unsere Funktion namens BuildeLement nutzen , um diese Fotos zu erstellen und den Rückgabewert in einer Konstante namens PizzaName zu speichern . Unsere Hilfsfunktion, die BuildeElement ist, kann ein p-Element sein und da der PizzaName eine Variable sein wird, fügen wir dies in die hinteren Ticks ein, mit dem ganzen Symbol und dann kalibrieren dies und denken Sie daran, dass jedes unserer Ofenartikel in dieser Pizza-Variable aufbewahrt wird , damit wir auf Pizza oder Namen zugreifen können. Dies sind alle Elemente, die wir brauchen. Jetzt geht es nur darum , diese zu unserem PizzaDiv Wrapper hinzuzufügen . Wir wählen diesen PizzaDiv aus. Wir können append verwenden, um mehrere Werte hinzuzufügen und ein neues Bild auf PizzaName hinzuzufügen. Der letzte Abschnitt ist nun das Hinzufügen zu unserem Ofen. Genau wie oben verwenden wir QuerySelector, um unseren Ofen AppendChild in unseren PizzaDiv zu packen . Es ist ein bisschen los, aber lasst uns aktualisieren und testen, dass alles funktioniert. In eine neue Bestellung geben, die Pizza auswählen und die Peperoni in den Ofen geben. Es gibt unser Bild, das wir gerade hier kreiert haben, und auch unseren Pizza-Namen unten, Schinken und Ananas. Großartig, und das funktioniert jetzt alles. Wie bereits erwähnt, müssen wir immer noch zurückkommen, um tatsächlich in den Pizzen zu kreieren, aber wir wissen jetzt, dass dieser Schritt fertig ist, wenn wir es tun. 32. Starten & Beenden Des Spiels: In dieser Lektion habe ich einige Schritte gelöst , um Dinge selbst auszuprobieren. Was wir abdecken wollen, ist das Erstellen von zwei Funktionen. Eine Funktion wird verwendet, um das Spiel zu starten und eine zu beenden. Diese Funktionen werden von unseren HTML-Buttons aus aufgerufen, die wir in unserem Index sehen können. Dies ist der Spielkontrollbereich , in dem wir unsere beiden Buttons haben. Die Idee hinter diesen beiden Tasten besteht darin, die Benutzeroberfläche aufzuräumen nur die richtigen Dinge anzuzeigen, z. B. nur die Schaltfläche zum Ende des Spiels anzuzeigen wenn das Spiel tatsächlich läuft. Wir verwenden den Start-Game-Button, um mit den eingehenden Bestellungen zu beginnen und so weiter. Diese Funktionen werden auch später nützlich sein, wenn wir unserem Projekt Dinge wie Statistiken und Timer hinzufügen. Was wir tun müssen, ist zuerst unsere beiden Funktionen namens StartofGame und EndofGame zu erstellen . Dann können wir diese aufrufen, indem einen Ereignis-Listener der beiden Schaltflächen hinzufügen, die wir uns gerade angeschaut haben. Wir erstellen eine neue Variable, bei der das Spiel gestartet wird, die ein boolescher Wert sein wird. Dieser boolesche Wert wird wahr sein, wenn wir das Spiel starten , und falsch , wenn wir das Spiel beenden. Wir werden eine bedingte Überprüfung innerhalb von StartofGame durchführen, um aus dieser Funktion zurückzukehren, wenn gestartete Variable des Spiels wahr ist. Schritt 5, denken Sie daran, dass alle Bestellungen diese Klasse von order_wrapper haben . Ich werde all diese Bestellungen in unserer StartofGame-Funktion löschen . Da wir das Spiel noch nicht gestartet haben und CreateOrdersList für die Erstellung dieser Bestellungen verantwortlich ist . Wir können dies auch innerhalb unserer StartofGame-Funktion auf das CSS verschieben . Wenn das Spiel beginnt, zeigen wir die End-Schaltfläche an und blenden den Stopp-Button aus und machen dann den Rückwärtsgang, wenn das Spiel beendet ist. Nicht zu vergessen, dass unsere Schaltfläche zum Ende des Spiels ebenfalls entfernt oder ausgeblendet werden muss , wenn das Spiel anfänglich geladen wird. Wie immer können Sie diese selbst ausprobieren oder mitverfolgen, wenn Sie es vorziehen. unten daran, dass der erste Schritt darin besteht , unsere Funktionen zu erstellen. Die erste Funktion war StartofGame. Dann auch unsere EndofGame-Funktion. Beide Funktionen müssen aufgerufen werden, indem Sie auf die beiden Schaltflächen in unserem HTML klicken. Wir tun dies, indem wir unsere Start- und Endschaltfläche greifen und einen Ereignis-Listener hinzufügen, um diese Funktionen aufzurufen. Diese Tasten, bei der Idee der Start- und Endschaltfläche. Wir können diese jetzt mit dem document.query Selector abrufen. Hier ist der Hash. Zuerst der Start-Button. Fügen Sie einen Ereignis-Listener für ein Klickereignis hinzu, das eine Funktion namens StarTofGame auslöst . Dupliziere das. Die zweite ist für die EndBTN, die die entsprechende Funktion auslöst. Bewegen Sie auch unseren Event-Listener von oben nach unten , um diese gruppiert zu halten. Eigentlich möchte es nur einen Ereignis-Listener hinzufügen , um sicherzustellen , dass dies abgeschlossen ist. Bevor wir weiter gehen, können wir jeder dieser Funktionen ein Konsolenprotokoll hinzufügen , um zu überprüfen, ob sie alle korrekt funktionieren. Der erste ist Start. Die zweite für Ende. Dann springe in die Konsole. Trennen Sie einfach die Minuten ab, also werden wir einfach wieder anhängen. Da sind wir los. Zurück in die Konsole und unsere beiden Tasten oben. Start löst ein Konsolenprotokoll aus und das Ende funktioniert auch. Das ist Schritt 1 und auch Schritt 2 erledigt. Der nächste besteht darin, einen GameStarted Boolean zu erstellen. Machen wir das ganz oben und den Rest unserer Variablen. Lass GameStarted, was anfangs falsch sein wird. Wir können diese Variable aus unseren beiden Funktionen aktualisieren. Entferne die Konsolenprotokolle und wenn wir das Spiel starten, GameStarted gleich true. In der EndofGame-Funktion ist GameStarted dann gleich false. Wenn dieses Spiel gestartet wird oder nicht, wird es wirklich nützlich sein und insbesondere für die StartofGame-Funktion, werden wir einige Bereinigungsarbeiten ausführen , z. B. befehle. Wir wollen es nicht verwenden, um dieses Midgame versehentlich auszuführen. Wir können aus dieser Funktion zurückkehren, wenn dies zutrifft. Wenn GameStarted gleich true ist, kehren wir alle zu dieser Funktion bevor wir weiteren Code ausführen. Danach können wir alle Bestellungen aus dem vorherigen Spiel entfernen . Lassen Sie uns unsere Bestellungen abrufen und diese in einer Konstante mit document.getElementByClassName speichern . Wir verwenden hier den Klassennamen, weil denken Sie daran, dass wir diese Klasse von order_wrapper haben. Übergib das in Klammern. Dann können wir alle diese Bestellungen durchlaufen und entfernen. Wenn wir auf das Haupt-Array-Objekt mit einem Kapital A zugreifen, können wir Zugriff auf eine Methode haben, die von aufgerufen wird , um aus all diesen Elementen ein Array zu erstellen. Wenn Sie getElementsByClassName verwenden, wird eine HTML-Sammlung zurückgegeben. Dann können wir damit aus diesen Bestellungen ein neues Array erstellen . Die Methode von, die die Befehle übergeben. Jetzt haben wir das in ein Array konvertiert. Wir können Array-Methoden wie forEach verwenden , um für jede dieser Funktionen eine Funktion auszuführen. Wenn Sie die Funktion übergeben, speichert jede Bestellung sie in der Reihenfolge Variable. Greifen Sie auf diese individuelle Bestellung zu und rufen Sie dann die Methode zum Entfernen von JavaScript auf. Dies kümmert sich darum, diese Befehle zu entfernen , wenn wir ein Spiel zum ersten Mal starten, aber wir müssen sie auch überhaupt erstellen. Derzeit haben wir eine Funktion namens CreateOdersList. Wenn wir nach oben scrollen, um dies zu finden. Nur um diese Funktion zu erhalten, ist das Erstellen aller unserer Bestellungen verantwortlich . wäre sinnvoll, dies zu nennen , wenn das Spiel begonnen hat. Wenn wir gerade danach suchen, können wir sehen, dass dies gerade von innerhalb unseres Programms aufgerufen wird . Anstatt dies aufzurufen, sobald es geladen wird, schneiden wir dies fehl am Platz und verschieben es dann auf unsere neue StartofGame-Funktion. Jetzt sollten alle Bestellungen nur angezeigt werden, wenn der Benutzer auf diese Startschaltfläche klickt. Sparen wir uns das auf und probieren es aus. Jetzt, da wir unseren Funktionsaufruf verschoben haben, sehen wir die Bestellungen nicht, wie start. Jetzt erscheinen sie in der Seitenleiste. Die Bestellungen werden angezeigt und wir wissen, dass dieser Funktionsaufruf ordnungsgemäß funktioniert. Aber wir können nicht feststellen, ob die vorherigen Bestellungen geklärt wurden. Wo wir order.remove verwendet haben. Das spielt im Moment keine große Rolle , da alle Bestellungen desselben sind. Aber später werden wir zufällige Bestellungen generieren , die unterschiedlich sein werden. Als vorübergehende Maßnahme, um dies zu testen, kommentieren Sie unseren Funktionsaufruf. Dann können wir temporäre Elemente in unser HTML einfügen und überprüfen, ob dies entfernt wird. In der Reihenfolge Abschnitt von P-Elementen. Denken Sie daran, dass all diese die Klasse von order_wrapper in einem beliebigen Text darin platziert haben . Wenn wir das jetzt speichern, aktualisieren, können wir den ganzen Lauf sehen. Klicken Sie auf Start. Dieses Element wurde jetzt entfernt. Großartig, also wissen wir jetzt, dass das funktioniert. Wir können unsere temporären Elemente entfernen und auch unseren Funktionsaufruf wieder einführen. Dann ist der nächste Schritt Nummer 7 und 8. Dies dient dazu, die Eigenschaft style zu verwenden, um diese beiden Schaltflächen ein- und auszublenden. Sie im StartofGame oben in der Verwenden Sie im StartofGame oben in der Funktion document.QuerySelector. Schnappen Sie sich zuerst unseren Startknopf. Greifen Sie auf die Stileigenschaft der Anzeige zu. Wir können dies ausblenden, indem wir dies auf einen CSS-Wert von none festlegen. Duplizieren und dann für den End-Button setzen wir dies wieder ein, indem wir dies auf den Wert Inline setzen. Kopiere beides. Springe in die EndofGame-Funktion und füge diese ein. Dann könnten wir die Werte beider umkehren. Die Stopp-Taste wird mit dem Wert „Inline“ angezeigt , und dann kann die Schaltfläche „ Ende“ ohne entfernt werden. Probieren wir das mal aus. Aktualisieren. Klicken Sie auf Start und dadurch wird die Schaltfläche „Ende“ entfernt. Klicken Sie auf Ende und dies zeigt den Start-Button an. Sie werden auch bemerken, sobald die Seite geladen wird, sehen wir beide Schaltflächen. Da das Spiel noch nicht begonnen hat, wollen wir nur den Start-Button anzeigen. Wir verschieben dies, indem wir die Stileigenschaft der Anzeige auf „None“ festlegen. Dafür haben wir den Code bereits als unseren zweiten Wert hier drin. Kopieren Sie dies und dann können wir das oben in unserem Code aufrufen. Irgendwo um die Variablen herum ist in Ordnung. Aktualisieren. Die End-Schaltfläche wurde entfernt. Wir fangen an und wir sehen nur den Endknopf. Jetzt bin ich im Spiel. Wir sehen nur den Stopp-Knopf. 33. Einführung In Javascript Math: In diesem Abschnitt werden wir unser Speedy Chef-Projekt fortsetzen , aber wir werden uns auf praktische Mathematik, Datum und Uhrzeit der Funktionalität konzentrieren , die JavaScript bietet. Ab bald werden wir uns ansehen, wie wir JavaScript-Mathematik verwenden können , um zufällige Pizzen und Bestellungen zu generieren. Derzeit generieren wir mit diesem Orders-Array, das wir haben, bei jedem Spielstart nur dieselben drei Bestellungen , aber wir können neue erzeugen mehr Zufall haben. Diese Befehle werden weiterhin eingehen , während das Spiel läuft. Wir haben verschiedene Pizzen und auch verschiedene Arten von Pizzen für jede Bestellung. Um dies zu tun, benötigen wir zwei neue Funktionen ganz unten. Der erste wird GeneratneWorder heißen. Dies ist verantwortlich, wie es klingt, für die Erstellung einer neuen Bestellung mit einer Bestellnummer. Ich werde das analysieren, GenerateNeWorder. Dann wird diese zweite Funktion GenerateNewPizza heißen, und GenerateNewPizza erstellt zufällige Pizzen, die von unserer Bestellfunktion aufgerufen werden. Testen Sie dies mit einem Konsolenprotokoll und analysieren Sie das JavaScript-Mathe-Objekt. Kurz bevor wir das sehen können, müssen wir unsere Funktion aufrufen. Also schnappen Sie sich das und rufen Sie diese Funktion dann irgendwo unten auf. Aktualisieren, öffnen Sie das, und das gibt viel zurück. Wir haben viele verschiedene Eigenschaften und Methoden, und ich bin kein Mathematiker, also liegt ein Teil davon außerhalb meines Wissens. Aber du musst nicht gut in Mathematik sein, um etwas davon nutzen zu können. Es ist alles hier, um uns zu helfen. Es gibt einige Konstanten, die wir verwenden können , z. B. den Wert von Pi, mit dem Sie möglicherweise vertraut sind. Wir haben etwas namens Random, wenn wir nach unten scrollen, was eine Methode ist. Es ist das, was eine neue Zufallszahl zwischen Null und Eins erzeugt . Wir haben etwas namens Ceil and Floor zum Aufrunden oder Abrunden und wir werden uns diese in nur wenigen Augenblicken ansehen. Es gibt eine Methode, um auf die nächste Zahl zu runden. Wir können die kleinste und größte Zahl mit min und max finden , und auch viele andere. Gehen wir zurück zur Funktion und sehen, wie wir sie nutzen können. Springen Sie in GenerateWorder und ändern wir dies direkt unter unserem Konsolenprotokoll in Math.random, was eine der Methoden ist die wir gerade im Browser gesehen haben. Testen wir das mal. Wie bereits erwähnt, wird dies eine neue Zahl zwischen Null und Eins erzeugen. Null ist also enthalten, aber der Wert von eins ist nicht. Wir steigen nur auf den Wert von 0,999 wiederkehrenden. Oft brauchen wir diese Zahl, um einen anderen Bereich zu haben, z. B. der Wert von 0-10, 1-50, 0-100 und so weiter. Um dies zu tun, können wir in keinem Bereich auf Math.random analysieren. Stattdessen müssen wir dies mit dem Betrag multiplizieren, mit dem wir es multiplizieren möchten . Wenn ich dies mit dem Wert 100 multipliziere, ergibt uns dies einen Wert zwischen Null und 99. Denken Sie daran, dass Null und Eins das Original Math.random ist. Selbst wenn man 0 mit 100 multipliziert, wird uns immer noch 0 geben. Da 0,99 der höchste Wert ist, gibt uns die Multiplikation mit 100 den Wert von bis zu 99. Sparen Sie. Wir haben ein paar größere Zahlen in der Konsole. Lassen Sie uns das in einer Konstante aufbewahren. Ich kann das aus unserem Konsolenprotokoll ziehen, const random. Dann können wir diese Zufallszahl auf die nächste ganze Zahl aufrunden . Es war ein Beispiel. Anstatt 53,4 zu bekommen, können wir dies auf 54 runden. Wir tun dies, indem wir erneut das JavaScript-Mathe-Objekt zugreifen, eine Methode, die wir gerade in der Konsole gesehen haben , genannt Ceil, bei der wir unsere Konstanten von Zufall analysieren. Jedes Mal, wenn wir dies aktualisieren, wird dies auf die nächste ganze Zahl abgerundet. Wir haben dort tatsächlich ziemlich viel Glück, weil wir den Wert von 100 in der Konsole haben. Dies liegt daran, dass die ursprüngliche Zufallskonstante uns eine Zahl wie 99,9 gibt. Dann wird dies auf 100 abrunden . Mit dieser Aufrundung werden alle Zahlen, die mit Null beginnen , auf eins gerundet. Dies sollte uns eine Zahl zwischen 1 und 100 geben. Wir können abrunden, indem wir die Decke zu Boden wechseln. Aber Sie werden keinen großen Unterschied innerhalb der Konsole bemerken. Aber das wird abrunden, anstatt sich sogar als ganze Zahl zwischen 0 und 99 aufzurunden . Auch erwähnt, als wir uns das Mathe-Objekt anschauten, waren die Min-und Max-Methoden in der Konsole. Beginnen wir damit, den größten Zahlenwert zu finden. Um dies zu tun, erstellen wir eine neue Konstante namens höchste und setzen gleich Math.max. Math.max wird mehrere Werte aufnehmen. Wir gehen für 1, 77 und 34. Analysieren Sie einfach beliebige Zufallszahlen in hier und protokollieren Sie diese dann in der Konsole. In meinem Fall ist 77 der höchste Wert von hier. Dies wird in der Konsole zurückgegeben. Wie Sie auf ähnliche Weise erwarten würden, können wir auch den niedrigsten Wert speichern. Wir haben Math.min. Melden Sie sich hier eine beliebige Nummern an. Melden Sie diesen an der Konsole und es sollte den Wert von eins zurückgeben. Dies ist nicht immer praktisch , um unsere Zahlen in die Max- oder Min-Funktion einzuwickeln . Oft werden diese Zahlen in einem Array gespeichert. Dann müssen wir auf dieses Array zugreifen und herausfinden , welcher der höchste und niedrigste Wert ist. dies zu sagen, erstellen Sie eine neue Konstante namens Numbers und speichern diese in einem Array. Gespeicherte Zahlen sind in Ordnung. Zählen Sie diese aus. Zunächst einmal, vielleicht um das, was wir oben hatten, mit unserer höchsten zu reproduzieren wir oben hatten, mit unserer höchsten und dann unsere Zahlen auf Math.Max zu analysieren. Lass uns das machen und sehen, was passiert. Konsole protokolliert den Wert von höchster. Möglicherweise erwarten Sie, dass Sie den Wert von 77 erhalten. Nun, wenn wir dies speichern und aktualisieren, sehen wir den Wert einer Zahl in der Konsole. Der Grund, warum wir dies bekommen, ist dass wir in diesem Bereich ein Array analysieren und nicht die tatsächlichen Werte, nicht die tatsächlichen Werte die darin enthalten waren. Um die Werte aus diesem Array zu extrahieren und zu vergleichen, müssen wir die JavaScript-Spread-Methode verwenden , die auf den drei Punkten basiert. Aktualisieren Sie und lassen Sie uns den richtigen Wert zurück. Auch wenn Sie möchten, kann dies auch mit Math.min verwendet werden. Es funktioniert genauso und das andere Methoden und Eigenschaften dieses Mathe-Objekt verfügbar sind, wie wir bereits in der Konsole gesehen haben, abhängig von Ihren speziellen Anforderungen. Jetzt werden wir dies in die Praxis umsetzen, indem zufällige Pizzen und Bestellungen generieren. 34. Neue Pizzas mit Math generieren: Wir können das, was wir jetzt über JavaScript Math wissen, verwenden , um zufällige Pizzen und Bestellungen zu generieren. Lassen Sie uns zunächst unsere Funktion „Neue Bestellung generieren“ aus dem vorherigen Video löschen Funktion „Neue Bestellung generieren“ aus und neue Pizza generieren. Wir verwenden diese Funktion, um eine zufällige Pizza aus dem Array unserer Pizza zu generieren . Zu Beginn erstellen wir eine Zufallszahl zwischen eins und drei, um die Menge für jede Pizza zu generieren. Denken Sie daran, eine neue Zufallszahl zu erstellen , wir verwenden Math.random. Dies wird eine Zufallszahl zwischen Null und Eins erzeugen. Aber wir wollen dies auch zwischen eins und drei schaffen. Der erste Schritt besteht darin, Math.Ceil zu verwenden , um diesen Wert aufzurunden und diesen auszuschneiden. Wir verwenden Math.ceil und innerhalb der Klammern übergeben diese Zufallszahl. Mit diesem zwischen Null und Eins wird dies immer auf den Wert von eins abrunden. Aber wir wollen den Wert von 1-3, was bedeutet, dass wir diesen zurückgegebenen Wert mit 3 multiplizieren und diesen innerhalb der Konstante speichern müssen, die als Menge bezeichnet wird. Führen Sie dann ein Konsolenprotokoll aus, um zu überprüfen, ob dies funktioniert Sagen Sie dies, und wir müssen diesen Wert konsolenprotokollieren , indem wir generieren neue Pizza aufrufen. Ändert, aktualisiert 1, 3 und 2. Scheint alle Zahlen zu sein , die wir in unserem Sortiment benötigen. Dies ist unsere zufällige Menge, aber wir müssen auch eine zufällige Pizza auswählen. Kurz bevor wir dies tun, wollen wir letztendlich ein neues Pizza-Objekt kreieren , Const Pizza. Diese Pizza muss die Menge aufnehmen, die Sie bereits oben erstellt haben bereits oben erstellt und wir benötigen auch einen Pizza-Namen. Dies ist ein Schritt, den wir jetzt erstellen müssen. Kommentiere das aus, damit wir keine Fehler bekommen. Wir nehmen es konstant auf, um dies zu lagern, für alle zufällige Pizza. Dies wird eine zufällige Pizza aus unserem Pizza-Array auswählen . Denken Sie daran, dass die Arrays immer mit dem Wert Null beginnen und bis zum Ende unseres Arrays durchlaufen müssen. Wir schnappen uns das jetzt mit pizzas.length. Anhand eines ähnlichen Beispiels von oben kopieren wir dies ohne das Semikolon, geben es weiter. Wie wir wissen, wird dies einen Wert von 1-3 zurückgeben, aber wir brauchen einen Wert von Null bis hin zu pizzas.length. Um Null zu erhalten, verwenden wir Math.Floor, was uns derzeit den Wert von 0-2 gibt. Aber anstatt dies mit 3 zu multiplizieren, multiplizieren wir dies mit dem Wert von pizzas.length. Dies bedeutet auch, dass, wenn wir in Zukunft neue Pizzen hinzufügen, dies auch erledigt wird. Zurück zu dieser Namenseigenschaft können wir dies auf unsere zufällige Pizza setzen. Aber denken Sie daran, dass unsere zufällige Pizza eine aus dem Array auswählt. Wenn wir uns das Array ansehen, enthält dieses ein Objekt mit dem Namen, der Methode und den erforderlichen Schritten. Wir müssen nur auf die Name-Eigenschaft zugreifen, damit wir auf Randompizza.name zugreifen können. Schließlich ist es die Aufgabe, neue Pizza zu generieren , neue Pizza zu generieren. Das haben wir mit diesem Objekt gemacht, damit wir dies von unserer Funktion zurückgeben können. Gut, probieren wir das mal aus. Anstatt dies direkt unten zu nennen, legen Sie dies in ein Konsolenprotokoll, generieren Sie neue Pizza. Rufen Sie diese Funktion auf und aktualisieren Sie sie als unser erstes Objekt. Wir haben eine zufällige Menge von drei und den Namen Schinken und Ananas. Wieder ein Vegetarier, zwei Vegetarier und ein Huhn. Dies ist in der Tat die Hälfte der die geleistet wurde, um unsere neue Ordnung zu generieren. Wir haben alle Pizzen zurückgekehrt. Aber anstatt die Konsolenanmeldung, diesen Wert, müssen wir diesen aufrufen, um neue Ordnung zu erzeugen. Springen Sie in diese Funktion und wir erstellen zunächst eine neue Pizzas-Variable und setzen diese auf ein leeres Array. Dieses leere Pizzas-Array wird verwendet, um eine zufällige Anzahl von Artikeln für unsere Bestellung zu erstellen . Denn denken Sie daran, obwohl es neue Pizza erzeugt, mehrere Werte generiert, es ist immer noch nur ein Einzelposten. Wenn wir uns auffrischen, startet dies wieder. Was ich damit meine, wenn wir auf eine unserer Bestellungen klicken , ist zum Beispiel, wir nur in einer Zeile erzeugen, z. B. einen Schinken und Ananas oder zwei Peperonis. Pizzas werden eine Reihe all dieser Einzelposten speichern . In diesem Spiel beschränke ich die Anzahl der Einzelposten auf bis zu fünf, sodass wir nicht zu viele riesige Bestellungen haben. Wir wissen bereits, wie man eine neue Zahl zwischen eins und drei generiert. Lassen Sie uns dies kopieren, speichern dies in einer Konstante namens Auftragsposition nicht im Wert von drei, ändert sich in fünf, da wir eine Zahl zwischen eins und fünf haben, die Sie ändern können, wenn Sie möchten. Jetzt wissen wir, dass wir eine Zufallszahl zwischen eins und fünf haben. Als Nächstes erstellen wir eine Schleife, um jeden unserer Bestellungen, die aus dieser Funktion generiert werden, in unser Pizzas-Array zu schieben die aus dieser Funktion generiert werden . Wir wiederholen dies für den Wert der Auftragsposition. Übergeben Sie eine for-Schleife, ich werde zunächst auf eins eingestellt. Die Schleife läuft weiter dort, wo ich kleiner oder gleich dem obigen Wert des Bestellartikels ist, also ist dies 1-5. Dann werden wir nach jeder Schleife ich mit i plus plus erhöhen. Sie für unser leeres Pizzas-Array die Push-Methode, Verwenden Sie für unser leeres Pizzas-Array die Push-Methode, um einen neuen Wert hinzuzufügen. Der neue Wert, den es zu schieben gilt , ist dieser Wert, der von generieren neuer Pizza zurückgegeben wird . Wir sollten jetzt ein Pizza-Array haben, das auf eine Reihe von Einzelposten zwischen eins und fünf und dann auf die zufälligen Pizza-Objekte im Inneren eingestellt ist . Dies lässt uns jetzt unser Pizza-Array für die Bestellung übrig, aber jetzt müssen wir unsere Auftragsobjekte konstruieren. Dies erzeugt eine neue Konstante, in der diese gespeichert , genannt neue Ordnung, sei dies ein Objekt. Jede Bestellung benötigt eine eindeutige ID. Wir könnten weitermachen und eine lange Zufallszahl oder Zeichenfolge generieren . In diesem Fall ist eine einfache Bestellnummer in Ordnung. Was ich tun werde, liegt direkt außerhalb dieser Funktion, erstellt eine neue Variable namens Bestellnummer und setze diese auf die Punktlänge unserer Orders Array. Wenn unsere derzeitige Anzahl an Bestellungen drei beträgt, wird der Wert von drei zurückgegeben. Aber da wir am Ende dieses Arrays eine neue Reihenfolge erstellen , fügen wir am Ende plus eine hinzu. Es sollte immer einen mehr geben als die Anzahl der Bestellungen , die wir haben. Deshalb wird es einmalig sein. Wir können dies als ID übergeben von oben im Pizzas Array platzieren. Was wollen wir eigentlich mit dieser neuen Bestellung machen? Nun, oben, denken Sie daran, dass wir unser Orders-Array haben , das die drei Musterbestellungen enthält. Wir müssen bis zum Ende dieses Arrays drängen. Das ist ziemlich einfach. Wir werden unseren Orders.push-Platz in unserer neuen Bestellung und dann schließlich unsere Bestellnummer für das nächste Mal erhöhen , also fügen Sie die Bestellnummer plus plus hinzu. Dies sollte immer einmalig sein. Lasst uns unsere Funktion „ Neue Bestellung generieren“ nutzen, und wir rufen dies ganz unten auf und probieren es aus. Speichern und aktualisieren. Klicken Sie auf „Start“. Dann haben wir unsere drei ursprünglichen Bestellungen aus unserem Orders-Array und dann eine zufällige Reihenfolge unten. Wir haben die nächste Indexnummer von Ordnung vier. Wir haben eine zufällige Anzahl von Pizzen und auch einen zufälligen Namen. Lasst uns auffrischen und noch eins ausprobieren. Bestellen Sie vier, dieser ist ein bisschen länger und es hat vier separate Einzelposten. Denken Sie daran, wir könnten bis zu fünf Einzelposten haben. Das ist ein guter Fortschritt bei unserem Spiel und wir werden in der nächsten Lektion darauf aufbauen und nach einer gewissen Zeitverzögerung neue Bestellungen generieren und auch JavaScript Math erneut besuchen, wo wir uns mit die Canvas. 35. setInterval: Wir wissen, dass unsere Bestellungen funktionieren und auch zufällig generiert werden , sobald das Spiel beginnt. Aber wir wollen auch, dass sie während des gesamten Spiels immer wieder kommen. Dieses JavaScript bietet uns jedoch eine Methode namens setInterval, und setInterval führt eine Funktion nach einer gewissen Zeitverzögerung aus. Es ist auf dem Window-Objekt verfügbar, also können wir es einfach alleine aufrufen. Rufen Sie also setInterval auf, und setInterval wird zwei Dinge aufnehmen. Zuerst übergeben wir eine Funktion, die Sie ausführen möchten, und wir könnten eine neue Funktion direkt wie diese übergeben , oder wir könnten eine vorhandene Funktion mit ihrem Namen referenzieren. Die Funktion, die wir ausführen möchten, ist GenerateNeWorder, also geben Sie dies ohne die Klammern ein, und wir können dies jetzt auch von oben entfernen. Trenne es durch Komma. Wir geben eine Zeitverzögerung durch, und dies ist die Zeitverzögerung zwischen jedem Funktionsaufruf. Es ist auch in Millisekunden, also sind 3.000 Millisekunden 3 Sekunden gleich. Diese Funktion wird alle drei Sekunden aufgerufen. Wir prüfen, dass dies funktioniert, gehen zu unserer GenerateNewWorder-Funktion und wir können ein Konsolenprotokoll übergeben, das im Orders-Array platziert wird. Aktualisieren Sie den Browser. Nach drei Sekunden sollten wir ein Konsolenprotokoll mit vier Bestellungen sehen. Drei Sekunden später sehen wir fünf Bestellungen, sechs Bestellungen und so weiter. Gut. Jetzt wissen wir, dass das funktioniert. Zuvor haben wir eine Funktion namens CreateOrdersList erstellt . Schauen wir uns das mal an. Scrollen Sie nach oben und hier sind wir. Das ist unsere Funktion gerade hier. Diese Funktion hat das Orders-Array übernommen. Wir haben dann jede unserer Bestellungen durchlaufen und diese in unseren Bestellbereich aufgegeben. Alles, was wir jetzt tun müssen, ist diese Funktion jedes Mal aufzurufen , wenn wir eine neue Bestellung generieren. Anstelle unseres Konsolenprotokolls, das wir zuvor platziert haben, , entfernen Sie das Konsolenprotokoll und ersetzen Sie dieses durch CreateOrdersList. Sagen wir das und sehen , wohin uns das führt. Aktualisieren Sie den Browser. Nach drei Sekunden sehen wir, wie unsere Bestellungen durchlaufen werden. Wir haben die Nummer 1 bis vier, und die Sekunden später erhalten wir eine neue Reihe von Bestellungen. Das Problem hier ist jedoch, wir nicht nur die neuen Bestellungen hinzufügen die generiert wurden, sondern auch die bestehenden Bestellungen hinzufügen. Dies lässt uns jetzt zwei Probleme haben, die wir beheben müssen. Die erste ist, dass Bestellungen eingehen, bevor wir überhaupt den „Start“ -Button oben drücken. Die zweite, wie wir gerade gesehen haben, müssen wir nur die neuen Bestellungen hinzufügen, anstatt auch alle vorhandenen hinzuzufügen. Beheben Sie dieses Problem, wir können alle Bestellungen löschen , bevor wir unsere neuen zu diesem Abschnitt hinzufügen. Dies kann geschehen, indem Sie zur CreateOrdersList-Funktion gehen und den Bestellabschnitt löschen, bevor wir die neuen hinzufügen. Springen wir zurück zu CreateOrdersList. Hier geht's ganz oben. Bevor wir unsere Bestellungen in diesen Abschnitt aufnehmen, löschen wir dies mit documents.querySelector. Schnappen Sie sich unseren Bestellabschnitt, inneres HTML, und setzen Sie dies auf eine leere Zeichenfolge. Probieren wir das mal aus. Aktualisieren, gib diese drei Sekunden. Es gibt unsere ersten vier Befehle. Bestellung 5, das sieht gut aus. Bestelle 6, großartig. Diese kommen jetzt alle durch, aber anstatt alle bestehenden Bestellungen hinzuzufügen, fügen wir sie am Ende derjenigen hinzu, die bereits vorhanden sind. Das nächste, was wir lösen möchten, ist, diese Bestellungen erst zur Seitenleiste hinzuzufügen , nachdem wir tatsächlich auf den „Start“ -Button geklickt haben. Anstatt unser setInterval unten direkt aufzurufen, können wir dies entfernen, dies fehl am Platz beenden und es in eine Funktion namens OrderStimer wickeln. Leg das wieder rein. Denken Sie daran, wenn wir auf den Start-Button klicken, löst dies unsere Funktion namens StarTofGame aus. Wenn wir das gerade hier finden, können wir unsere Funktion aufrufen, die der OrderStimer war. Sagen wir das und probieren Sie es aus. Aktualisieren Sie zuerst und geben Sie diese drei Sekunden und wir sollten jetzt keine Bestellungen in der Seitenleiste sehen. Gut. Dies hat die anfängliche Belastung gestoppt. Klicken Sie auf die Schaltfläche „Start“. Jetzt fängt unsere Bestellung an zu kommen. setInterval ist auch nützlich , um einen Countdown-Timer für das Spiel zu erstellen, daher läuft es nur für eine bestimmte Zeit. Sobald Sie auf „Start“ klicken, beginnen wir einer bestimmten Anzahl von Sekunden mit einem Countdown-Timer. Dafür brauchen wir einige Variablen, um dies im Auge zu behalten. Springen Sie nach oben, wo wir den Rest unserer Variablen haben. Die erste wird eine Konstante namens GameLength sein . Stellen Sie dies auf eine beliebige Anzahl von Sekunden ein, die Sie möchten. Meiner wird 300 sein, und der zweite, der das Schlüsselwort let verwendet, da wir dies aktualisieren werden, wird der CountDownTime entsprechen . Countdown-Zeit beginnt bei der ersten GameLength. Dann reduzieren wir es mit setInterval um eine Sekunde. Anfangs setzen wir dies auf GameLength, dann reduzieren wir es, während das Spiel weitergeht. Wir müssen dies auch auf dem Bildschirm anzeigen. Wir können dies mit document.QuerySelector machen. Wir müssen einen Abschnitt finden, der oben steht , also neben unseren Buttons. Dies ist der Spielkontrollbereich, in dem wir die Schaltfläche Start und Ende des Spiels haben , und wir haben auch eine Spanne mit der ID von GameLength. Geben Sie dies ein, stellen Sie den InnerText ein. Da wir die GameLength-Variable einfügen, müssen die Backticks sagen, dass müssen die Backticks sagen, dass die Spiellänge die Variable einfügt, die unsere GameLength-Nummer ist, gefolgt vom Text von Sekunden. Laden Sie neu und oben steht unser Text. Wir müssen jetzt zwei Dinge tun. Die erste besteht darin, eine Funktion zu erstellen , um diese Variable um eine Sekunde abzuziehen. Dann können wir diese Funktion einmal jede Sekunde mit setInterval aufrufen . Erstellen Sie zuerst unten unsere neue Funktion namens CountDownTimer, die dafür verantwortlich sein wird, unsere Variable zu erfassen , nämlich Countdown Time und Abzug dieser um eine Sekunde. Jedes Mal, wenn wir dies tun, müssen wir auch die gleichen Elemente oben aufgreifen die gleichen Elemente oben aufgreifen und mit dieser neuen Zeit aktualisieren. Genau wie oben verwenden wir document.QuerySelector, übergeben es im selben Abschnitt, der GameLength, der InnerText war , öffne die Backticks. Diesmal sagen wir, dass die verbleibende Zeit unserer Variablen gleich oben ist. Diese Funktion macht eigentlich nichts alleine. Es ist einfach dafür verantwortlich, unsere CountDownTime-Variable auszuwählen und dann in einer Sekunde abzuziehen. Um dies auch der vorhandenen Variablen zuzuweisen, müssen wir auch in ein Gleiches platzieren, und dies fügt dann dem DOM hinzu. Diese Funktion ist für den Abzug in einer Sekunde verantwortlich, aber wir müssen diese Funktion immer noch jede Sekunde aufrufen. Um dies zu tun, springen wir in unsere Spielstartfunktion ein. den unteren Bereich setzen wir noch einmal Interval, In den unteren Bereich setzen wir noch einmal Interval, übergeben unsere Funktion, die den CountDownTimer ist , der jede Sekunde ausgeführt wird. Probieren wir das mal aus. Aktualisieren Sie und wir werden unseren Text ganz oben sehen. Du kannst anfangen. Dann beginnt unser Timer herunterzuzählen. Wenn wir jedoch noch einmal damit beginnen, werden Sie ein kleines Problem bemerken. Wenn wir genau hinschauen, beginnt der Countdown nicht für die erste Sekunde. Wir klicken. Wir müssen eine Sekunde vor dem Countdown warten. Dies passiert, weil setInterval die Funktion nicht sofort aufruft. Stattdessen wartet es zuerst auf die Zeitverzögerung und ruft dies dann danach auf. Dies ist eine ziemlich einfache Lösung. Alles, was wir tun müssen, ist unseren Countdown-Timer zu greifen und dies einmal anzurufen, kurz bevor unser Timer beginnt. Wenn wir jetzt aktualisieren, klicken Sie auf „Start“, unser Timer beginnt sofort. So können wir setInterval verwenden , eine wirklich nützliche Methode zum Lernen, ebenso wie eine andere Timing-Funktion, die als setTimeout bezeichnet wird. Das werden wir als Nächstes behandeln. 36. setTimeout: setInterval, das wir uns gerade angeschaut haben, ruft wiederholt eine Funktion auf oder führt einen Code mit einer Zeitverzögerung zwischen jedem Anruf aus. Eine andere Timing-Methode, die wir zur Verfügung haben , heißt setTimeout. setTimeout, um eine Funktion oder einen Code einmal nach einer Zeitverzögerung auszuführen . Wir können dies verwenden, um die EndofGame-Funktion auszuführen sobald der Timer hochgefahren ist. Es sieht ähnlich aus wie setInterval. Werfen wir einen Blick auf das ganz unten. Dieser ist setTimeout, das wie setInterval auch zwei Dinge aufnimmt. Erstens ist der Code, den wir ausführen möchten, und in unserem Fall möchten wir die EndofGame-Funktion ausführen. Trennen Sie es durch ein Komma, die Zeitverzögerung, bevor Sie diese Funktion in Millisekunden erneut ausführen . 2000 ist also eine Verzögerung von zwei Sekunden. Wir können diese Arbeiten testen, indem wir in die EndofGame-Funktion springen und uns bei der Konsole anmelden. Irgendwelche SMS, probier das aus. Also lasst uns das Ende machen. Öffne die Konsole. Gibt uns zwei Sekunden und unsere Funktion wird jetzt aufgerufen. Aber wir möchten, dass diese Funktion am Ende des Spiels ausgeführt wird. So können wir einstellen, dass die Zeitverzögerung der Länge des Spiels entspricht. Wir haben dies ganz oben in einer Variablen gespeichert, die als Spiellänge bezeichnet wird derzeit auf 300 Sekunden eingestellt ist. So funktioniert das, anstatt 300 Sekunden auf unseren Funktionsaufruf warten zu müssen , ich lasse dies einfach auf einen kleinen Wert wie drei senken. Ganz nach unten können wir dies jetzt als Zeitverzögerung festlegen . Da wir wissen, dass die Spiellänge in drei Sekunden liegt , wobei eine Zeitverzögerung in Millisekunden liegt, was bedeutet, dass wir dies konvertieren müssen , indem wir dies mit 1000 multiplizieren. Okay, versuchen wir es noch einmal, aktualisieren, und nach drei Sekunden wurde unsere Funktion jetzt aufgerufen. Also ein bisschen Bereinigungsarbeit, bevor wir weitermachen, entfernen wir unser Konsolenprotokoll und die Funktion zum Ende des Spiels. Sie die Spiellänge wieder auf 300 Sekunden ein. Gut. Das funktioniert jetzt also gut, aber um diesen Code vor dem Laufen zu bewahren , wenn das Spiel nicht gestartet wird, können wir dies in eine Funktion umwickeln. Erstellen Sie also eine Funktion namens GameTimer, legen Sie diese hinein und diese Funktion kann jetzt aufgerufen werden , wenn das Spiel zuerst startet. Gehe also zu unserer Spielstartfunktion , rufe unseren GameTimer an. Immer noch innerhalb dieser Funktion können wir eine Nachricht an den Benutzer weitergeben. Was wir also tun werden , ist, wenn wir uns diesen Nachrichtenbereich ansehen, werden wir in eine Nachricht schreiben, in der wir sagen: „Chef, unsere ersten Bestellungen kommen unsere ersten Bestellungen kommen ein, sobald das Spiel beginnt.“ Wir verwenden setTimeout und löschen dies dann nach einer gewissen Anzahl von Sekunden. Die Botschaft ist also nicht dauerhaft da. Um ganz unten zu beginnen, greifen wir den Abschnitt mit dem Abfrage-Selektor auf. Werfen wir einen Blick darauf, was der Selektor für diesen Teil im Nachrichtenbereich ist diesen Teil im Nachrichtenbereich und wir haben dieses p mit der ID der Nachricht. Dies ist eine ID, also benutze einen Hash wähle den InnerText-Inhalt aus. Meine Botschaft lautet : „Chefkoch, unsere ersten Befehle kommen herein.“ Kurz danach führen wir dann nach drei Sekunden eine Funktion aus, um diese Nachricht vom Bildschirm zu entfernen. Wieder einmal können wir setTimeout verwenden. Wie wir bereits erfahren haben, können setTimeout und setInterval entweder eine Funktion mit ihrem Namen aufrufen eine Funktion mit ihrem Namen oder eine Funktion direkt übergeben. Wir können diese Codezeile kopieren und diese einfügen. In der Tat werden wir diese Klammern kurz bevor wir das tun . Dies muss auf ein Gleiches festgelegt werden da InnerText eher eine Eigenschaft als eine Methode ist. Das Gleiche gilt für unseren zweiten. Lassen Sie uns diese als leere Zeichenfolge einstellen , und kurz nach unseren Klammern oder den geschweiften Klammern können wir die Zeitverzögerung von 3000 Millisekunden hinzufügen. Aktualisieren, klicken Sie auf „Start“ und unsere Nachricht wird jetzt im Nachrichtenbereich platziert und drei Sekunden später wurde sie nun entfernt. Gut. Dies ist also eine Einführung in JavaScript-Timer, die setInterval und setTimeout verwenden. Sie können sehen, wie nützlich es in solchen Projekten sein kann. Wir haben auch noch ein paar Timer, die wir sehr bald hinzufügen müssen. Aber als Nächstes werden wir uns ansehen, wie diese Timer gelöscht werden können, wenn sie nicht mehr benötigt werden. 37. Clearing: Wir haben diese beiden Timer jetzt abgedeckt, was setTimeout und auch setInterval dieser Methoden war . Habe auch eine klare Zählung Teil 2 von CleArtimeOut und auch ClearInterval. Diese klaren Methoden stoppen die Timer, wenn wir sie nicht mehr brauchen, und dies ist nützlich, wenn das Spiel vorbei ist. Wir können Dinge wie den Countdown stoppen, damit wir bei Bedarf neu starten können. Verbrauchen Sie keine Ressourcen des Browsers unnötig. Um einen Timer löschen zu können, müssen wir zuerst den ursprünglichen Timer in einer Variablen speichern . Zuallererst haben wir unseren OrderStimer, der unser setInterval enthält. Wir verweisen darauf in einer Variablen namens orderTimerRef, die einer leeren Zeichenfolge entspricht. Nun zu dieser nächsten Funktion haben wir den CountDownTimer, darin kein Timeout direkt enthält. Aber wenn wir zuerst einen Blick darauf werfen, heißt dieser mit setInterval. Wir werden direkt darüber verfügbar sein. Dieser ist der CountDownTimerRef. Auch eine leere Zeichenfolge. letzte ist der GameTimerRef. Beachten Sie hier, wie wir diese linken Variablen außerhalb jeder Funktion deklariert haben . Dies liegt daran, dass wir später in anderen Teilen unseres Codes nicht mehr darauf zugreifen können, wenn wir sie innerhalb der Funktion deklarieren später in anderen Teilen unseres Codes nicht mehr darauf zugreifen können, wenn wir sie . Wir müssen auf diese zugreifen, um die Timer zu löschen. Wir werden dies in einem späteren Abschnitt ausführlicher behandeln. Dieser erste wird unserem setInterval entsprechen. Die Spiel-Timer-Referenz entspricht unserem setTimeout. Wissen Sie auch, dass dieser mittlere, der CountDownTimerRef, unser Timeout nicht direkt enthält. Was wir tun können, ist zu unserer Funktion zu gehen, nämlich dieses StartofGame, und das dort einzurichten. Also diese StartofGame-Funktion. Stellen Sie den CountDownTimeRef auf den gleichen Wert von setInterval ein. Diese werden jetzt alle innerhalb von Variablen gespeichert. Kurz bevor wir das klären, müssen wir zuerst beweisen, dass sie laufen. Konsolenprotokoll kann uns dabei in unserer GenerateNewWorder-Funktion helfen. Funktion GenerateWorder, in ein Konsolenprotokoll platzieren. Es ist eigentlich in Ordnung, wie zum Beispiel Ordnung. [unhörbar] der Browser und aktualisieren. Starte das Spiel. Unser Timer beginnt zu Countdown. Wir sehen, dass unsere Nachricht jetzt nach drei Sekunden entfernt wurde . Unsere Bestellungen kommen immer noch ein, und auch unser Konsolenprotokoll hier. Aber du wirst feststellen, wenn wir auf „Ende“ klicken, unser Spiel beenden, unser Timer zählt immer noch runter, unsere Bestellungen kommen immer noch. Um dies zu beheben, können wir alle diese Timer löschen , wenn wir die EndofGame-Funktion aufrufen. Werfen Sie einen Blick darauf und dann rufen wir drinnen die ClearInterval-Methode analysieren in unserer OrderTimerRef. Das zweite ist auch ein Intervall, daher verwenden wir ClearInterval. Dies ist der CountDownTimerRef. Für den dritten war unser Game-Timer ein Timeout. Also benutzen wir CleArtimeOut dafür. Probieren Sie das noch einmal aus. Aktualisieren. Startet unser Spiel. Sehen Sie sich den Countdown an, wir sehen die Befehle. Klicken Sie auf die Schaltfläche „Ende“. Alles wurde jetzt gestoppt. Wenn wir erneut auf den „Start“ -Button klicken, alles von dort weiter, wo wir aufgehört haben. Wir sehen, dass der Timer von dort fortgesetzt wird, wo er angehalten wurde, und auch die Bestellungen kommen immer wieder von dort her, wo sie aufgehört haben. Aber das ist in Ordnung, wir werden sehr bald einige Bereinigungsarbeiten durchführen , um diese Probleme zu beheben. Die Hauptsache hier ist, dass unsere Timer jetzt gestoppt werden können, wenn sie nicht mehr benötigt werden. 38. Einführung In Javascript Datum: Viele Anwendungen und Websites erfordern, dass Sie sich des aktuellen Datums bewusst sind. Wir können das Anmeldedatum eines Benutzers, die Zeit zwischen zwei Ereignissen und vieles mehr verfolgen die Zeit zwischen zwei Ereignissen , aber dieses JavaScript verfügt über einige integrierte Objekte, die uns helfen können. Zu Beginn können wir date als Funktion, genau wie diese, mit den Klammern aufrufen . Speichern Sie dies dann innerhalb einer Variablen , dieses Datum entspricht unserer Datumsfunktion. Dann probieren wir das mit einem Konsolenprotokoll aus. Platzieren Sie die Datumsvariable und sehen Sie, was passiert. Aktualisieren und in die Konsole, die dann das aktuelle Datum und auch die Uhrzeit als String zurückgibt , ebenso wie die Konstruktorfunktion, die wir zuvor beim Erstellen eines neuen angesehen haben Objekte, die ich in das neue Schlüsselwort eingefügt habe. Mit dem neuen Datum können wir jedoch auch einige Werte übergeben , um auch ein anderes Datum zu erstellen. Springen Sie in die Klammern, damit wir im Jahr, die Indexnummer des aktuellen Monats, den Tag, die Stunden, Minuten, Sekunden und Millisekunden passieren können die Indexnummer des aktuellen Monats, den Tag, . Wir platzieren jedes Jahr, das wir wollen, dann den Monatsindex, der ebenfalls bei Null beginnt. Der Januar ist Null und der Dezember ist 11. Als Nächstes das Datum. Speichern und aktualisieren Sie dies in der Konsole. Dies spiegelt jetzt ein Datum wider , das wir gerade eingegeben haben. Dies bedeutet, dass diese Konstruktorfunktion uns die Möglichkeit gibt, entweder das aktuelle Datum abzurufen oder ein beliebiges Datum festzulegen , das wir möchten, genau so. Die Arbeit mit solchen Datumswerten kann schwierig sein. Wenn wir zwei verschiedene Daten vergleichen möchten, müssen wir möglicherweise die aktuelle Zeichenfolge genau wie in der Konsole verwenden, unsere Zeichenfolge aufteilen und dann jedes einzelne Stück vergleichen. Wie Sie sich vorstellen können, ist dies keine leichte Aufgabe. Ein alternatives Datumsformat besteht darin, eine Methode namens now zu verwenden. Wir können den Inhalt ab Datum verschieben. mit dem neuen Schlüsselwort Rufen Sie es mit dem neuen Schlüsselwort „Now-Methode“ auf. Probieren wir das aus und sehen , was in der Konsole passiert. Dies gibt uns eine merkwürdig aussehende Zahl zurück. Es mag etwas seltsam aussehen, aber es ist eine Zahl in Millisekunden seit dem 1. Januar 1970 UTC. Wenn wir weiter auffrischen, wird diese Zahl jedes Mal, wenn wir dies tun , weiter zunehmen. Obwohl es immer noch nicht ideal ist, kann es einfacher sein, Daten oder Zeiten zu vergleichen. Wenn sich ein Benutzer beispielsweise auf unserer Website anmeldet, können wir Date.now verwenden, um die aktuelle Uhrzeit in Millisekunden zu speichern. Bei zukünftigen Besuchen können wir dann die aktuelle Uhrzeit abrufen und die Differenz zwischen diesen beiden Zahlen vergleichen . Die Millisekunden müssten auch in Sekunden, Minuten und Tage konvertiert werden , je nachdem, was Sie damit tun mussten. Wir werden uns das in einem kommenden Video ein wenig genauer ansehen. Am Datumsprototyp ist eine Reihe von Methoden verfügbar , mit denen wir auch das Datum festlegen können. Werfen wir einen Blick auf diese in der Konsole. Wir könnten die Now-Methode verschieben. Greifen Sie auf das Prototyp-Objekt zu, aktualisieren Sie es und öffnen Sie es. Wie wir gerade gesehen haben, haben wir die Datumskonstruktorfunktion und viele weitere Anwendungsfälle, z. B. die Stunden abrufen, das vollständige Datum erhalten, den Tag abrufen. Wir haben auch die Setter, damit wir das aktuelle Datum einstellen können, wir können die Uhrzeit einstellen. Ich werde nicht all dies durchgehen, da sie sehr spezifisch für verschiedene Anwendungsfälle sind , aber es funktioniert wie jede andere Methode. Verwenden Sie sie, da sich Methoden auf Objekten befinden. Wir müssen erneut das Schlüsselwort new verwenden, um ein neues Datumsobjekt zu erstellen. Lassen Sie uns dies entfernen, in die Klammern legen und das neue Schlüsselwort hinzufügen. Eine der Methoden, die wir gerade in der Konsole gesehen haben , war GetMonth. Wir haben das für unsere Datumsvariable. Mal sehen, was in der Konsole zurückgekehrt ist. Dies gibt das Datum des aktuellen Monats zurück. Auch dies beginnt mit Null, also ist der Januar Null, und der Februar ist die Nummer 1 und so weiter. GetDay gibt das Datum der aktuellen Woche zurück. Probieren wir das mal aus. GetDay. Das ist es, was man mit dem Prototyp schon mal gesehen hat. Wir haben auch Zugriff auf einige Methoden, die auch das Datum festlegen. Vielleicht haben wir eine Veranstaltung , die wir bereits gespeichert haben , und vielleicht möchten wir den Monat oder das Jahr ändern, was wir genau so machen könnten. Hier haben wir das aktuelle Basisdatum. Lasst uns das einfach entfernen. Darunter ändern wir den aktuellen Monat in alles, was Sie möchten. Lassen Sie uns dies innerhalb einer Konstante speichern , die als aktualisiertes Datum bezeichnet wird. Schnappen Sie sich unsere aktuelle Datumsvariable, greifen Sie auf eine unserer festgelegten Methoden wie setMonth platzieren Sie eine Indexnummer von 11, die Dezember sein wird. Dann ein zweites Konsolenprotokoll direkt darunter, wieder mit dem Datum. Wir sollten in der Lage sein, die aktualisierte Version mit unserem zweiten Protokoll zu sehen . Aktualisieren Sie das. Wir beginnen mit März und legen dann unseren Monat auf Dezember fest. Dies ist eine grundlegende Einführung in das JavaScript-Datum. Als nächstes werden wir dieses Datum und die Uhrzeit innerhalb unseres Projekts nutzen und verfolgen, wie lange die Pizzen im Ofen sind. 39. Die Kochzeit Einstellen: Was wir im vorherigen Video gelernt haben, besteht die Aufgabe nun darin, die Kochzeit für die Pizza mit JavaScript-Datum festzulegen . Wir werden die Beispiele aus dem vorherigen Video verschieben . Jetzt haben wir in der Funktion „ Zum Ofen hinzufügen “ früh ein Platzhalterdatum erstellt. Werfen wir einen Blick auf diese Funktion im Ofen. Hier legen wir fest, dass die hinzugefügte Zeit eine Zeichenfolge ist. Dies kann jetzt aktualisiert werden, um das aktuelle Datum dynamisch zu nutzen . Wie wir gesehen haben, greifen wir auf das Date-Objekt und die jetzt aufgerufene Methode zu. Denken Sie daran, dass date.now in Millisekunden sein wird, sodass wir dies nach Ablauf einer bestimmten Anzahl von Millisekunden aus dem Ofen entfernen können . Aber bevor wir dies tun, müssen wir die Garzeit einstellen , die wir anwenden möchten. Diese Variable ist perfekt, also springe zum Rest der Variablen hoch. Richten Sie eine Konstante ein, die als Garzeit bezeichnet wird, die 20 Sekunden entspricht. Ganz unten in unserem Skript können wir hier eine neue Funktion platzieren, die alle Pizzen im Ofen einmal pro Sekunde durchläuft. Wir entfernen dann alle Pizzen, die für unsere Garzeit vorhanden waren . Funktion, überprüfen Sie den Ofen. Um den Ofen einmal pro Sekunde zu überprüfen , können wir ein festgelegtes Intervall verwenden. Wenn Sie möchten, können Sie eine separate Standalone-Funktion erstellen oder wir können direkt in die Funktion platzieren. Diese Funktion wird alle Elemente in unserem Ofen-Array durchlaufen. Dieses Ofen-Array wird in der Ofenvariablen gespeichert, Schleife wird für jeden verwendet. Auch hier nimmt für jeden eine Funktion ein, die Zugang zu jeder unserer einzelnen Pizzen im Ofen hat . Am Ende unserer festgelegten Intervallklammern können wir eine Zeitverzögerung zwischen jedem unserer Funktionsaufrufe platzieren , die jede Sekunde sein wird. Für jeden Artikel oder jede Pizza in unserer Schleife steht vor einer if-Aussage. Diese if-Anweisung wird die Zeitdifferenz jede Sekunde überprüfen . Wir können sagen, ob Datum, aber jetzt, was die aktuelle Uhrzeit in Millisekunden ist, dann die Garzeit abziehen. Denken Sie daran, dass die Kochzeit in Millisekunden beträgt. Konvertieren wir das, multiplizieren Sie dies mit 1000. In seiner aktuellen Berechnung wird uns die Zeit vor 20 Sekunden geben . Wir können prüfen, ob dieser Wert größer ist als die aktuelle pizza.time hinzugefügte Eigenschaft. Wenn ja, ist es in mehr als 20 Sekunden her und wir müssen es aus dem Ofen nehmen. Greifen Sie auf unseren Ofen zu Die Shift-Methode, mit der das 1. Element aus unserem Array entfernt wird . Wir müssen auch auf den 1. Artikel zugreifen, denn denken Sie daran, dass der 1. Artikel am längsten im Ofen sein wird. Dies wird immer der nächste sein, der entfernt werden muss. Nachdem wir diesen Artikel aus dem Array entfernt haben, müssen wir den Ofeninhalt mit der Funktion zurücksetzen , bei der ein Objekt angezeigt wird, das den Ofen effektiv neu zeichnet. Wir können hier auch die Anzahl der Pizzen verfolgen , die wir gekocht haben, indem wir eine Variable erhöhen. Die Variable der kompletten Pizzen erhöht sich mit Plus Plus. Wir haben das noch nicht erstellt, also springen wir mit den restlichen Variablen nach oben. Lassen Sie abgeschlossene Pizzen mit dem Wert von Null beginnen, und dieser Abschnitt wird später nützlich sein wenn wir unser Spiel hinzufügen . Schließlich haben wir diese Funktion tatsächlich erstellt, aber wir haben sie noch nicht aufgerufen. Was wir tun müssen, ist unsere Check-Ofen-Funktion aufzurufen , wenn wir das Spiel starten. Springen zum Start der Spielfunktion, platziert unten unten. Probieren wir das mal aus. Aktualisieren Sie die Seite. Beginn des Spiels. Klicken Sie auf eine beliebige Bestellung, fügen Sie diese dem Ofen hinzu und fügen Sie noch ein paar hinzu. Gib diese 20 Sekunden und unsere Pizza sollte dann entfernt werden. Der erste ist weg, oder der zweite kurz danach. Gefolgt von unseren letzten beiden Pizzen. 40. Einführung In Die Leinwand & Co-Ordinates: Wir können für dieses Projekt immer noch in unserem Projekt bleiben und uns unten einige Beispiele ansehen. Dieses Video behandelt einige der Canvas-Grundlagen. Dann werden wir im Rest dieses Abschnitts unsere Pizzen zeichnen und die verschiedenen Beläge zeigen, während wir sie hinzufügen. Lassen Sie uns zunächst einen wesentlichen Teil behandeln, und dies ist die Verwendung von Koordinaten zu verstehen. Es gibt ein HTML-Element namens Canvas, das es uns ermöglicht , mit JavaScript darauf zu zeichnen. Wir legen die Breite und die Höhe der Leinwand und können dann mit Koordinaten in diesem pixelähnlichen Raster navigieren . Die X-Achse verläuft von links nach rechts und die Y-Achse verläuft von oben nach unten. Mit diesen X- und Y-Positionen können wir zu einer beliebigen Stelle auf der Leinwand wechseln und x,0, y,0 ist die obere linke Ecke. Wir können dann jeden Betrag, den wir wollen, wie wir in diesem Beispiel sehen möchten, über oder nach unten bewegen , wobei x gleich 10 und y der Wert von 3 ist. Wir werden bald sehen, wie das Verständnis dieser Koordinaten für das Zeichnen auf der Leinwand unerlässlich ist. Zurück zu unserem Projekt und in unsere HTML-Datei. Wir haben bereits ein Canvas-Element eingerichtet. Wenn wir einen Blick auf unseren Küchenbereich werfen, haben Sie diese Leinwandelemente mit der ID des Pizzabereichs. Es hat die Breite von 250 und auch die Höhe von 250 Pixel. Springen Sie in unser Drehbuch und gehen wir ganz zum Ende unseres Drehbuchs. Erstellen Sie eine Konstante namens Canvas , um diese in zu speichern. Wie alle anderen Elemente können wir etwas wie document.queryselector verwenden. Wie wir gerade gesehen haben, können wir einen Ausweis weitergeben. Dieser ist gleich pizza_area. Dann können wir eine Methode namens GetContext aufrufen. Nehmen Sie unsere Variable und rufen Sie die getContext-Methode auf. Eine Reihe von 2D übergeben. In diesem Zusammenhang ist ein Objekt, das Eigenschaften und Methoden enthält , mit denen wir auf die Leinwand zeichnen können . Wir werden nur die 2D-Funktionen für diese Beispiele benötigen . Installieren Sie dies innerhalb einer Variablen oder einer Konstante, die im Allgemeinen CTX genannt wird, aber dies kann alles genannt werden, was Sie möchten. Bei Verwendung der Leinwand sind zwei Konzepte, die wichtig zu verstehen sind , Strich und Füllung. Strich ist wie eine Bleistiftlinie oder ein Umriss und Füllung füllt, genau wie es klingt, eine Form mit einer Volltonfarbe. Um ein Rechteck zu zeichnen, haben wir StrokeRect und auch die FillRect Methode. Werfen wir zunächst einen Blick auf StrokeRect. Obwohl gezeichnete Features im Kontext verfügbar sind. Um den Umriss eines Rechtecks zu zeichnen, verwenden wir StrokeRect und geben dann vier Werte ein. Die ersten beiden, wie wir es in den Folien gesehen haben, sind die X- und die y-Position für die obere linke Ecke unseres Rechtecks. Wenn wir möchten, dass dies oben links beginnt, setzen wir dies auf 0,0. Dann haben wir die Breite und die Höhe des Rechtecks , das Sie zeichnen möchten. Dies könnte entweder ein Rechteck sein oder auch zum Zeichnen eines Quadrats verwendet werden , wenn wir gleiche Werte übergeben . Werfen wir einen Blick auf das. Wir sagen dies und springen in den Browser, aktualisieren dies und wir sehen den Umriss unserer 200 Pixel mal 200 Pixel Pixel Quadrat. Sowie auch fest codierte Werte wie diese übergeben . Wir können auch von oben auf unsere Canvas-Variable zugreifen. Übergeben Sie dies und greifen Sie auf die Eigenschaft width zu. Wir haben diese beiden bereits in unsere Elemente gesetzt. Wir haben 250 Pixel für diese beiden Werte. Wir können diese als Variablen einfügen. Probieren Sie dies aus, aktualisieren Sie es und da dies 250 Pixel sind, ist dies jetzt etwas größer als wir ursprünglich hatten. Die Verwendung dieser Variablen ist sehr nützlich und wir können auch Berechnungen basierend auf ihrer Größe bereitstellen. Wenn wir beispielsweise nur wollen, dass dies die halbe Breite der Leinwand beträgt, könnten wir dies durch 2 teilen. Wenn Sie möchten, dass dies ein solides Rechteck oder ein solides Quadrat ist, können wir den Strich in FillRect ändern. Dies füllt dies mit der Standardfarbe schwarz. Das Standardschwarz sieht im Allgemeinen nicht gut aus, und wir können diese Farbe auch ändern. Lassen Sie uns unsere Rechtecke duplizieren und wir machen das erste als Strich, und das zweite machen wir das nur ein bisschen anders. Lass uns 100 mal 100 gehen. Stellen, 20 Pixel von oben links auf der Leinwand. Jetzt haben wir einen Strich und ein gefülltes Rechteck. Wir können für jede dieser Farben verschiedene Farben angeben , beginnend mit dem Strich. Greifen Sie erneut auf den Kontext zu. Da benutzen wir einen Strich und passieren den StrokeStyle. Stellen Sie dies auf einen CSS-ähnlichen Wert, z. B. grün. Ich werde sehen, dass die grüne Farbe in Kraft getreten ist. Dann knapp über unserem gefüllten Rechteck. Wir können auch auf den Kontext zugreifen und die Eigenschaft FillStyle bereitstellen die Eigenschaft FillStyle , um dieses zweite Quadrat zu beeinflussen. Dies entspricht jeder anderen Farbe. Speichern Sie dies und aktualisieren Sie es. So können wir für jede unserer Formen verschiedene Farben festlegen . Diese API hat auch eine Arc-Methode, um beim Zeichnen von Bögen und Kreisen zu helfen. Wie immer greifen wir im Kontext ctx.arc darauf zu. Im Gegensatz zu den Quadraten , die wir gerade alle Rechtecke gezeichnet haben, in denen die Startposition oben links basiert, mit einem Kreis basiert dies auf der Mitte. Wir können auf die Canvas-Breite für die X-Achse zugreifen. Teilen Sie dies durch 2 auf Stellen in der Mitte der Leinwand und auch für die Höhe gleich. Dies ist der Ausgangspunkt für unseren Kreis, aber wir müssen noch einige weitere Informationen bereitstellen. Der nächste ist der Radius unseres Kreises. Wenn Sie mit Radien nicht vertraut sind, ist dies im Grunde die halbe Breite des Kreises. Der Wert vom Mittelpunkt nach außen. Lass uns für 100 gehen. Dann die letzten beiden Werte am Start- und Endwinkel. Diese Werte sind eher im Bogenmaß als in Grad. Zu Beginn fügen wir einen Startwinkel von Null und dann den Endwinkel hinzu, einen Wert von zwei Bogenmaß. Lassen Sie uns dies speichern und sehen , was im Browser passiert. Wenn wir neu laden, sehen wir keine Zeichnungen auf der Leinwand. Dies liegt daran, dass wir sagen müssen, ob es sich um eine Strichlinie oder eine solide Füllung handelt, wie oben. Greifen Sie danach auf den Kontext zu. Halten Sie die Füllmethode fest, erfrischen Sie sich und hinterlassen Sie eine schöne lächelartige Kurve. Oder wir können die Linie einfach mit einem Strich mit ctx.stroke machen. Sie können auch sehen, dass wir jetzt die Strichlinie machen. Dies wird auch den Strichstil von Grün erben. Um den Kreis im Bogenmaß zu schließen, müssen wir diesen Wert von 2 mit math.pie multiplizieren , was dem Grad entspricht 360 Grad. Es gibt unseren grünen Kreis und wie Sie jetzt sehen können, haben wir einen vollen Kreis. Dies wird aufgrund unserer X- und Y-Standorte auch in der Mitte der Leinwand platziert . Kurz bevor wir dies tatsächlich mit Strich oder Füllung auf die Leinwand zeichnen , können wir auch einige zusätzliche Eigenschaften wie die Linienbreite und auch die Farbe festlegen . Beginnen wir mit der Eigenschaft line width, die wir auf einen Pixelwert von fünf festlegen. Dann ist der StrokeStyle auch im Kontext verfügbar. Dies ist der gleiche Wert, den wir oben verwendet haben , um diesen auf grün zu setzen. Aber jetzt überschreiben wir dies , um eine andere Farbe zu haben. Vorher habe ich erwähnt, dass dies eine CSS-ähnliche Eigenschaft ist , also nur die Wörter wie Grün oder Hot Pink verwenden, können wir nicht nur die Wörter wie Grün oder Hot Pink verwenden, sondern auch Dinge wie den x-Wert übergeben und diese auf eine andere Farbe einstellen. Ich gehe für f5cf89. Probieren Sie das aus und hinterlassen Sie eine 5-Pixel-Linie in einer anderen Farbe. Neben diesen Methoden zum Zeichnen voreingestellter Formen können wir auch Freihandlinien wie ein Bleistiftwerkzeug zeichnen , wenn Sie in der Vergangenheit eine Zeichnungsanwendung verwendet haben . Um dies zu demonstrieren, können wir dieses grüne äußere Rechteck oder Quadrat replizieren und diese freie Hand zeichnen. Wir können das erste Rechteck kommentieren, das diese beiden Zeilen sind. Dann zeichne das selbst mit Koordinaten. Diese sind alle im Kontext verfügbar. Die erste Methode wird MoveTo sein. MoveTo ist im Grunde so, als würde man unseren Bleistift aufheben diesen auf einen bestimmten Teil des Papiers verschieben , von dem wir beginnen möchten. Dies wird unsere Koordinaten bewegen ohne tatsächlich eine Linie zu ziehen. Genau wie unser ursprüngliches Quadrat beginnt dies oben links auf der Leinwand. Um tatsächlich zu zeichnen, verwenden wir die Methode LineTo, die eine Bleistiftlinie von unserem Startort zu Ort zeichnet, den wir hier einsetzen. Wie oben können wir genau wie diese fest codierte Werte einfügen oder wir können auf die Variablen wie canvas.width und canvas.height zugreifen . Machen Sie dies zu einer vollen Breite der Leinwand, über die Sie direkt hinübergehen können, und greifen Sie auf canvas.width zu. Da wir nicht auf der X-Achse nach unten gehen wollen, können wir dies auf den Wert Null belassen. Lasst uns auffrischen. Wir sehen die Zeile noch nicht auf dem Bildschirm , da wir ctx.stroke aufrufen müssen , um dies auf die Leinwand zu zeichnen. Dies ist unser erster Teil unseres Platzes. Der nächste Teil besteht darin, nach unten zu gehen und diese vertikale Linie von unserem aktuellen Standort aus zu zeichnen , Zugriff auf ctx, die LineTo. Wir wollen immer noch auf der rechten Seite bleiben , auf die wir mit einer Breite von 250 oder wieder mit der canvas.widthproperty zugreifen können mit einer Breite von 250 oder wieder mit der canvas.widthproperty zugreifen . Gib das ein, canvas.width. Um dann an den unteren Rand der Leinwand zu gehen, können wir mit canvas.height darauf zugreifen. Dupliziere das. Wir bleiben auf dem gleichen Höhenwert von 250. Aber jetzt müssen wir auf die linke Seite gehen, was dem x-Wert von Null entspricht. Speichern, aktualisieren. Es ist nur noch eins übrig. Aber jetzt müssen wir in die obere linke Ecke gehen, was die Position von 0,0 ist. Gut. Dies ist jetzt auf der Leinwand im Quadrat, wir können auch ganz am Anfang eine Methode hinzufügen, den Anfangspfad halten, der auch im Kontext verfügbar ist. Wir werden dies ganz am Anfang platzieren, kurz bevor wir anfangen, unsere Form zu zeichnen. Dies ist nützlich , da es alle vorhandenen Pfade von oben löscht , sodass wir keinen Konflikt bekommen. Es bedeutet auch, dass die Ausgangsposition in Erinnerung bleibt. Wir können den geschlossenen Pfad verwenden, um jederzeit zu diesem Ort zurückzukehren . Um dies zu sehen, können wir unsere letzte Zeile entfernen, aktualisieren. Anstatt dies manuell zu zeichnen, können wir jetzt mit ctx.closepath zu unserem Startort zurückkehren . Es sollte genauso funktionieren wie zuvor an den ursprünglichen Standort zurückkehren. Neben dem Erstellen von Quadraten, Rechtecken, Kreisen und auch Freihandzeichnen können wir auch Text auf die Leinwand schreiben. Zuerst können wir die Schriftart festlegen, die wir verwenden möchten, ctx.font, und diese auf eine Zeichenfolge setzen. Die Zeichenfolge kann die Größe der Schriften und auch die Schriftfamilie annehmen. Die Methode zum Zeichnen unseres Textes ist Ctx.FillText. Wie Sie wahrscheinlich vermutet haben, gibt es auch eine entsprechende strokeText-Methode. Der erste Wert ist eine Zeichenfolge unseres Textes, ich sage nur Canvas API. Dann ein x- und y-Speicherort, der die Basislinie unseres Textes ist, also 20 und 200, Speichern und Aktualisieren. Es gibt unseren Text und er ist auch rosa, weil er die vorherige FillStyle-Eigenschaft erbt , die von oben haben wird. Canvas kann auch für viele andere Dinge verwendet werden, und auch für andere Methoden, die wir untersuchen können , und wir können der Leinwand sogar Bilder hinzufügen, die wir bearbeiten können, indem wir auf die Pixel zugreifen. In den kommenden Videos werden wir eine Leinwand verwenden, um die Pizzen zu kreieren und auch die Beläge anzuzeigen , die wir in der Küche hinzugefügt haben. 41. Einrichten Der Zutaten: Oben im Skriptbereich haben wir ein Inhaltsstoff-Array mit einigen Zutaten, die wir brauchen, um Pizzen zu machen. Diese Saiten stimmen alle mit den Zutaten , die in den erforderlichen Schritten von oben benötigt werden. Wenn wir also zum Pizzas-Array gehen, sehen wir das erforderliche Schritt-Array. Dies enthält die Saiten , die zu unseren Inhaltsstoffen passen. Wenn Sie eine dieser Pizzen ändern , um verschiedene Zutaten zu verwenden, stellen Sie sicher, dass das Inhaltsstoff-Array ebenfalls aktualisiert wird , damit es ebenfalls übereinstimmt. Das wird bald sehr wichtig sein. Was wir in diesem Video tun werden, ist, all diese Zutaten zu durchlaufen , all diese Zutaten zu durchlaufen und sie dann als Knöpfe im Küchenbereich anzuzeigen. Sobald eine Pizza ausgewählt wurde, kann der Koch diese Methode befolgen und die Pizza mit diesen Knöpfen zubereiten. Auch wenn man die Leinwand nutzt, zeichnet jeder Knopf die Zutaten auf die Pizza. Scrollen wir nun bis zum Ende unseres Projekts und bereinigen Sie die Beispiele aus dem vorherigen Video. Also brauchen wir nichts wie den Text. Wir brauchen den Freihandbereich nicht. Wir brauchen den Kreis nicht. Benötige keines dieser Quadrate oder Rechtecke. Aber wir müssen Zugriff auf unsere Leinwand und auch auf den 2D-Kontext behalten . Erstellen Sie danach eine neue Funktion namens ListIngredients, die alle Inhaltsstoffe von oben durchläuft und diese im Browser anzeigt. Um auf unser Inhaltsstoff-Array zuzugreifen Da es sich um ein Array handelt, können wir die forEach-Methode verwenden, die für jeden dieser Werte eine Funktion ausführt. Diese Funktion wird auch eine Zutat aufnehmen , die jedem Array-Wert entspricht. Dann müssen wir für jede dieser Zutaten ein Button-Element erstellen . Damit wir eine manuell erstellen oder uns daran erinnern können, haben wir auch Zugriff auf unsere Hilfsfunktion namens BuildeLement. Dies nimmt zwei Dinge auf. Das erste ist die Art der Elemente, die wir erstellen möchten, eine Schaltfläche. Der zweite ist der anzuzeigende Textinhalt. Dies sind die Zutaten aus unserem Array, bewahren Sie diese in einer Konstante namens IngredientElement auf. Dann können wir für unser Styling auch eine Klasse namens Zutat hinzufügen , um auf unsere Konstanten zuzugreifen, und den Klassennamen der Zutat hinzufügen. Die letzte Stufe besteht darin, dies dem DOM, documents.querySelector hinzuzufügen . Der Abfrageselektor , den wir benötigen. Werfen wir einen Blick auf die Indexseite. Wir brauchen dieses Div mit der ID der Zutaten. Hier drin platzieren wir den gesamten Inhalt unseres Arrays. Gib das als String ein. Wir verwenden AppendChild, der unsere Konstante von oben übergibt. Also könnten wir diese neue Funktion sofort aufrufen. Aber es wäre wahrscheinlich sinnvoll, dies der GameStart-Funktion hinzuzufügen dem Spielbeginn zu suchen. Hier drin rufen wir es von unten an. Sparen Sie, und probieren wir es dann aus. Aktualisieren. Klicken Sie auf die Schaltfläche Start und alle unsere Zutaten werden jetzt unten in der Küche platziert. Für den nächsten Schritt müssen wir in der Lage sein, auf eine dieser Zutaten zu klicken auf eine dieser Zutaten und dann etwas zu tun. Dieses Etwas wird eine Funktion sein um die Schritte zu verfolgen , die wir ganz nach unten unternommen haben. Erstellen Sie eine neue Funktion namens StepComplete. Dann eine zweite Funktion , die die Zutaten auf die Leinwand zeichnet . Funktion, mach Pizza. Diese StepComplete-Funktion muss aufgerufen werden, wenn der Benutzer von oben auf eine unserer Inhaltsstoffe klickt. Kurz bevor wir dies zum DOM hinzufügen, können wir dazu einen Ereignis-Listener hinzufügen, indem wir auf unseren IngredienteElements.Add Ereignis-Listener zugreifen . Dies jetzt für einen Klick, der eine Funktion namens StepComplete auslöst. Da es sich um ein Klickereignis handelt, werden auch die Ereignisinformationen aufgenommen, die wir in der Variablen speichern können. Diese StepComplete e-Funktion kann jetzt auch verwendet werden, um die Schaltfläche nach dem Anklicken zu deaktivieren und auch diese Schritte zu verfolgen, die wir unternommen haben. Schritt 1 deaktiviert die Schaltfläche, wenn der Benutzer darauf klickt. Wir können also nicht zweimal angeklickt werden. Ich werde dies tun, indem ich mit e.target auf unsere Elemente zugreife . Wir können ein Attribut festlegen. Das Attribut ist mit dem Wert „true“ deaktiviert. Dann Schritt 2 müssen wir auf den eigentlichen Textinhalt unserer Schaltfläche zugreifen . Also werden wir den Namen der Zutat kennen. Zum Beispiel müssen wir den Rollteigtext, die Pizzasauce oder den Käse und so weiter greifen . Speichern Sie dies in einer Konstante namens Schrittname, greifen Sie mit e.target auf unsere Elemente zu. Dann der innere Textinhalt. Bevor wir weiter gehen, prüfen wir, ob das funktioniert. In ein Konsolenprotokoll legen. Wir haben Schrittnamen. Auf den Browser und in die Konsole. Starte das Spiel. Klicken Sie auf einen unserer Buttons wie Käse, Pizzasauce. Diese Schaltflächen sind jetzt auch deaktiviert. Verfolgen Sie die Schritte , die wir unternommen haben, alle Schaltflächen, auf die wir geklickt haben. Wir müssen dies innerhalb einer Variablen speichern , die ein Array enthält. Springen Sie also zu unseren Variablen hoch. Lassen Sie unten abgeschlossene Schritte einem leeren Array entsprechen. Runter nach unten. Wir können jetzt das Konsolenprotokoll entfernen, auf diese Variable der abgeschlossenen Schritte zugreifen, auf die Push-Methode und dann einen neuen Wert auf dieses Array verschieben, welches unser Schrittname ist. Das Letzte ist, unsere Make-Pizza-Funktion zu nennen , um eine neue Zutat auf die Leinwand zu zeichnen. Natürlich macht es noch nichts, aber wir können dies innerhalb der Funktion platzieren. Also mach Pizza. Geben Sie Pizza-Zutat des Schrittnamens ein. Da wir nun Zutaten übergeben haben, können wir dies in unsere Funktion einstellen und testen, ob dies mit einem Konsolenprotokoll funktioniert. Entfernen wir einfach alle anderen Konsolenprotokolle, die wir haben. Also haben wir die Bestellverpackung, haben den Ofen, Bestelltext. Aktualisieren Sie dann, starten Sie erneut und klicken Sie auf eine dieser Zutaten. Da sind wir los. Es gibt unsere neuen Zutaten aus Make-Pizza-Konsolen-Log. Dies macht uns nun bereit, bestimmte Zutaten tatsächlich auf die Leinwand zu zeichnen. Wenn die Make-Pizza-Funktion zum Beispiel Pizzasauce erhält, wird sie etwas rote Soße auf unsere Pizza zeichnen. Das ist es, worauf wir als Nächstes weitermachen werden. 42. Zeichnen kreisförmige Zutaten: Unten in unserem Skript haben wir derzeit diese MakePizza-Funktion und diese wird jedes Mal aufgerufen, wenn ich neue Zutaten hinzufüge. Es ist auch über diese Zutaten hinausgegangen. Was ich jetzt gerne machen möchte, ist eine Switch-Anweisung zu erstellen , um zu behandeln , auf welche Zutat geklickt wurde. Wir können diese Zutat dann auf unsere Pizza an der Leinwand zeichnen . Da wir, wie bereits erwähnt, verschiedene Inhaltsstoffoptionen haben , ersetzen wir diese durch eine Switch-Anweisung, um jeden unserer Fälle zu behandeln. Übergeben Sie die Zutat, auf die geklickt wird, und dann erstellen wir für jeden einen Fall. Im ersten Fall wird dies eine Zeichenfolge sein, und wenn wir oben nach oben scrollen, haben wir unsere Zutaten genau hier und jeder der Fälle wird mit jeder dieser Saiten übereinstimmen. Zurück unten war der erste in den Hauptstädten für ROLL DOGHT. Wir werden uns in einem Moment darum kümmern, was zu tun ist, aber im Moment brechen wir einfach davon aus und kopieren einfach jede unserer Zutaten. Der zweite Fall, dieser war PIZZA-SAUCE. Die dritte für CHEESE und dann PEPERONI. Der nächste war für HAM und ANANAS. Ich werde das nur als Zutaten belassen und Sie können den Rest hinzufügen, wenn Sie es vorziehen, aber ich werde weitermachen, weil das sonst wirklich lang sein wird . Jetzt können wir in jedem dieser Fälle einige Leinwandzeichnungsfunktionen einrichten, können wir in jedem dieser Fälle einige Leinwandzeichnungsfunktionen einrichten um die jeweiligen Inhaltsstoffe darzustellen. Für den Teig, für die Pizzasauce und auch für den Käse können diese einigermaßen einfach sein, wir müssen nur ein paar Kreise zeichnen. Wir fangen mit dem Rollteig an. Wir wissen aus früheren Videos , dass wir ctx.arc verwenden, um einen Kreis auf der Leinwand zu zeichnen , dann geben wir den Startort dann geben wir den Startort an , der sich in der Mitte befinden wird. canvas.width geteilt durch zwei und auch das Gleiche für die Höhe. Dies ist die Start-X- und Y-Position. Der nächste wird der Radius sein. Lass uns 100 Pixel lang gehen. Wie früher ist die Startposition Null, um einen vollen Kreis im Bogenmaß zu erzeugen , und dann ist die Endposition zwei multipliziert mit dem Wert von Math.Pi. Denken Sie daran, dass aus früheren Videos, als wir ctx.arc verwendeten, es anfangs nichts auf die Leinwand gezeichnet hat. Was wir tun müssen, ist entweder ctx.stroke oder ctx.fill zu verwenden , um dies zu zeichnen , aber tatsächlich werden wir beide verwenden. Der Grund dafür ist, dass wir die Füllmethode verwenden, um die gesamte Pizzabasis auf die Leinwand zu zeichnen . Wir werden auch eine zusätzliche Strichmethode durchführen, die diesem Teig auch einen äußeren Kreis von 15 Pixeln hinzufügt . Der Grund dafür ist, dass wir dies auf eine etwas andere Farbe einstellen , um uns die Wirkung der äußeren Kruste zu verleihen . Zunächst einmal werden wir uns auf die Kruste konzentrieren und dies mit ctx.LineWidth tun, dies auf einen Wert von 15 Pixel setzen, dann legen wir die Farbe fest, wobei StrokeStyle in einer Zeichenfolge übergeht was ein Hexadezimalwert von f5cf89 sein wird und um dies schließlich zu zeichnen, verwenden wir ctx.stroke. Dies sollte uns jetzt einen Umriss geben, der auf unserem Bogen basiert. Probieren wir das aus, erfrischen, nochmal anfangen, eine unserer Pizzen auswählen, den Rollteig, und wir sehen jetzt den äußeren Kreis unserer Pizza. Wie bereits erwähnt, ist dies die Kruste, daher müssen wir auch die Füllmethode hinzufügen um auch den inneren Teil des Kreises zu füllen, aber eine etwas hellere Farbe kurz nach dem Strich. Geben Sie die Farbe für unsere Füllmethode ein und diese wird f5d69d sein, dann füllen Sie den Kreis mit dieser Farbe. Probieren wir das mal aus. Steigen Sie wieder ein und fangen Sie erneut an, wählen Sie eine unserer Pizzen aus. Teig rollen. Wir sollten diese schwarze Farbe nicht haben, also schauen wir uns mal an. Dieser FillStyle braucht eigentlich nur den Hash kurz zuvor. Beginne. Wählen Sie eine unserer Pizzen aus, rollen Sie den Teig und es sieht jetzt viel besser aus. Nun, bis hin zu unserer Pizzasauce, die auch ein Kreis sein wird , aber etwas kleiner als unser Teig. Wir haben keine Konflikte von oben. Wir beginnen diesen Abschnitt mit Ctx.BeginPath. Dies braucht auch einen Kreis, damit wir die ctx.arc-Methode von oben kopieren können, die sich ebenfalls in der Mitte der Leinwand befinden muss . Wir müssen die Farbe ändern. Dies wird gefüllt, also verwenden wir FillStyle, und dieser wird ed4434 sein, endlich ctx.fill aufrufen. Als nächstes gehen wir auch zum Käse über, der immer noch eine kreisförmige Join-Funktion ist. Wir kopieren die gesamte Pizzasoße, fügen ihn in unser Käsegebiet ein, machen den Kreis etwas kleiner, damit wir die Sauce immer noch am Rand sehen können , aber wir müssen auch die farbe. Dieser ist f7bc4d. Sparen wir uns das auf und probieren es aus, bevor wir weiter gehen. Auch hier können wir jede Pizza, Ananas, Rollteig auswählen . Das ist in Ordnung, wie wir gesehen haben. Als nächstes probieren wir die Pizzasauce aus und das ist alles in Ordnung und dies umfasst den gleichen Füllabschnitt wie die obige Teigfläche, aber wir können immer noch den Strichumriss von oben sehen. Als nächstes haben wir den Käse, der ein etwas kleinerer Kreis ist , damit er nicht die gesamte Tomatenbasis vollständig verdeckt. Gut. Wir lassen diesen vorerst hier und im kommenden Video werfen wir einen Blick auf die nächsten Zutaten, die ein bisschen komplexer sein werden als diese Kreise. Anstatt Kreise zu erstellen, wie wir es gerade tun, werden wir mehrere Teile an verschiedenen Orten einbeziehen . Wir sehen uns im nächsten, wo wir uns ansehen werden, wie das geht. 43. Zeichnung mehrerer Stücke: meine Version dieser Switch-Aussage losgehe, habe ich immer noch die Peperoni, den Schinken und auch die Ananasstücke zu kreieren. Da es sich um einzelne Stücke handelt, werden wir viele verschiedene Formen auf unsere pizzaförmige Leinwand gezeichnet . Um zu beginnen, in den Peperoni, direkt unter dem Fall, wir eine Reihe von Orten erstellen, da wir mehrere Stücke für diese Zutaten verwenden müssen wir eine Reihe von Orten erstellen, da wir mehrere Stücke für diese Zutaten verwenden. Const, Peperoni-Positionen, die ein Array sein wird. In der Tat wird dies ein Array von Arrays sein , da dies ein Array mit mehreren Werten sein wird . Außerdem muss jeder dieser Werte eine x- und eine Y-Position für jedes dieser Teile haben . Der erste, und natürlich müssen diese alle innerhalb der Dimensionen der Pizza gehalten werden. Aber das sind alles Zufallszahlen. Wir können diese hinzufügen und mit ihnen herumspielen , wenn Sie danach möchten, oder Sie können zusammen mit meinen kopieren. Der dritte wird 147 und 57 sein. Denken Sie daran, dass jedes dieser Sub-Arrays ein neues Stück Peperoni sein wird. Die vierte, Sie können so viele oder so wenige hinzufügen , wie Sie möchten, 116, 134, 125, 190, 162, 165, 190, 85, 192, 142, 150, 115, 76, 95. Ich möchte noch ein paar Stücke anfangen. Gehen wir für 80, 190 und den letzten, 61 und 135. Stellen Sie sicher, dass dies kurz vor der Break-Klausel ist und bevor wir etwas anderes tun, überlegen wir uns genau, was wir hier tun müssen. Ein Stück Peperoni ist nur ein kleiner Kreis. Wir wissen, wie man das mit dem Bogen zeichnet. Der Unterschied muss diesen Bogen jedoch für jeden dieser Orte wiederholen . Hier kann eine Schleife ins Spiel kommen. Was wir tun werden, ist, dass wir unsere Konstanten von Peperoni-Positionen greifen . Dann rufen wir eine für jede Schleife für dieses Array auf. Übergeben Sie eine Funktion , die den Variablennamen des Stücks aufnimmt. Das Stück wird jedes dieser einzelnen Peperoni-Stücke sein, die wir zeichnen werden. Um dies zu tun, beginnen wir mit Ctx.BeginPath ohne vorhandene Pfade , die gezeichnet werden können. ctx.arc, zeichne jeden der Kreise für die Peperoni-Stücke. Denken Sie daran, dass dies die X- und die Y-Position für die Mitte des Kreises annimmt . Da wir auf den oben genannten Standorten basieren müssen, werden wir auf unser Stück zugreifen. Die erste Indexposition von Null und für den y-Standort ist es Frieden und dann die Indexnummer von Eins. Gib das ein. Stück, greifen Sie auf die Indexzahl von Null zu, der y-Standort ist diese Ruhe und die Indexnummer von eins, Größe von 10. Lassen Sie uns einen Kreis als Null erstellen und dann Math.PI multipliziert mit 2. Geben wir ihm eine Farbe mit Ctx.FillStyle. Kurz bevor wir das zeichnen, was einer Zeichenfolge entspricht, möchte ich den Hexadezimalwert von BD 3611 wählen. Dann zeichnen wir das schließlich mit ctx.fill geben Sie diesem unsere feste Hintergrundfarbe. Probieren wir es mal aus. Springe in den Browser. Wir müssen unser Spiel beginnen und eine unserer Bestellungen auswählen. Auch Pizza, wir rollen den Teig, fügen die Quelle hinzu, den Käse. Wir wissen, dass das funktioniert, als nächstes die Peperoni. Es gibt alle unsere Kreise, die alle auf unserem Array basieren, das wir hier erstellt haben. Gut. Jetzt bis zum Schinken und Sie können uns auch ausprobieren, wenn Sie es wollen, fühlen Sie sich sicher, dies zu tun. Dies wird auf einem ähnlichen Ansatz wie oben beruhen . Zuerst müssen wir unsere Schinkenpositionen erstellen, bei denen es sich um ein Array handelt, das auch Subarrays enthält, jetzt X- und Y-Standorte enthalten. Lassen Sie uns diese zuerst erstellen und in einer Konstante namens HamPositions speichern , unserem Haupt-Array. Erstellen Sie dann unsere zufälligen Standorte. Der erste, der zweite von 108, 74, Nummer 3, 147, 47, 130, 124. Auch hier können Sie diese völlig zufällig machen und diese ändern, wenn Sie möchten, 125, 160. Stellen Sie sicher, dass diese alle im Pizza-Leinwandbereich 159, 145, 197, 82, 202, 132, 158 und 90 bleiben im Pizza-Leinwandbereich 159, 145, 197, 82, 202, . Wir sind jetzt fast da, lass uns mit den letzten beiden weitermachen , wir machen 90, 140 und den letzten von 105 und 135. Genau wie oben werden wir diese mit einer forEach-Schleife durchlaufen . Wir wählen unsere Schinkenpositionen als forEach-Schleife bezeichnet werden, im Array, die jedes Stück eine Funktion annimmt. Aber dieses Mal, anstatt Kreise mit der Bogenmethode zu erstellen , verwende ich die FillRect -Methode, um diese als Rechteck zu zeichnen. Zuerst legen wir eine Farbe mit Ctx.FillStyle fest und setzen diese auf eine Zeichenfolge, die f58c8c ist. Als Nächstes Ctx.FillRect. Zeichnen Sie ein solides Rechteck auf der Leinwand. Genau wie oben wird dies die X- und Y-Positionen einnehmen , die wir mit unseren Array-Positionen x genau so zugreifen können . Dies ist das Stück und die Indexzahl von Null, die entspricht jedem dieser ersten Array-Werte. Dann der zweite Array-Wert des Stücks, was in der Indexnummer von eins steht. Denken Sie daran, dass dies die X- und Y-Position für die obere linke Ecke des Rechtecks oder des Quadrats ist die obere linke Ecke des Rechtecks oder des Quadrats Wir müssen auch die Größe einstellen, die wir auf acht Pixel breit einstellen möchten , 32 Pixel hoch. Probieren wir das aus, bevor wir weiter gehen. Das ist für den Schinken. Klicken Sie darauf und wir haben jetzt viele rosa Schinkenstücke auf Pizza. Sie können mit den Positionen herumspielen, wenn Sie es ein bisschen besser aussehen lassen möchten. Aber ich gehe dem nächsten weiter, nämlich Ananas. Um wenig Zeit zu sparen, wird vieles davon unserer Schinkenposition ähneln . Kopieren wir also all diesen Abschnitt, einschließlich der for-Schleife. Fügen Sie dies direkt unter unseren Ananas-Etui ein. Natürlich werden es die Ananaspositionen sein. Ändere es für die Schleife. Machen Sie danach mit diesen Werten herumzuspielen , wenn Sie möchten. Für den FillStyle ändern wir die Farbe dieser in die gelbe Farbe von ebe534, machen sie in Bezug auf Größe 12 und 18 ein wenig anders . Erstellen Sie die Zellen im Browserstart. Unsere Pizza. Die Ananas funktioniert auch. Wie bereits erwähnt, müssen Sie möglicherweise seine Position ändern , damit wir keine Überschneidungen haben. Eine letzte Sache, bevor wir dieses Video abschließen , ist, dass wir auch sicherstellen, dass die Ananasstücke und der Schinken in verschiedenen Winkeln auf die Pizza gelegt werden. Derzeit sieht es etwas langweilig aus, weil alles in die gleiche Richtung geht. Verwechseln wir diesen Winkel für jedes dieser Teile ein wenig. Wir können das mit Drehen machen. Das fängt in der Schinken-Sektion an. Kurz bevor wir das mit FillRect zeichnen. Wir können auf rotate zugreifen, das auch im Kontext verfügbar ist. Dieser Rotationswert ist im Bogenmaß, nicht in Grad. Eine Möglichkeit, dies in ein gewisses Maß umzuwandeln, ist genau so. Wir können unseren Anfangswert überschreiten. Wenn wir möchten, dass dies um einen kleinen Wert wie fünf Grad gedreht wird , können wir dies in Bogenmaß umwandeln, indem wir dies mit Math.PI dividiert durch 180 multiplizieren . Dies macht es viel einfacher, mit Grad zu arbeiten, wenn es viel einfacher ist , dies in Ihrem Kopf zu umwickeln. Aber wir wollen diesen fest codierten Wert von fünf nicht beibehalten. Der springende Punkt, um diese Drehung für jedes dieser Teile hinzuzufügen , besteht darin, sie für jedes Stück einen etwas anderen Wert zu machen . Wir können Math.random hinzufügen, was für jede unserer Positionen in einem etwas anderen Wert platziert wird für jede und um einen etwas größeren Winkel zu machen , denn denken Sie daran, dass Math.random nur zwischen 0 und 1. Wir können dies mit 2 multiplizieren. Das ist auch eine Kopie dieser Rotate-Methode, und wir können diese innerhalb der Ananas wiederverwenden. Kurz bevor wir FillRect verwenden, probieren wir das aus, aktualisieren und neu starten. Die Pizzasauce, der Käse, Peperoni, neben Schinken. Wenn Sie genau hinschauen, sind diese Teile etwas nicht auseinander ausgerichtet. Auch bei der Ananas, aber mit einer Ananas, wie Sie sehen können, haben wir ein kleines Problem. Dies ist, wenn wir mehrere Inhaltsstoffe mit Rotationswerten verwenden . Dies geschieht aufgrund der Rotation bei Transformation. Wenn wir drehen, dreht sich der Canvas-Ursprung vom Canvas-Ursprung , der 0,0 ist, ganz oben links. Wenn wir mehrere Rotationen hinzufügen, fügt sich jede zur vorherigen hinzu, die wir festgelegt haben. Wir legen einen für den Schinken fest und fügen dann hinzu, indem wir die Rotation für die Ananas hinzufügen. Wir können dies beheben, indem wir den Ursprung für jede neue Inhaltsstoffe mit einer sogenannten Set-Transformation zurücksetzen jede neue Inhaltsstoffe mit einer . Dafür mache ich innerhalb unserer Funktion Pizza-Funktion. Kurz vor den Switch-Anweisungen. Wir wollen diese ctx.set-Transformation nennen, die sechs Werte annehmen wird. Die sechs Werte sind 1, 0, 0, 1, 0, 0. Diese sechs verschiedenen Werte können etwas verwirrend sein, zumal sie nicht besonders zusammengefasst sind. Wir können sehen, dass der erste Wert von eins und der vierte Wert ebenfalls einer ist. Beide beziehen sich auf die Skalierung, die einen Gegenstand größer oder kleiner machen kann. Die erste ist die horizontale Skalierung und die vierte ist eine vertikale Skalierung. Wir möchten nicht, dass einer dieser Werte erhöht oder verringert wird , also behalten wir diese auf einem, was der ursprünglichen Größe entspricht. Der zweite des dritten Wertes bezieht sich beide auf die Schrägstellung. Wir wollen auch keines unserer Stücke verzerren. Wir behalten diese als Null, was bedeutet, dass nichts festgelegt werden muss. Die Dinge, an denen wir interessiert sind, sind diese letzten beiden. Diese letzten beiden setzen wir in der horizontalen und vertikalen Übersetzung wieder auf Null. Jedes Mal, wenn wir neue Zutaten auswählen , transformiert sich die Rotationstransformation, die vor dem Zurücksetzen auf Null zurückschauen wird, was bedeutet, dass wir keine Ansammlung dieser Rotationswerte erhalten. Versuchen wir das mit der Transformation, die jetzt an Ort und Stelle ist. Wählen Sie eine Bestellung aus. Nun suchen wir sowohl den Schinken die Ananasstücke, um wieder an den ursprünglichen Orten zu sein . Das funktioniert jetzt alles gut. Wie bereits erwähnt, können Sie weitere dieser Fälle für verschiedene Inhaltsstoffe erstellen , wenn Sie es vorziehen oder wenn Sie zusätzliche Übung wünschen. nächstes, wenn Sie bereit sind, sehe ich Sie im kommenden Video, in dem wir diese Leinwand löschen werden , sobald die Pizza fertiggestellt ist. 44. Das Bild löschen: Wenn wir mit der Herstellung der Pizza fertig sind , die Beläge hinzufügen und sie dann schließlich in den Ofen geben, müssen wir die vorhandene Leinwand löschen um den nächsten zu machen. Wie Sie vielleicht vermutet haben, erstellen wir eine Funktion, die dies abdeckt, und wir werden dies am Ende unseres Skripts tun. Erstellen Sie hier eine neue Funktion, um diese namens ClearCanvas abzudecken. Die erste Aufgabe, die ich innerhalb dieser Funktion erledige , wenn wir hier in den Start gehen und eine unserer Bestellungen auswählen. Denken Sie daran, wenn wir jede dieser Pizzen zubereiten und auf die Zutaten klicken, wird die Schaltfläche dann deaktiviert. Was wir tun werden, ist, dass wir alle diese Schaltflächen auswählen , um zu beginnen. Wir werden diese Schaltflächen durchlaufen und dann entfernen wir dieses deaktivierte Attribut. Die erste besteht darin, eine Konstante namens Steps einzurichten. Dies wird alle unsere Buttons mit dem Klassennamen der Zutaten durchlaufen . document.getElementsByClassName. Der Klassenname, der jeder dieser Schaltflächen beigefügt ist, ist Zutaten. Ein bisschen mehr Platz dafür und wenn Sie sich an die frühen Videos erinnern, wenn wir GetElementsByClassName verwenden, anstatt wieder ins Array zurückzukehren, wird dies zur HTML-Sammlung zurückkehren . Wir haben HTML-Sammlungen. Wir können keine der Array-Methoden wie für jede verwenden. Was wir tun werden , ist unsere Schritte zu ergreifen , und dann konvertieren wir dies in ein Array, was bedeutet, dass wir unseren forEach verwenden können um jede dieser Punkte zu durchlaufen. Wir machen das mit Array.from. Dies wird aus unseren Schritten ein neues Array schaffen. Leg das rein. Jetzt haben wir ein Array, wir können Array-Methoden wie forEach verwenden, unsere Funktion übergeben. Wir haben Zugriff auf jedes der Elemente. Aus diesen Elementen können sie Attributübergabe in der Zeichenfolge von deaktiviert entfernen. Dies sollte jetzt alle unsere Zutaten durchlaufen und das deaktivierte Attribut entfernen , damit es für die nächste Pizza zur Auswahl steht. Als nächstes haben wir, wie wir uns im vorherigen Video angesehen haben, manchmal ein Problem, bei dem wir Rotationswerte für Schinken und Ananas haben . Was wir tun werden, ist die Transformation ganz oben in der Switch-Anweisung zu greifen oder zu setzen Transformation ganz oben in der , die gerade hier ist. Die aktuellen Werte im Inneren von hier werden unsere Transformation zurücksetzen , wenn vorhandene Rotationen stattfinden. Der letzte Schritt besteht darin, alles zu klären , was sich derzeit auf dem Canvas befindet und wir haben dies in der Vergangenheit mit CTX.ClearRect verwendet. Wir beginnen oben links in unserem Canvas, der Null, Null ist, und um die volle Größe des Canvas zu löschen, können wir mit canvas.width und auch canvas.height auf unsere Variablen zugreifen . Das war's. Das ist unsere Funktion jetzt abgeschlossen. Das letzte, was Sie tun müssen, ist, diese Funktion von AddTooven aus aufzurufen. Wir wählen dies aus und suchen nach der Funktion namens AddTooven. direkt unter DisplayOvenItems Fügen Sie dies direkt unter DisplayOvenItems in unsere if-Anweisungen ein. Während es hier auch einen kurzen Schritt gibt, den wir vorstellen können, nämlich unsere Variable zu greifen, die CompletedSteps ist. Setzt dies zurück, um ein leeres Array zu sein Probieren wir es mal aus. Aktualisieren Sie den Browser und er startet erneut. Wählen Sie eine Bestellung aus. Derzeit auf Schinken und Ananas rollen wir den Teig, fügen die Sauce, den Käse, den Schinken und die Ananas hinzu. Fügen Sie dies dem Ofen hinzu und jetzt wird unser Canvas geräumt und alle Zutaten stehen weiterhin für unsere nächste Pizza zur Auswahl. Ich probiere noch eine, die Peperoni, füge die Zutaten hinzu, füge diese in den Ofen, und das alles funktioniert wie erwartet. Dies ist jetzt für unsere Arbeit auf der Leinwand und Sie können mit Dingen herumspielen, Dinge erweitern und Sie können sogar die zusätzlichen Zutaten hinzufügen , wenn Sie möchten. Lassen Sie uns nun zum nächsten Abschnitt übergehen in dem wir dieses Projekt abschließen werden. 45. Pizzas verschwenden: Dieser neue Abschnitt wird die Fertigstellung unseres Projekts beinhalten. Eines der Dinge, auf die wir achten müssen ist zu überprüfen, ob der Küchenchef alle erforderlichen Schritte ausgeführt hat , bevor wir die Pizza in den Ofen geben. Wenn also die Pizza falsch ist, wird sie verschwendet. Das ist es, was wir jetzt behandeln werden. Später werden wir dem Benutzer auch einige Statistiken anzeigen, damit wir diese verschwendeten Pizzen innerhalb einer Variablen verfolgen können . Lasst uns an die Spitze unserer index.js springen. Scrollen Sie nach unten zu unseren Variablen. Erstellen Sie mit dem Schlüsselwort let eine neue Variable namens WastedPizzas, und wir werden verfolgen, wie viele davon wir falsch gemacht haben. Dann geht es zurück zum Ende unseres Skripts und wir erstellen eine neue Funktion, um damit umzugehen. Richten Sie das ein, rufen Sie die WastedPizza an. Bevor wir es vergessen, greifen wir unsere WastedPizzas Variable von oben und wir werden diese erhöhen und diese später mit den Statistiken verwenden. Als Nächstes werden wir alle Schritte machen, die für die nächste Pizza bereit sind. CompletedSteps, setze dies zurück, um ein leeres Array zu sein Dann rufen wir endlich ClearCanvas an. Dies war die Funktion, die im vorherigen Video eingerichtet wurde , die die Leinwand zurücksetzen und auch das deaktivierte Attribut entfernen wird . Rüber zur Indexseite. Im Hauptküchenbereich haben wir auch einen Knopf, mit dem wir diesen verbinden können. Wir fügen diesem Element einen EventListener hinzu, der unsere neue Funktion aufgerufen hat . Unter unserer Funktion documents.QuerySelector. Dieser Knopf. Wenn wir uns nur einen Blick darauf werfen, hatte das den Ausweis von Abfall. Fügen Sie einen EventListener hinzu, bei dem wir auf das Klickereignis achten, das unsere obige Funktion aufrufen wird. Probieren wir das aus, speichern und kehren zu unserem Spiel zurück und fangen von vorne an. Wählen Sie eine Bestellung aus. Wir machen das falsch, wir klicken diese einfach in der falschen Reihenfolge an. Klicken Sie auf Abfall. Jetzt wird eine Leinwand zurückgesetzt und wir sehen, dass wir diesen Gegenstand nicht im Ofen haben . Dies bereitet uns jetzt auf das kommende Video vor, in dem wir prüfen, ob der Koch die richtigen Schritte unternommen hat , um diese Pizza herzustellen. Wenn nicht, wird diese Funktion erneut aufgerufen, diesmal jedoch automatisch. 46. Prüfschritte: Diese verschwendete Pizza-Funktion, die wir gerade erstellt haben, wird auch wieder nützlich sein, da wir jetzt überprüfen werden, ob der Koch die richtigen Schritte unternommen hat oder dh die richtigen Zutaten hinzugefügt hat die Pizza, bevor Sie diese in den Ofen geben. Wenn sie das falsch verstanden haben, wird es dann wieder eine verschwendete Pizza sein. Um dies zu sagen, wenn wir in unser Spiel gehen, wählen Sie eine unserer Pizzen aus. Bevor wir gerade einen der Beläge hinzufügen, können wir auf den Ofen klicken und diesen ohne die richtigen Zutaten hinzufügen . Wir können auch weitermachen und noch mehr davon hinzufügen. Um die Inhaltsstoffe zu überprüfen, können wir eine neue Funktion erstellen. Ich mache das kurz nachdem wir das in den Ofen gelegt haben. Werfen Sie einen Blick auf unsere Funktion namens Add to oven, die etwas weiter oben liegt. Es ist eine Weile her, dass wir das gesehen haben . Dies ist in den Ofen hinzugefügt. Kurz danach erstellen wir unsere neue Funktion, bei der die Schritte abgeschlossen sind. Hier drinnen müssen wir auch den Pizza-Namen aufnehmen, dem wir derzeit vergleichen. Wir können prüfen, ob wir die richtigen Schritte haben. also den Pizza-Namen weiter , den wir hinzufügen werden, wenn wir diese Funktion aufrufen. Diese Funktion gibt entweder einen True oder False Boolean zurück , je nachdem , ob diese Schritte korrekt sind oder nicht. Es ist wahr oder falscher Wert wird bestimmen, ob wir die Pizza in den Ofen geben können , und wir rufen dies von unserer Add-to-Ofen-Funktion aus auf. Springe in die if-Anweisung, in der wir prüfen, ob wir einen Pizza-Namen haben, erstelle eine Konstante, um den zurückgegebenen Wert aus unserer Funktion zurückzuspeichern den zurückgegebenen Wert aus , den wir uns in nur einer Minute ansehen werden. Wir nennen das kann in den Ofen hinzufügen. Denken Sie daran, dass dies entweder ein wahrer oder falscher Wert sein wird, und dies entspricht unserer Funktion als Schritte abgeschlossen bezeichnet wird. Denken Sie daran, dass dies auch bei dem Pizza-Namen aufgenommen werden muss , den wir oben in dieser Variablen gespeichert haben. Gleich darunter kreieren wir dann in unserem Pizza-Objekt, um in den Ofen zu gehen. Jetzt schieben wir das auf das Ofen-Array. Aber kurz bevor wir dies tun, möchten wir nur sicherstellen, dass dies geschieht, wenn die Variable kann zum Ofen hinzugefügt werden stimmt. Was wir tun werden, ist, dass wir all diese Informationen von unserem Objekt bis hin zu abgeschlossenen Schritten ausschneiden diese Informationen von unserem Objekt . Geben Sie eine if-Anweisung ein, um zu prüfen ob der Ofen hinzugefügt werden kann, ist gleich wahr. Wenn ja, füge das wieder ein. Unsere Pizza kann jetzt in den Ofen gegeben werden. Lassen Sie uns einen schnellen Test machen und überprüfen, ob dies funktioniert. Wir gehen in unsere neue Funktion ein und im Moment geben wir einfach den Wert zurück, wenn der Wert wahr ist. Wir sollten in der Lage sein, eine der aktuellen Pizzen in den Ofen zu geben. Probieren wir das mal aus. Klicken Sie auf den Ofen und es funktioniert. Aber wenn wir jetzt das Spiel beenden und falsch zurückgeben, sollten wir hoffentlich verhindern alle Pizzen in den Ofen geschoben werden. Ich wähle eine aus, und das hindert jetzt gesamte Pizza daran, in diesen Abschnitt zu gelangen. Dies bedeutet, dass wir jetzt einige reale Bedingungen hinzufügen können , um es hier zu überprüfen. Um dies zu tun, müssen wir die Schritte von allen Pizzas Arrays ergreifen . Zu Beginn müssen wir unsere Pizza-Objekte tatsächlich auswählen. Hier wurden wir beim Pizza-Namen weitergegeben und wenn wir oben nach unserem Pizza-Array suchen. Wir verwenden diesen Namen, um unsere spezielle Pizza zu finden und dann das gesamte Objekt zurückzugeben , damit wir auf diese erforderlichen Schritte zugreifen können . Lass uns runter gehen und das jetzt machen. Wir können die Rückgabeanweisungen verschieben, auf unser vollständiges Pizza-Array zugreifen und dann die JavaScript-Suchmethode verwenden, und dann die JavaScript-Suchmethode verwenden um über diesen Pizza-Namen zu suchen. Um dies zu tun, führen wir für jedes der Elemente in unserem Array eine Funktion aus und speichern diese in einer Variablen namens Pizza. Diese find-Methode gibt einen neuen Wert zurück. Wir möchten prüfen, ob die Pizza, auf die wir gerade zugreifen, eine Namenseigenschaft hat die unserem Pizza-Namen entspricht, und dann speichern wir diesen zurückgegebenen Wert in einer Konstante namens Pizza-Objekte. Als nächstes müssen Sie die Schritte von diesem Objekt aus greifen die Schritte von diesem Objekt aus und diese erneut innerhalb einer Variablen oder Konstante speichern. Dieser wird als die erforderlichen Schritte bezeichnet, und wir setzen dies auf unser oben genanntes Pizza-Objekt. Filtern Sie dies nach unten, um nur die erforderlichen Schritte zu speichern. Wenn wir nun ganz oben im Skript zu unserem Pizza-Objekt zurückkehren , ist dies die erforderliche Schritt-Eigenschaft, ist dies die erforderliche Schritt-Eigenschaft die wir gerade zugegriffen haben. Dies ist ein Array aller Werte. Wir haben jetzt all diese Werte , die nötig sind, um eine Pizza zu bauen, und wenn Sie sich von früher erinnern, scrollen Sie nach unten zu unseren Variablen. Wir haben auch eine Variable namens „Abgeschlossene Schritte“, die hinzugefügt wird, wenn ein Koch auf jede der Zutaten klickt. Wir müssen nun diese beiden Arrays vergleichen und überprüfen, ob alle enthaltenen Schritte erledigt wurden. Wenn wir darüber nachdenken, damit eine Pizza bereit ist, in den Ofen zu gehen, müssen nicht nur die abgeschlossenen Schritte korrekt sein, sondern sie müssen auch in der gleichen Reihenfolge sein. Wenn ich zum Beispiel den Teig, den Käse und die Sauce in dieser bestimmten Reihenfolge habe , würde er technisch gesehen zu einer Margarita passen. Aber wir wollen nicht, dass die Quelle auf dem Käse steht oder der Teig zuletzt hinzugefügt wird. Wir können dies mit einer JavaScript-Array-Methode namens „alle“ überprüfen . Zurück zu unserer Funktion, was ich tun werde, ist diese Funktion zu tippen, und dann können wir darüber sprechen , was gerade danach vor sich geht. Wir können auf unsere erforderlichen Schritte zugreifen, nämlich die Reihe aller Schritte, die zum Erstellen einer Pizza erforderlich sind , und dann diese Methode aufrufen , die wir gerade erwähnt haben, die alle war. Dies führt eine Funktion für jeden unserer Array-Werte aus. Übergeben Sie als Argumente das Element, den Index, und geben Sie dann einen Wert zurück, wenn das Element den abgeschlossenen Schritten wie im Index entspricht . Schließlich speichern wir diesen zurückgegebenen Wert einfach innerhalb einer Konstante namens Check Steps. Nur um zu erklären, was hier vor sich ging, werden wir alle erforderlichen Schritte durchlaufen und diese dann innerhalb des Elementwerts speichern. Zum Beispiel wäre dies bei dem allerersten erforderlichen Schritt , der im Allgemeinen Rolle Teig ist, der Wert dieses Elements. Die Indexzahl wäre natürlich Null. Im Folgenden prüfen wir noch einmal nach dem allerersten, ob dieser Rollteigwert dem ersten Wert in abgeschlossenen Schritten entspricht. Wenn diese Pizza hergestellt wurde, sollten beide Werte dem Rollteig entsprechen. der zweiten Schleife wäre dies im Allgemeinen Soße gleich. Dann prüfen wir, ob die Quelle der zweite Wert ist und so weiter. Jede Methode gibt true zurück, wenn alle übereinstimmen oder falsch sind , wenn eine einzelne oder mehrere fehlschlagen. Dies ist der Haupttest , um zu überprüfen, ob die Pizza korrekt ist, bevor Sie in den Ofen gehen. Wenn wir wollten, könnten wir dies einfach als unsere einzige Überprüfung verwenden , aber wenn wir dies verwenden, weiß der Küchenchef nicht genau welche Zutaten das Problem verursacht haben. Er wird nicht wissen, ob er zu viele Zutaten verwendet hat, nicht genug Zutaten oder die falschen Zutaten. Um dabei zu helfen, richte ich mehrere Bedingungen ein, damit wir verschiedene Fehlermeldungen geben können. Dies wird einige if-Anweisungen übergeben , um einige Prüfungen durchzuführen. Aber der erste, wir prüfen, ob zu viele Zutaten hinzugefügt wurden. Wir möchten wissen, ob die Länge der abgeschlossenen Schritte größer ist als die Länge der erforderlichen Schritte. Bei abgeschlossenen Schritten ist die Länge größer als die erforderlichen Schritte. Wenn es vorerst der Fall ist, legen wir einfach ein Konsolenprotokoll ein und wir sagen zu viele. Kopieren Sie dies, fügen Sie dies unten ein und ändern Sie dies in das weniger als Symbol. Wir können prüfen, ob nicht genügend Zutaten verwendet wurden. Wenn dies passiert, wird im Konsolenprotokoll nicht genug angezeigt. Der dritte wird überprüft, ob diese beiden Werte gleich sind, also stellen Sie sicher, dass dies richtig geschrieben ist. Wir prüfen, ob die abgeschlossenen Schritte den erforderlichen Schritten entsprechen. Wir prüfen auch, ob die Zutaten falsch sind. Wir können dies mit unserer CheckSteps Variable tun und prüfen, ob der Wert gleich false ist, indem wir einen Ausruf hinzufügen. Grundsätzlich haben wir die richtige Anzahl von Schritten unternommen , aber die Zutaten sind falsch, aber dies protokolliert den Wert falscher Zutaten an der Konsole . Schauen wir uns das in der Konsole an. Öffnen Sie die Entwickler-Tools. Wir fangen wieder an. Wähle eine unserer Pizzen und lass uns Peperoni probieren, was einfach ist. Wir müssen den Teig mit Pizzasauce rollen. Hoffentlich fügt dieser zu viele Zutaten hinzu, klickt auf zu viele Optionen. Versuchen Sie, in den Ofen zu geben, ich sehe zu viele, erfrischen Sie sich. Machen wir das noch einmal, Margarita. Wir klicken nur auf eine dieser Zutaten. Im Ofen sind das nicht genug Zutaten, und dann die dritte und letzte werden wir prüfen, ob wir die falschen Zutaten mit der richtigen Menge an Schritten aufgenommen haben die falschen Zutaten mit der richtigen Menge an Schritten aufgenommen . Testen wir das. Wir wissen, dass die Peperoni den Rollenteig haben, sie hat die Sauce, den Käse und Peperoni, also müssen wir vier Schritte unternehmen, aber sicherstellen , dass diese falsch sind. Peperoni, ich füge etwas Schinken hinzu. Stellen Sie sicher, dass wir uns in vier Schritten befinden. Klicken Sie auf den Ofen und wir können sehen dass wir die falschen Zutaten verwendet haben. Gut. Wir haben unsere Nachrichten und diese müssen jetzt auch dem Benutzer angezeigt werden, und wir können dies tun, wenn wir zu unserer index.html gehen . Werfen wir einen Blick darauf. Für unseren Nachrichtenbereich haben wir dieses umgebende div und unsere Nachrichten für den Koch, und dann dieses P mit der ID der Nachricht. Wir könnten diese Nachrichten direkt in jede unserer IF-Anweisungen schreiben und ich werde diese auf den Bildschirm stellen, aber stattdessen erstellen wir eine eigenständige Funktion, um diese zu behandeln, da wir es sein werden wiederhole diese mehrfach. Fügen wir unsere Funktion namens ShowerRorMessage hinzu. Übergeben Sie die Nachricht, die wir anzeigen möchten. Wenn das alles ist, wählen wir unseren Nachrichtenbereich , den wir gerade auf der Indexseite mit document.QuerySelector gesehen haben. Übergeben Sie die ID der Nachricht, legen Sie den InnerText-Inhalt gleich der Nachrichtenvariablen fest. Sobald der Koch einen Fehler gemacht hat , möchten wir, dass dies nach einer gewissen Zeit verschwindet einer gewissen Zeit und wir können dies mit einem setTimeout tun. Übergeben Sie dies, was eine durch Komma getrennte Funktion aufnimmt . Der zweite Wert ist die Zeitverzögerung in Millisekunden, also sagen wir zwei Sekunden. Öffne den Funktionskörper. Alles, was wir hier tun werden, ist diesen Nachrichtenbereich zu kopieren und ihn einzufügen. Lassen Sie uns dies auf eine leere Zeichenfolge setzen. Wir können diese Funktion namens ShowerRorMessage jetzt aufrufen und Konsolenprotokolle direkt darüber platzieren. Fügen Sie dies ein, fügen Sie eine Zeichenfolge hinzu. Sie haben auch zu viele Zutaten verwendet. Kopiere das. Bei der zweiten haben Sie nicht genug Zutaten verwendet, und die dritte haben Sie die falschen Zutaten verwendet. Probieren wir das mal aus. Auch hier machen wir den gleichen Test wie zuvor. Wählen Sie eine Bestellung aus, also machen wir zu wenig. Du hast nicht genug Zutaten verwendet , dann verwenden wir zu viele. Das ist gut. Dann der letzte, wenn wir die falschen Zutaten verwenden, also Peperoni. Ich füge vier Schritte hinzu: Teig rollen, Pizzasauce und Paprika, und los geht's. Das letzte, was zu tun ist, ist sicherzustellen, dass diese Pizzen nur in den Ofen gegeben werden, wenn die Zutaten und die Schritte korrekt sind. Derzeit, wie wir uns früher angeschaut haben dies mit dieser IF-Anweisung kontrolliert, und dies wird nur zum Ofen beitragen, wenn dies zutrifft. Wir müssen diesen wahren oder falschen Wert kürzen ihn von der Overbllow-Funktion namens StepsCompleted zurückgeben . Derzeit läuft diese Funktion und wir führen alle unsere Prüfungen durch, aber wir geben noch keinen wahren oder falschen Wert zurück, daher müssen wir dies ganz unten hinzufügen. Wir wollen nur, dass dies auch dann wahr wird, wenn die Ofenkapazität noch nicht erreicht ist. Früher haben wir Variablen eingerichtet, die Ofen und auch OfenKapazität genannt werden, die wir gerade hier sehen können. Ich habe den Ofen, der ein leeres Array ist und auch die OfenKapazität auch. Wir haben es so eingestellt, dass nur sechs Pizzen aufbewahrt werden. Wir möchten auch einen Check durchführen, um sicherzustellen, dass wir nicht zu viele Pizzen im Ofen haben , bevor wir den Wert true zurückgeben . Wir schneiden das raus. Fügen Sie eine IF-Anweisung hinzu , in der wir prüfen, ob der ofen.length kleiner ist als die Kapazität des Ofens , die derzeit sechs ist. Wenn es so ist, geben wir true zurück, wenn nicht, geben wir false zurück. Wir sind jetzt fast da, aber wir müssen uns auch darum kümmern was passiert, wenn wir die falschen Zutaten verwendet haben, denn wenn wir eine Pizza vermasseln, wollen wir auch unsere WastedPizza-Funktion ausführen , die wir zuvor erstellt. Wir können dies innerhalb unserer IF-Aussagen tun. Wenn wir zu viele Zutaten verwendet haben handelt es sich um eine falsche Pizza, führen Sie unsere WastedPizza-Funktion und kehren Sie dann aus dieser heraus. Der nächste Schritt ist der mittlere Schritt, um zu prüfen, ob wir nicht genügend Zutaten verwendet haben. Wir möchten jedoch die WastedPizza-Funktion nicht ausführen , da sie immer noch die Möglichkeit haben können, die richtigen Zutaten hinzuzufügen danach immer noch die Möglichkeit haben können, die richtigen Zutaten hinzuzufügen. Alles, was wir tun, ist wieder da rauszukommen. Für den letzten, bei dem ich die falschen Zutaten verwendet habe , wollen wir wieder die WastedPizza-Funktion ausführen , kehren Sie davon zurück. Dies sollte uns nun bereit machen, dies auszuprobieren, als wir unten im vorherigen Video die WastedPizza-Funktion erstellt haben unten im vorherigen Video die WastedPizza-Funktion . Schauen wir uns das mal an. Dies löscht auch den Canvas. Wir wissen, ob diese Funktion ausgeführt wird , und wir werden auch wissen, ob der Rückgabewert von true ausgelöst wurde , weil wir eine Pizza im Ofen sehen sollten, also werden wir das auffrischen und ausprobieren. Wählen wir zuerst die Peperoni aus. Ich versuche es für die richtigen Zutaten : den Teig, die Sauce, den Käse, die Peperoni und das ist der Ofen. Das ist gut. Das ist [unhörbar] jetzt geräumt, also probieren wir noch einen, den Schinken und die Ananas. Dafür machen wir es falsch. Wir fügen die falsche Zutat hinzu, also nicht zu viele. Dies alles scheint zu funktionieren, weil diese Pizza nicht in den Ofen gegeben wird , aber die Leinwand unten immer noch geräumt ist und bereit ist, eine neue Pizza hinzuzufügen. 47. Abwicklung von Bestellungen: Wenn wir alle Pizzen bei einer bestimmten Bestellung abgeschlossen haben, ist es eine gute Idee, die Bestellung abzuschließen , damit wir mit der nächsten fortfahren können. Darauf konzentrieren wir uns in diesem Video. Kurz davor möchte ich ein kleines Problem beheben. Dieses Problem, wenn wir zum Browser gehen und unser Spiel starten. Klicken Sie auf eine dieser Bestellungen. Das Problem ist, dass wir auf diese Zutaten klicken können bevor wir überhaupt eine unserer Pizzen ausgewählt haben. Dadurch fühlt sich unser Projekt nicht nur ein bisschen seltsam an, es bedeutet auch, dass wir keine Pizza in den Ofen geben können, da wir diese ausgewählten Zutaten gegen die auf Pizza geklickte Pizza prüfen . Um dies zu beheben, müssen wir nur prüfen, ob der aktuelle Pizzabschnitt festgelegt ist , wenn wir auf Zutaten klicken. Suchen Sie dazu nach der StepComplete-Funktion, also mache ich eine Suche. Dies ist der, den wir brauchen, gerade hier. Bevor wir zuerst prüfen, ob ein Schritt abgeschlossen ist, können wir ganz oben eine if-Aussage machen. Dies wird prüfen, ob wir eine Pizza ausgewählt haben. Wo wir das machen können, wenn wir zu unserer Index.html in den Küchenbereich gehen , können wir sehen, dass wir diese Spanne mit der ID der aktuellen Pizza haben . Wenn wir eine der Pizzen oder Bestellungen auswählen, wird diese dann in diesem Abschnitt platziert. Wir können prüfen, ob es Inhalte in diesen Elementen enthält. Wir tun dies, indem wir dies mit document.QuerySelector auswählen. Dies ist eine ID, also gib den Hash ein. Die ID lautete current_pizza. Wir könnten prüfen, ob sich hier ein innerer Text befindet oder ob er einer leeren Zeichenfolge entspricht. Wenn das leer ist, haben wir ein Problem, wir haben keine Pizza ausgewählt. Was wir tun werden , ist, auf unsere Funktion namens ShowerRorMessage zuzugreifen , sie in einer Reihe von zuerst zu übergeben, eine Pizza auszuwählen, an der Sie arbeiten möchten , und dann kehren wir davon zurück, also nein Der folgende Code wird ausgeführt. Testen wir es. Wir können zum Browser gehen, unser Spiel starten und eine unserer Bestellungen auswählen. Bevor wir nun eine unserer Pizzen auswählen, versuchen wir, Zutaten wie Rollteig hinzuzufügen, und wir sehen unsere Fehlermeldung genau hier. Der Schritt ist nicht mehr als abgeschlossen gekennzeichnet wie wir daran sehen können, dass diese Schaltfläche nicht deaktiviert ist. Jetzt, um unsere Bestellung abzuschließen. Dafür gibt es zum Beispiel drei Pizzen. Dann wollen wir alle drei machen und dann unsere Bestellung abschließen. Bevor wir den Spieler abschließen lassen, wäre es gut, zuerst zu überprüfen, ob tatsächlich genug Pizzen erstellt hat, um die Bestellung abzuschließen. Schritt 1 besteht darin, die Anzahl der Pizzen bei jeder Bestellung irgendwo aufzubewahren . Es gibt viele Möglichkeiten, dies anzugehen, aber ich werde es als Attribut speichern wenn wir die Bestellung erstellen. Werfen Sie einen Blick auf die Funktion CreateListofPizzas , die gerade hier ist. Im Inneren, wo wir unsere besonderen Elemente gebaut haben, haben wir eine Spannweite mit der aktuellen Pizza-Menge. Zum Beispiel könnten dies zwei Margheritas oder eine Peperoni sein. Jetzt können wir die Menge jeder Auftragsposition zu einer Variablen hinzufügen . Lassen Sie uns diese Variable direkt oben erstellen , damit wir dies verfolgen können. ganze Pizzen insgesamt, und wir setzen dies zunächst auf einen Wert von Null. Wir setzen dies dann jedes Mal zurück, wenn wir unsere Pizza-Liste erstellen , indem wir diese auf den Wert Null setzen. Dann, direkt darunter , können wir die aktuelle Pizza-Menge zur vorhandenen Gesamt-Pizza-Variable hinzufügen die aktuelle Pizza-Menge zur . Nur um zu klären, was wir hier machen, wenn wir zum Beispiel eine Bestellung haben, hat diese erste drei Pizzen, diese hat drei und diese hat vier. Was wir tun, ist, dass wir alle Pizzen durchschleifen alle Pizzen und dann diese Menge zu unserer Variablen hinzufügen. Dann haben wir diese Summe für die Bestellung, die wir uns in Zukunft beziehen können. Wie bereits erwähnt, verwenden wir diese Gesamtmenge der Pizzen und fügen diese unserer Bestellung als Attribut hinzu. Wir können dies tun, wenn wir die Bestellung erstellen. Wir müssen nach der Funktion CreateSingleOrder suchen , die sich direkt unten befindet. Direkt unter unserer Pizzaliste werden wir den Bestellumschlag holen, wir setzen das Attribut, das wir in der Vergangenheit verwendet haben. Das Attribut, dies wird ein benutzerdefiniertes Attribut sein, es ist nicht eines der integrierten Attribut, das wir bereits haben. Wenn wir unsere eigenen benutzerdefinierten Attribute hinzufügen, haben wir im Allgemeinen das Datenpräfix. Dies sind Daten, Gesamtpizzen und dann der Wert, der unsere obige Variable ist die wir als Total Pizzen erstellt haben. Was wir hier im Grunde tun, ist wir jedes Mal, wenn wir eine neue Bestellung erstellen , ein Datenattribut namens Data-Total-Pizzen mit der Gesamtzahl der Pizzen in der Bestellung hinzufügen . Wenn wir das speichern, können wir in die Entwicklertools springen und überprüfen, ob alles funktioniert. Aktualisieren Sie und starten Sie dann unser Spiel. Wenn wir nun eine unserer Bestellungen auswählen, suchen Sie nach der Klasse des Order Wrappers, und Sie können sehen, dass jede einzelne dieses neue Attribut namens Data-Total-Pizzen und die Menge für jede dieser Bestellungen hat dieses neue Attribut namens Data-Total-Pizzen befehle. Dies bedeutet, dass wir jetzt die Gesamtzahl der Bestellungen haben , die wir erstellen müssen. Früher, wenn wir uns die Variablen ansehen, haben wir auch eine Variable namens Pizzas complete for order erstellt , die wir hier haben. Dies wird jedes Mal erhöht, wenn wir eine neue Pizza in den Ofen geben, was uns die beiden Werte gibt, die jetzt verglichen werden müssen. Um dies zu tun, müssen wir auch einen Button erstellen, um die Bestellung abzuschließen, die der Koch in der Küche auslösen kann. Diese Schaltfläche löst eine Funktion aus, und wir können diese in der Funktion „Aktuelle Reihenfolge auswählen“ einstellen. Schauen Sie danach und wählen Sie die aktuelle Bestellung aus. Ich werde hier einen Button erstellen, denn hier legen wir die aktuelle Reihenfolge fest, an der wir arbeiten. Unten, direkt unter dieser letzten Codezeile, aber immer noch innerhalb der if-Anweisung und darunter, und wir erstellen eine Konstante namens CompleteButton. Von Anfang an haben wir die Funktion namens BuildeElement, die ein neues HTML-neues für uns erstellen wird. Die erste Schaltfläche ist der Typ des Elements, das wir erstellen möchten, nämlich eine Schaltfläche und der Wert, der der Text von vollständig ist. Dann können wir auf diese Schaltfläche zugreifen einen Klassennamen complete_btn hinzufügen. Diese Schaltfläche muss eine Funktion auslösen, damit wir einen Ereignis-Listener hinzufügen können , also CompleteButton.addEventListener. Nun, es ist jetzt für einen Klick , der eine Funktion auslöst , die wir in einem Moment namens CompleteOrder erstellen . Schließlich haben wir unser OrderDiv, das ist dieser aktuelle Arbeitsbereich. Wir schnappen uns das und dann können wir AppendChild hinzufügen. Übergeben Sie es in unserem Complete Button. Wir testen dies alles, indem eine einfache Warnung innerhalb dieser Funktion hinzufügen. Erstellen Sie die Funktion namens CompleteOrder. Jetzt alarmiere ich mit dem Text „Vollständig“. Springen wir in den Browser und überprüfen, ob das funktioniert. Aktualisieren Sie und klicken Sie auf „Start“. Wählen Sie eine unserer Bestellungen aus. Es gibt unsere neue Schaltfläche „ Complete“, die eine Warnung auslöst , wenn Sie darauf klicken. Gut. Jetzt wissen wir, dass dies funktioniert und es wurde ausgelöst, wir können diese Warnung entfernen, und dann können wir unseren Vergleich zwischen der Gesamtzahl der Pizzen in der Bestellung und der Anzahl durchführen, die wir derzeit erstellt haben. Zuerst holen wir uns unsere aktuelle Bestellung ab, wir haben diese innerhalb einer Konstante namens CurrentOrder gespeichert. Ich hole das mit document.QuerySelector. Wie wählen wir nun die aktuelle Bestellung aus, an der wir arbeiten? Nun, wenn Sie sich von früher erinnern, als wir auf die Schaltfläche „Start“ geklickt haben, alle Bestellungen innerhalb der Seitenleiste, wenn wir eine dieser Klasse von order_wrapper auswählen und dann, wenn wir auf eine klicken, es ist in den Abschnitt „ Arbeiten an“ übergegangen. Der Abschnitt „Working on“ hat auch eine ID. Wenn wir nach oben scrollen, ist dies der Abschnitt, nur hier. Wir können uns den Bestellwickler holen, der in diesem Working on Abschnitt enthalten ist . Wir können dies tun, indem wir es in einem CSS-Selektor übergeben. Der Working on Abschnitt, unsere Sektion gerade hier schnappt. Dann können wir unseren Abschnitt nach innen greifen, der diese Klasse von Order Wrapper enthält. Wir können dies genau wie bei CSS tun, das Größere als Symbol verwenden, und da dies eine Klasse ist, verwenden wir die.order_wrapper. Wählen Sie diese gespeicherte Bestellung aus. Denken Sie daran, dass wir innerhalb dieser Bestellung die Gesamtzahl der Pizzen für diese Bestellung innerhalb eines benutzerdefinierten Attributs hinzugefügt die Gesamtzahl der Pizzen für diese Bestellung haben. Wir können das get-Attribut verwenden, es in den Attributnamen übergeben, den wir diesem gegeben haben, und das waren Daten-Total-Pizzen. Bewahren Sie dies in einer Konstante namens TotalPizzaSonOrder auf. Dann können wir endlich unseren Check unten innerhalb einer if-Anweisung durchführen. Wir haben die Gesamtzahl der Pizzen, die wir haben sollten, und wir haben auch die Variable von früher genannten Pizzen zur Bestellung gespeichert . Wir können überprüfen, ob Pizzen, die für die Bestellung abgeschlossen sind, kleiner als der oben genannte Gesamtpizzen auf Bestellung Wenn dies der Fall ist, haben wir einen Fehler, sodass wir ihn in unserer Funktion namens ShowerRorMessage mit dem Text „Sie haben nicht genug Pizzen gemacht , um diese Bestellung abzuschließen.“ Dann geh da raus. Probieren wir es mal aus. Speichern Sie dies und aktualisieren Sie es. Was wir jetzt tun müssen, ist unser Spiel zu starten. Für unsere erste Bestellung gibt es drei Pizzen, also klicke darauf. Wenn wir nun versuchen, eins zum anderen hinzuzufügen, gehen wir für den Schinken und die Ananas. Wir werden das allererste erstellen. Füge das dem Ofen hinzu. Wir haben nur einen, klicken Sie auf „Abschließen“. Jetzt bekommen wir die Fehlermeldung hier drin. Das scheint jetzt alles zu funktionieren. Wir können die Bestellung tatsächlich entfernen, sobald sie abgeschlossen ist. Direkt unter der if-Anweisung möchten wir unsere aktuelle Bestellung, die wir von oben gespeichert haben, abrufen die wir von oben gespeichert haben, und diese mit der Methode entfernen aus dem Abschnitt „Arbeiten “ entfernen. Dadurch wird die Bestellung tatsächlich aus diesem Abschnitt entfernt, aber dies wird tatsächlich nur die Reihenfolge entfernen, die den Titel und die Pizzen enthält. Wir müssen uns immer noch darum kümmern , den Button zu entfernen. Die Art und Weise, wie Sie diese Schaltfläche greifen können besteht darin, dass diese vollständige Bestellfunktion von unserem Klick-Handler auf der Schaltfläche ausgelöst wird, damit wir sie im eigentlichen übergeben und Informationen mit dem Ereignis eingeben können . Wir können mit e.target darauf zugreifen. Wir haben dies in einer Variablen namens Complete button gespeichert . Wie oben können wir auf diese Variable zugreifen und die Methode namens remove aufrufen, und die Methode namens remove aufrufen um diese aus dem DOM zu entfernen. Wir werden diesem Spiel später auch einige Statistiken hinzufügen, z. B. die Anzahl der abgeschlossenen Bestellungen. Wir bereiten uns darauf vor, indem oben eine Variable von erstellen. Mit dem Rest von ihnen sagen wir, abgeschlossene Bestellungen ein Anfangswert von Null sein sollen. Gehen Sie dann zurück zu unserer vollständigen Bestellfunktion wo wir dies um den Wert einer, also abgeschlossenen Bestellungen plus plus erhöhen können . Jetzt haben wir diese Bestellung abgeschlossen, wir können auch diese Variable namens Pizzen zur Bestellung zurücksetzen . Wir können dies auf den Wert von Null zurücksetzen, also sind wir bereit für die nächste Bestellung. Lasst uns das endlich speichern und zu unserem Spiel gehen, und wir können das ausprobieren. Klicken Sie auf „Start“. Was wir suchen, ist, die richtige Menge an Pizzen zu erstellen , um diese Bestellung abzuschließen. Zuerst werden der Schinken und die Ananas dies vervollständigen, also haben wir einen, und wir haben auch zwei Peperonis, die wir darauf herstellen können. Wir versuchen es noch einmal. Wir sollten jetzt drei im Ofen haben und drei, die auch mit dieser Bestellung verbunden sind. Klicken Sie auf „Abschließen“ und dies entfernt jetzt unsere Bestellung aus dem Arbeitsbereich. 48. Bestellungen entfernen: Wenn Sie dieses Spiel testen, haben Sie möglicherweise ein Problem bemerkt, wenn wir auf den „Start“ -Button klicken, erhalten wir die Bestellungen, und wenn wir dann auf eine der Bestellungen klicken um es in die arbeiten an Abschnitt, wenn die Bestellungen regeneriert werden, wird dieselbe Reihenfolge immer noch in die Liste aufgenommen. Wir möchten die Bestellung 1 entfernen, da wir daran arbeiten. Dies geschieht für jeden , auf den wir klicken. Um dies zu beheben, könnten wir diese Reihenfolge aus dem Orders-Array entfernen . Um zu ermitteln, auf welche Reihenfolge wir geklickt haben, können wir jedem eine Bestellnummernattribut hinzufügen. In ähnlicher Weise, wo wir in die CreateSingleOrder-Funktion gehen , denken Sie daran, dass wir dieses benutzerdefinierte Attribut namens Data Total Pizzen hinzugefügt haben . Dies half uns herauszufinden wie viele Pizzen insgesamt auf der Bestellung waren, sodass wir dies mit dem Betrag vergleichen konnten, den wir erstellt haben. In ähnlicher Weise fügen wir auch neue benutzerdefinierte Attribute mit der Bestellnummer hinzu, damit wir identifizieren können, auf welches wir geklickt haben. Wenn wir oben einen Blick darauf werfen, haben wir bereits Zugriff auf diese Bestellnummer. Es wird ziemlich einfach sein , dies zu tun. Was wir tun werden, ist diese Zeile zu duplizieren , um ein neues Attribut zu erstellen. Kopieren Sie diese und fügen Sie es ein. Wir erstellen ein neues Attribut. Auch hier ist dies mit dem benutzerdefinierten Datenpräfix die Datenauftragsnummer. Übergeben dieser Bestellnummer. Bevor wir weiter gehen , speichern wir dies und versuchen es im Browser, indem wir die Developer Tools öffnen. Das ist unser Spiel. Wenn wir nun eine unserer Bestellungen auswählen, ist dies Ihr OrderWrapper. Wir haben die Data OrderNumber von eins, wir haben die OrderNumber von 2, 3, 4, 5 und so weiter. Da dies jetzt vorhanden ist, können wir zu unserem Code übergehen und diese Reihenfolge aus dem Orders-Array entfernen. Ein guter Ort dafür ist in unserer Funktion namens SelectCurrentOrder. Sieh dir das mal an. Dies ist eine Funktion, die ausgeführt wird, wenn wir auf jede Bestellung klicken. Mit dieser Konstante von OrderWrapper haben wir bereits Zugriff auf die Click-on-Order. Innerhalb der folgenden if-Anweisung können wir das Attribut „Bestellnummer“ aus dem OrderWrapper abrufen und dann daran arbeiten , dieses zu entfernen. Unten rufen wir zunächst diese Bestellnummer ab und installieren diese innerhalb einer Konstante namens OrderNumber. Stellen Sie dies auf unseren OrderWrapper ein. Dot getAttribute. [nicht hörbar] Kundendaten OrderNumber. Jetzt können wir auf unser Orders-Array zugreifen. Wir können die JavaScript-Array-Methode namens Filter verwenden, die eine Funktion aufnehmen kann, und um dies kurz zu halten, werde ich nur in eine Pfeilfunktion einfügen. In jeder Reihenfolge in der Ordnungsvariablen. Dann möchten wir prüfen, ob die jeweilige Bestellnummer nicht mit unserer obigen Bestellnummer übereinstimmt. Dies filtert alle unsere Bestellungen heraus und lässt nur die Bestellungen durch auf die nicht geklickt wurden. Dies gibt uns ein neues Array mit allen Werten außer diesem. Was wir dann tun können, ist, dass unsere Aufträge gleich dieser sind, wodurch das ursprüngliche Array überschrieben wird. Gehen wir zurück zum Browser und probieren es aus. Starte das Spiel. Wählen Sie unsere erste Bestellung aus. Lasst uns jetzt regenerieren. Wenn unsere Bestellungen jetzt regeneriert werden, sehen wir in dieser Seitenleiste keine Bestellung 1 mehr. 49. Aktualisierung Der UI & Stats: Während der Erstellung dieses Spiels haben wir einige Zahlen im Auge behalten, wie die fertigen Pizzen, die verschwendeten Pizzen und auch die abgeschlossenen Bestellungen. Diese werden jetzt verwendet , um am Ende des Spiels einen Statistikabschnitt zu erstellen . Dieser Bereich wird anstelle des Methodenabschnitts angezeigt. Also verstecken wir diesen Abschnitt und ersetzen ihn, wenn er am Ende des Spiels nicht mehr benötigt wird. Der Abschnitt „stat“ befindet sich tatsächlich bereits in unserer Indexseite. Wenn wir ganz oben im Hauptbereich hier hineingehen , haben wir diesen Bereich, in dem wir alle diese drei Bereiche mit unseren Variablen aktualisieren werden . Dies spiegelt auch unsere Start- und Endspielfunktionen wider und bewegt sich über alle Bereiche, die Elemente ein- und ausblenden , in einigen benutzerdefinierten Funktionen. Derzeit wird unser Statistikbereich nicht angezeigt, denn wenn wir in unser Stylesheet gehen, legen wir dies auf den Anzeigetyp von „None“ fest. Lasst uns auf unsere Indexseite springen und wenn wir uns einen Blick darauf werfen, startet die Spielfunktion gerade hier. Dieser Bereich ist dafür verantwortlich, unsere Start- und Endschaltflächen ein- und auszublenden , sobald das Spiel begonnen oder beendet ist, und wenn wir nach unten scrollen, fügt er auch diese Nachricht zu Beginn des Spiels hinzu, das ist dann nach drei Sekunden entfernt. Auch die Funktion zum Ende des Spiels setzt dann die Schaltfläche Start wieder ein und blendet dann die Schaltfläche „Ende“ aus. Um diese beiden Funktionen direkt unter dem Startspiel neu zu gestalten , verschieben wir diese in eine neue Funktion namens Startup-Spiele-UI. Dann scrolle nach oben. Wir schneiden unsere beiden Bereiche aus, die die Schaltflächen ein- und ausblenden , in unserer Benutzeroberfläche. Dann auch unser Nachrichtenbereich mit dem eingestellten Timeout für dieses Out. Wenn dies in ist und dann können wir anstelle des Codes, der ausgeschnitten wird, eine Benutzeroberflächenfunktion des Startspiels direkt darüber aufrufen eine Benutzeroberflächenfunktion des Startspiels direkt . Sie auf ähnliche Weise knapp unter dem Spielende eine neue Funktion. Dieser ist UI zum Ende des Spiels. Was wir nun tun müssen, ist einen Ausschnitt dieser beiden Zeilen unten und diese in die neue Funktion zu kopieren und diese in die neue Funktion und diesen dann aufzurufen. Probieren wir das aus, über den Browser und klicken Sie auf das „Startspiel“. Dies ist jetzt entfernt und wir sehen das Endspiel. Wenn wir nun auf „Ende“ klicken, wird jetzt der Start-Button angezeigt. Nichts anderes, nur ein Re-Faktor, um unseren Code ein bisschen organisierter zu halten . Jetzt können wir diese beiden neuen Funktionen auch verwenden , um den Statistikbereich ein- und auszublenden. Wir beginnen mit der Benutzeroberfläche des Startspiels unten document.QuerySelector. Schnappen Sie sich den ursprünglichen Methodenabschnitt, den wir ausblenden können, indem Sie auf style.display zugreifen ausblenden können, indem Sie auf style.display zugreifen, und setzen Sie dies auf die Blockkette, duplizieren Sie dies, und dann können wir mit unseren Statistiken das Gegenteil tun . Wir möchten, dass der Statistikbereich ausgeblendet wird, wird dies ändern, um den Wert von none zu sein. Wir tun dies, weil wir nur möchten, dass dieser Statistikbereich am Ende des Spiels angezeigt wird, aber wir tun dies jetzt, indem beide Werte umkehren, anstelle der Benutzeroberfläche am Ende des Spiels ist der Methodenbereich wird ausgeblendet, damit wir den Statistikbereich aufdecken können, indem wir dies auf den Wert von Block festlegen, speichern Sie dies und probieren Sie dies aus. Geh zum Spiel, wir sehen den Methodenbereich, damit wir genau sehen können, was wir mit jeder Pizza und dem Spiel machen , und wir sehen jetzt unsere Statistiken. Wie wir bereits gesehen haben, ist dieser Statistikbereich nur der HTML-Bereich, daher müssen wir darauf achten, unsere variablen Werte zu jedem dieser Spannweiten hinzuzufügen . Springen Sie in unsere index.js innerhalb des Spielendes UI document.QuerySelector. Die erste unserer Spannweiten bei der Idee abgeschlossener Bestellungen, in denen wir festlegen können, dass der innere Textinhalt unserer gleichnamigen Variablen entspricht. Kopieren Sie dies noch zweimal und fügen Sie es ein. Der mittlere Teil war Pizzen fertiggestellt. Wieder mit dem übereinstimmenden Variablennamen. Der dritte war verschwendete Pizzen und verschwendete Pizzen variabel. Diese freien Variablenwerte müssen ebenfalls zu Beginn jedes Spiels zurückgesetzt werden. Der Start des Spiels UI Es wird all diese Werte zurückgesetzt. Der erste war die abgeschlossenen Bestellungen Null, die fertiggestellten Pizzen Null und auch verschwendete Pizzen 2. Probieren wir das mal aus. Wir müssen ein paar neue Bestellungen erstellen, um das Spiel zu starten. Schinken und Ananas im Ofen und Peperoni. Verschwenden Sie auch einige dieser Pizzen, also haben wir ein paar Statistiken, beenden Sie das Spiel. Sehen Sie keine Updates in den Statistiken gehen wir zu unserem Code und schauen uns dies an. Wo aktualisieren wir das? Wir aktualisieren dies am Ende des Spiels UI. Diese drei Zeilen. Wir können hier sehen, dass der Texteditor ein Problem mit den drei Punkten hervorgehoben hat . Wir haben vollständige Bestellungen , die abgeschlossen sein sollten, überprüfen Sie die Variable. Schließe das alles ab. Das sieht aus wie das Richtige, das Ergebnis. Bestellnummer 1, nämlich Schinken und Ananas, fügen Sie diese in den Ofen und dann zwei Peperonis , vervollständigen Sie die Bestellung. Als nächstes versuchen wir, eine Bestellung zu verschwenden, wir fügen etwas Peperoni und Schinken hinzu, fügen diese in den Ofen, das wird verschwendet. Klicken Sie nun auf „Ende“, sehen Sie sich eine abgeschlossene Bestellung an, die korrekt ist. In Bezug auf fertige Pizzen denken Sie daran, dass diese Variable nur aktualisiert wird , wenn der eigentliche Ofen mit dem Kochen fertig ist. Sobald der Timer, der auf 20 Sekunden eingestellt ist, dieser erst nach Beendigung dieser Kochzeit als fertige wird dieser erst nach Beendigung dieser Kochzeit als fertige Pizza hinzugefügt. Wir haben auch eine Pizza verschwendet, also ist das gut. Fast jetzt mit diesem Video fertig, haben wir auch ein paar Dinge zu reparieren. Wenn wir auf den „Start“ -Button klicken, sehen wir genau, was das ist. Wir werfen einen Blick auf den Küchenbereich, wir haben 11 bei verschiedenen Zutaten und auch der Timer ist auf 271 Sekunden, aber wenn wir auf „Start“ klicken, werden wir von dort aus weitermachen anstatt Neustart und die Zutaten werden ebenfalls verdoppelt. Beheben wir diese beiden Probleme in unserer Benutzeroberfläche zum Start des Spiels. Zuerst setzen wir unsere Zutaten zurück, indem wir den HTML-Bereich mit Abfrageauswahl auswählen. Wählen Sie die Zutaten aus und setzen Sie diese zurück, indem Sie die innerHTML auf eine leere Zeichenfolge setzen. Kümmert sich auch den Countdown-Timer, indem Sie die Count-Down-Zeitvariable so einstellen , dass sie der Spiellänge entspricht. Probieren Sie das aus. Es ist auch das Spiel, Schinken und Ananas, füge es in den Ofen. Wenn wir jetzt enden, starten wir den Timer, der zurückgesetzt wurde. Wir sehen nur den einzigen Satz von Zutaten. den Statistikbereich zu beenden, habe ich schließlich eine Fade-Animation zu unserem CSS hinzugefügt. Wenn wir in unser Stylesheet gehen, schauen wir nach dem Verblassen. Erstellen einer einfachen Animation, um im Startbereich am Ende des Spiels zu verblassen . Alles, was wir tun müssen, ist, dies als Klassennamen zu unserem Element hinzuzufügen . Um das Ende des Spiels zu sehen, duplizieren Sie eine davon, schnappen Sie sich alle Starts. Dieses Mal legen wir fest, dass der Klassenname gleich dem Fading ist. Gut, lassen Sie uns einen letzten Test im Browser geben. Starte das Spiel, wähle eine Bestellung aus, schließe die erste ab, Peperoni. Schließe ein paar dieser Pizzen ab, um endlich auf unsere Statistiken das Spiel zu beenden. Gut. Da das vorhanden ist, werde ich dieses Projekt jetzt als fertig bezeichnen. Aber es sind wahrscheinlich ein paar Dinge, die verbessert werden können und ein paar kleine Probleme, die möglicherweise auch gelöst werden müssen. Aber in diesem Projekt geht es darum, JavaScript zu lernen. Ich denke, es hat uns viel zum Üben gegeben und eine gute Chance zu zeigen, wie all diese kleinen Dinge, die Sie während dieser Klasse gelernt haben, alle zusammenarbeiten, um etwas viel Größeres zu schaffen . 50. Einführung In Den Bereich: Ein wichtiger, aber oft verwirrender Teil von JavaScript ist der Umfang. Der Umfang ist höchstens grundlegend eine Möglichkeit, Variablen in Gruppen zu platzieren. Jede Gruppe ermöglicht einen gewissen Zugriff. Dies bedeutet, dass wir eine gewisse Kontrolle darüber behalten können was Zugriff auf unsere Variablen hat. Dies ist sinnvoll , da Variablen alle unsere wichtigen Daten enthalten. Warum sollten wir wollen, dass sie auf „ Zugriff“ geändert werden , wenn sie es nicht brauchen. Hier sehen wir ein einfaches Beispiel. Wir deklarieren eine Variable namens Score. Wir haben dann eine Funktion, um den Score zu aktualisieren an der Konsole zu protokollieren. Hier ist alles vollkommen in Ordnung. Aber was ist damit , wir beschließen, dem Ergebnis einen Bonus von 10 Punkten hinzuzufügen . Diese Variable wird innerhalb der Funktion erstellt und loggt sich dann bei der Konsole an. Auch hier gibt es keine Probleme. Die Konsole zeigt einen Wert von 11 an. Die Probleme beginnen , wenn wir versuchen, außerhalb der Funktion auf diese Bonusvariable zuzugreifen. Dies würde einen Fehler verursachen, bei dem eine Meldung dem Vorbild des Bonus nicht definiert ist. Wir wissen, dass es definiert ist, weil wir sehen, dass es aufgrund des Umfangs nicht zugänglich ist. Dies geht auf diese Gruppen zurück, in die Variablen platziert werden. Da die Bonusvariable im Gegensatz zum Punktestand innerhalb der Funktion erstellt wird . Der Zugriff darauf ist auf alle Funktionen beschränkt. Aber wie wir bei JavaScript wissen, ist das nie nur das. Es gibt auch ein paar andere Dinge, die wir verstehen müssen. Zum ersten Mal seit langer Zeit können wir in einen neuen Abschnitt springen, und das ist Nummer 9 und dann in die erste Lektion springen, nämlich Einführung in den Bereich , der eine index.html hat. Um die Zugriffsstufe auf eine Variable zu steuern , hängt dies von einigen Faktoren ab. Wie wir gerade gesehen haben, ist der Ort in unserem Programm, an dem wir die Variable deklarieren , und auch die Art der Variablen , die wir erstellen. Wir können Variablen mit var, let und const erstellen , und diese haben auch Auswirkungen auf den Umfang. Dies ist das gleiche Beispiel, das wir uns gerade angeschaut haben, in dem wir eine Punktzahl mit dem Schlüsselwort var außerhalb der Funktion deklarieren . Dann aktualisieren wir innerhalb der Funktion diese Variable. Wir fügen einen Bonus hinzu und protokollieren diesen dann in der Konsole. Lasst uns in die Konsole springen. Wir können bestätigen, was wir gerade gesehen haben. Öffnen Sie uns und wir erwarten den Wert von 11. Dies funktioniert, weil die Score-Variable auf der obersten Ebene unseres Programms deklariert wird auf der obersten Ebene unseres Programms deklariert und dies nicht bedeutet, dass sie physisch oben platziert werden muss , genau wie hier. Es bedeutet nur, dass es nicht in etwas anderem verschachtelt oder deklariert ist, z. B. einer Funktion. Dies bedeutet, dass es im globalen Bereich und global zugänglich ist. Wenn wir versuchen, auf die Bonusvariable außerhalb der Funktion zuzugreifen , wo sie deklariert wurde. Wir haben drinnen nicht erklärt. Mal sehen, was unten passiert. Placement Console Log, eine Bonusvariable, die dann einen Bonusfehler zurückgibt, ist nicht definiert. Diese Bonusvariable ist darauf beschränkt, nur innerhalb dieser Funktion zugegriffen zu werden. Weil diese Funktion auch ihren eigenen Umfang hat. Dies kann für Variablen nützlich sein, wenn nein, wir müssen es nicht anderswo verwenden. Es gibt uns die Sicherheit, dass andere Abschnitte unseres Codes diese Werte nicht ändern können. Dieser Funktionsbereich bedeutet auch, dass wir mehrere Variablen mit denselben Namen erstellen könnten, aber innerhalb einer anderen Funktion und wenn wir dies dazu benötigen, wären sie völlig unabhängig. Wir können diese Zugriffsebene auch in der Konsole des Browsers sehen . Wenn wir dieses Konsolenprotokoll-Update zuerst entfernen , um diesen Browser zu löschen. Wenn wir dann den Wortstand in hier eingeben und eingeben, gibt dies den Wert von eins zurück. Dies ist richtig, weil wir den Anfangswert von eins haben und dann unsere Funktion ausgeführt wird und diese erhöht, um den Wert von eins zu sein. Das alles funktioniert, weil diese Variable global ist. Aber was wir versuchen, auf unseren Bonus zuzugreifen, der auf diese Funktion ausgerichtet ist . Probieren wir das mal aus. Geben Sie ein und wir sehen die gleiche Fehlermeldung, die wir aus dem Konsolenprotokoll hatten. Zusammen mit diesen Funktionen sind diese globalen Variablen auch in anderen block-Anweisungen wie for-Schleifen und if-Anweisungen verfügbar . Versuchen wir eine if-Anweisung direkt unter unserem Funktionsaufruf. Wenn Score, platzieren Sie es in ein Konsolenprotokoll mit dem Wert der Punktzahl und dies sollte wie erwartet funktionieren. Dies gilt auch für andere Blockanweisungen. Blockanweisungen sind im Grunde genommen Abschnitte, die in geschweifte Klammern gewickelt sind, daher haben wir die Funktion, die wir hier haben. Ich habe die if-Anweisungen, die auch diese geschweiften Klammern haben, aber auch Dinge wie for-Schleifen und While-Schleifen. Zusammenfassung. JavaScript hat das Konzept des Umfangs, damit wir festlegen wie viel Zugriff wir auf eine Variable wie dieses Beispiel haben Score wird im äußersten Abschnitt unseres Codes deklariert, was bedeutet, dass er im globalen Bereich liegt. globale Variablen wie diese kann überall zugegriffen werden, einschließlich innerhalb der Codeblöcke, die in geschweifte Klammern eingewickelt sind, dh Funktionen und if-Anweisungen. Das Gegenteil ist jedoch der Fall, wenn wir eine Variable innerhalb einer Funktion deklarieren, diese einen Funktionsbereich hat und außerhalb dieses Blocks nicht verfügbar sein wird. Schützen Sie daher die Variable davor aktualisiert oder von anderswo entfernt zu werden. 51. Nesting Bereich: Bisher sehen wir, dass der Umfang nur in eine Richtung zu funktionieren scheint, von außen nach innen. Oben deklarierte Variablen, wie diese Variable auf globaler Ebene, sind in anderen Funktionen oder Blöcken wie dieser Funktion hier verfügbar . Wir können weitermachen, indem wir andere Aussagen innerhalb anderer verschachteln , und der Umfang wird auf die gleiche Weise fortgesetzt. Der Zugriff wird von oben und unten auf jede Ebene weitergegeben, aber neue Variablen, die innerhalb neuer Blöcke deklariert sind, sind immer noch eingeschränkt. Sie werden effektiv nicht auf ein höheres Niveau zurückgebracht. Wenn wir dies im vorherigen Video sehen , wo wir versuchen, außerhalb dieser Funktion und im globalen Bereich auf diese Bonusvariable zuzugreifen außerhalb dieser Funktion und im globalen Bereich auf diese Bonusvariable . Die Verschachtelung des Bereichs wird in JavaScript und vielen anderen Sprachen als lexikalischer Geltungsbereich bezeichnet . Werfen wir einen Blick darauf, wie das in Aktion aussieht. Zu Beginn haben wir das gleiche Setup wie zuvor. Lassen Sie uns zunächst dieses Konsolenprotokoll ändern und den Text der Insider-Funktion einschließen. Wir tun das, damit es ein bisschen klarer ist, weil wir diesen Code jetzt erweitern werden, dann ist er immer noch innerhalb dieser Funktion wir können einen zusätzlichen Block verschachteln, z. B. eine if-Anweisung. Eine if-Anweisung, bei der wir überprüfen können, ob der Bonus zutrifft und ob dies der Fall ist, basierend auf einem neuen Konsolenprotokoll mit dem Text von Inside if-Anweisungen. Dann können wir die Bonusvariablen am Ende anhängen. Jetzt befinden wir uns in einer verschachtelten Block-Anweisung. Wir versuchen, von oben auf unsere Bonusvariable zuzugreifen , also was wird Ihrer Meinung nach passieren? Nun, probieren wir das mal aus. Stellen Sie sicher, dass Sie sich im Abschnitt „Verschachtelungsbereich“ und dieser im Browser geöffnet ist. Aktualisieren. Wir können wie erwartet sehen, dass der Insider-Funktionscode ausgeführt wird , weil es nichts gibt, was dies stoppen könnte. Dann wird eine Ebene nach unten in der if-Anweisung nicht nur das Konsolenprotokoll ausgeführt, sondern wir haben auch Zugriff auf diese Bonusvariable. Dies bedeutet, dass verschachtelte Anweisungsblöcke auf Variablen von einem äußeren oder einem höheren Umfang zugreifen können . Aber was ist mit andersherum? Aber wir können dies ausprobieren, indem wir eine neue Variable innerhalb unserer am tiefsten verschachtelten Anweisungen hinzufügen, also var bonus2, jede Zahl ist in Ordnung für diesen Test und wir können darauf auf der höheren Ebene zugreifen, Das ist diese Insider-Funktion, schreiben Sie den Wert von bonus2 hinzu, speichern und aktualisieren, und jetzt können wir sehen, dass wir den Wert von undefined erhalten. heißt, wir können deutlich sehen , dass dies nicht umgekehrt funktioniert. Wir werden undefiniert, sodass JavaScript sich bewusst ist, dass diese Variable existiert, aber ihr ein undefinierter Wert zugewiesen wird. Als kurze Randnotiz würde bonus2 mit let oder den const-Schlüsselwörtern deklariert, mit let oder den const-Schlüsselwörtern deklariert, einen Fehler anstatt einen undefinierten Wert zu haben. Aber bald mehr dazu. Die Verschachtelung kann auch so tief fortgesetzt werden, wie Sie möchten. Lassen Sie uns versuchen, eine neue Block-Anweisung hinzuzufügen, z. B. eine While-Schleife. Auch dies hat auch seine eigenen geschweiften Klammern, um den Code einzuschließen und einen neuen inneren Bereich zu erstellen. Lassen Sie uns zuerst den Bonus2 entfernen , den Sie nicht mehr benötigen. Wir können dies aus dem Protokoll entfernen, und dann können wir innerhalb unseres am tiefsten verschachtelten Abschnitts noch einen weiteren gehen. Erstellt eine neue Variable namens numbers, die Sie durchlaufen werden, und legen Sie fest, dass es sich um ein Array mit beliebigen Werten in hier handelt. Während Loop brauchen wir auch einen Anfangswert, den wir in i speichern können . Setze dies auf Null. Wir können diese While-Schleife weiter ausführen, während ich kleiner ist als die Länge unseres Arrays, das wir mit Zahlen, dem Land in unserem Codeblock oder unserem Bereichsabschnitt zugreifen können . Platzieren Sie ein neues Konsolenprotokoll mit Zahlen i, das jede dieser Zahlen einzeln ausgibt , also bleiben Sie nicht in einer Endlosschleife stecken. Wir können den Wert von i jedes Mal erhöhen. Testen wir das mal. Aktualisieren. werden Konsolenprotokolle von hier aus fallen. Auch hier greifen wir von diesem am tiefsten verschachtelten Abschnitt aus immer noch von einer höheren Ebene auf unsere Variable zu, und wir können noch weiter steigen und unsere Bonusvariable testen und dies in unserem tief ausprobieren verschachtelter Abschnitt. Fügen Sie dies ein, und es gibt unseren Wert von 10. auch das frühere Beispiel abgehen, können Sie wahrscheinlich sagen, was passieren wird wenn wir versuchen, die Dinge andersherum zu tun. Wenn Sie innerhalb dieser While-Schleife eine neue Variable erstellen, springen Sie hier hinein. Aber das Protokoll mit der neuen Variablen von bonus3, die jedem Wert entspricht, und dann können wir versuchen, auf der obersten Ebene unserer Funktion darauf zuzugreifen , also fügen Sie dies innerhalb unseres Konsolenprotokollbonus3 hinzu, aktualisieren. Dort sehen wir den Wert von undefined. Auf diese Weise können wir den Bereich in verschachtelten Blockabschnitten verwenden. Wir haben auch einige Beispiele dafür gesehen, wie Umfang nur von einer Weise aus zugänglich ist. Verschachtelte Abschnitte, wie unsere While-Schleife, greifen auf jede Variable aus einem hohen Bereich zu, aber es funktioniert nicht umgekehrt. 52. Block & Funktionsumfang: Springen Sie in die nächste Datei, die den Block- und Funktionsbereich ist . Wir sind nicht allzu verwirrt darüber, was wir uns jetzt ansehen werden. Ich habe das gleiche Funktionsbeispiel wie zuvor beibehalten. In diesem Beispiel haben wir mehrere verschachtelte Variablen innerhalb dieser Funktion auf verschiedenen Ebenen. Funktionen verhalten sich anders als andere Anweisungsblöcke. Jedes Mal, wenn ich Blöcke erwähne, beziehe ich mich auf den Code, der in geschweiften Klammern umgeben ist, wie diese if-Anweisungen und auch auf unsere Schleifen. Mit einer Funktion wie dieser können wir nicht auf die innen verschachtelten Variablen von außen zugreifen . Wenn wir versuchen, kurz nach unserem Funktionsaufruf ein Konsolenprotokoll zu platzieren , greifen Sie auf unseren Bonus3 zu. Sie sehen, dass Bonus3 nicht definiert ist und auch für Dinge auf anderen Ebenen wie dem regulären Bonus gleich ist. Wir haben auch das gleiche Problem, aber es spielt keine Rolle, ob die Variablen auf der obersten Ebene einer Funktion innerhalb anderer Blöcke verschachtelt sind . Selbst wenn wir diese Variablen mit let oder const deklarieren , wird es auch dasselbe sein. [unhörbar] var von lass die gleichen Ergebnisse und auch das Gleiche für const. Wechselt zurück zu var. So verhält sich eine Funktion. Es hat seinen eigenen Umfang und wir wissen genau , wo wir uns mit den darin deklarierten Variablen befinden. Aber mit anderen Blöcken ist es nicht einfach. Wenn wir dies von einer Funktion in einen der Block ändern, z. B. eine if-Anweisung, schauen wir uns an, was passiert. Verschieben Sie das Schlüsselwort function und wir können sagen, ob die Punktzahl gleich 0 ist, denken Sie daran, dass die Punktzahl im globalen Bereich deklariert ist. Wir haben immer noch die console.log für den Bonus unten. Wenn wir nun versuchen zu aktualisieren, müssen wir auch unseren Funktionsaufruf entfernen. Diese Bonusvariable ist jetzt verfügbar. Aber was ist mit einer tief verschachtelten Variablen wie Bonus3? Versuchen wir es mal. Aktualisieren Sie und dieses funktioniert auch. Wir können hier sehen, dass sich die Blöcke anders verhalten als Funktionen in Bezug auf den Umfang. Dies geschieht, weil Blockanweisungen keinen eigenen Geltungsbereich haben. Nun, das stimmt nicht genau weil es für dieses Beispiel gilt, das wir hier sehen. Als JavaScript-Entwickler haben wir jedoch mehrere Möglichkeiten, je nachdem , wie wir unsere Variablen deklarieren. Variablen, die mit dem Schlüsselwort var deklariert das wir bisher bewusst verwendet haben, werden sich immer so verhalten. Wenn Sie jedoch const oder lassen Sie diese Blöcke hineinlassen, wird der Zugriff von außen entfernt und diese zu ihrem aktuellen Block formen. Wenn wir sicherstellen wollten, dass diese Bonusvariable nur innerhalb dieses Blocks und nicht von außerhalb verfügbar ist, die wir hier haben, müssen wir sicherstellen, dass wir diese Variable mit dem const oder dem let deklarieren Schlüsselwort. Jetzt probieren wir den Bonus aus. Wir haben keinen Zugriff mehr und auch das Gleiche für const. Genau als Zusammenfassung, als wir Variablen innerhalb von Funktionen deklarierten, hatten wir nicht die Wahl , ob wir den Zugriff auf das Innere des Funktionsblocks einschränken oder sicherstellen wollten den Zugriff auf das Innere des Funktionsblocks einschränken oder , dass es von außen zugänglich. Wenn wir jedoch andere Blöcke verwenden, z. B. eine if-Anweisung oder eine Schleife, geben uns diese Blöcke die Wahl, ob wir Umfang verwenden möchten oder nicht. 53. Hissen: Zu Beginn des Kurses habe ich kurz einen Begriff namens Hissen erwähnt und versprochen, darauf zurückzukommen. Das werden wir jetzt abdecken. Wir haben bereits einige Beispiele für Hosting gesehen. Nehmen wir zuerst ein paar Beispiele , um zu sehen, was passiert. Titeldateien in diesem Hebeabschnitt enthalten einige Beispiele und die erste ist vielleicht bekannt. Dies war ein Beispiel, das wir früher im Funktionsbereich verwendet haben, und oben haben wir zwei Arrays. Wir haben das Brot und auch die Brownies. Dann haben wir ein Funktions-Setup in zwei verschiedenen Stilen. Wir haben die Funktionsdeklaration und auch den Funktionsausdruck. Beide tun dasselbe wie Sie prüfen, ob eine Zutat im ausgewählten Array vorhanden ist. Warum zeige ich dir das gleiche Beispiel noch einmal? Nun, beachten Sie hier, wie wir die Funktion in der Konsolenanmeldung oben aufrufen die Funktion in der Konsolenanmeldung oben aufrufen , bevor die Funktion erstellt wurde . Wir nennen es Scheck. Da unser Code von oben nach unten gelesen wird, gelangen wir in den Funktionsaufruf CheckAllergien , bevor er überhaupt erstellt wurde, sei es in der Deklaration oder in der Ausdrucksversion. Gehen wir zum Browser und sehen was mit diesem Konsolenprotokoll passiert. Mal sehen, ob wir daraus einen zurückgegebenen Wert zurückbekommen. Das funktioniert mit der Funktionsdeklaration, aber was ist umgekehrt? Wir kommentieren die Deklaration und setzen den Ausdruck wieder ein, aktualisieren und dies gibt einen Fehler zurück, der besagt, dass wir vor der Initialisierung nicht auf unsere Funktion zugreifen können . Darunter haben wir Beispiel 2, bei dem es sich um eine wirklich vereinfachte Version des Problems handelt. Wir erstellen ein Konsolenprotokoll und melden den Wert der Variablen an, bevor sie erstellt wurde. Wir haben vorher in der Konsole gesehen, dass das funktioniert. Wir entfernen dies einfach mit der Fehleraktualisierung. Wir können sehen, dass das einwandfrei funktioniert. Dies funktioniert, obwohl wir auf unsere Namensvariable zugreifen , bevor sie deklariert wurde, und es wird noch seltsamer, wenn wir versuchen, einen Namenswert neu zuzuweisen , bevor er deklariert wird. Oben oben, direkt über unserem Konsolenprotokoll. Was wir tun werden, ist, diese Variable mit einem neuen Wert neu zuzuweisen oder zu aktualisieren , bevor sie überhaupt erstellt wird. Das funktioniert auch. Wir werden den neuen aktualisierten Wert in der Konsole sehen. Obwohl diese Beispiele vielfältig sind, zeigen sie alle eine grundlegende Sache. Wir können oft auf Variablen zugreifen , bevor sie überhaupt deklariert werden. Dies führt uns zu einem Begriff namens Hissen. Kurz bevor wir darauf eingehen, möchte ich Ihnen etwas anderes zeigen, was eine Varianz des letzten Beispiels ist. Was ist ganz unten, wenn Sie ein Konsolenprotokoll hatten , das den Wert der Rolle übergibt? Wir deklarieren diese Variable dann, ohne sie mit einem Wert zu initialisieren, und geben dieser dann ganz am Ende einen Wert . Testen wir das mal. Speichern und aktualisieren. Sie können sehen, dass diese leicht modifizierte Version den Wert von undefined zurückgibt. sich diese beiden Beispiele ansieht, mag es ziemlich seltsam erscheinen weil wir uns ansehen, wie wir auf Variablen zugreifen können , bevor sie deklariert werden, und auch da beide Beispiele ziemlich ähnlich sind. Hissen wird oft als der Prozess von JavaScript beschrieben , wobei unsere Variablen und Funktionsdeklarationen übernommen und an die Spitze des Programms oder an die Spitze ihres Umfangs an die Spitze des Programms oder an die verschoben werden, was bedeutet, dass sie deklariert und jederzeit während unseres Codes zuzugreifen. Dies würde vieles erklären, was wir gerade gesehen haben. Keiner der Codes wird physisch verschoben oder an den Anfang unseres Programms verschoben. Es ist der Prozess, bei dem unsere Variablen und Funktionsdeklarationen zur Kompilierzeit im Speicher abgelegt werden . Der von Menschen lesbare Code, den Sie schreiben, wie JavaScript, kann von einem Computer gelesen werden. Es muss zuerst hinter den Kulissen in eine Reihe von Anweisungen konvertiert oder kompiliert werden Kulissen in eine Reihe von , die Computer verstehen können. Während dieser Kompilierphase wird unser Code zuerst gelesen oder übergeben. Unsere Variablen und Funktionsdeklarationen werden dann im Speicher gespeichert. Nur um klarzustellen, dass während dieser Kompilierphase, in der dieses Programm zum ersten Mal übergeben wird, Variablen wie dieses zuerst im Speicher gespeichert werden, weshalb wir auf sie zugreifen können, bevor wir scheinen überhaupt zu haben hat sie erschaffen. Hinter den Kulissen gibt es keine versteckte Magie, keine Bewegung unseres Codes an die Spitze des Programms. Es wird einfach unser Code gelesen und ein Verweis auf alle Variablen und Funktionen, die im Speicher gespeichert sind. Dies erklärt ein paar Dinge aus unseren Beispielen. Erstens, wenn wir uns dieses Funktionsbeispiel oben ansehen . Das erste Beispiel, die Funktionsdeklaration. Funktionsdeklarationen werden gehisst. diesem Grund können wir diese Funktion aufrufen , bevor sie überhaupt deklariert wird, was wir mit unserem Konsolenprotokoll sehen. Funktionsausdrücke werden jedoch nicht angehoben, und deshalb haben wir einen Fehler in der Konsole festgestellt. Zum Beispiel 2, das allererste. Da dieser Variablenname von Chris gehisst wird, können wir deshalb darauf zugreifen, bevor er überhaupt erstellt wurde, obwohl dies für die zweite Version, die zurückkehrt, anders war undefiniert. Warum glauben Sie, dass es einen Unterschied zwischen diesen beiden Variablen gibt? Nun, ein wichtiger Teil zu verstehen ist, was genau gespeichert wird. Um dies besser zu verstehen, gehen wir einen kurzen Schritt zurück zu den variablen Grundlagen. Zuvor haben wir uns einige dieser variablen Schlüsselwörter angeschaut dieser variablen Schlüsselwörter angeschaut und eine Deklaration ist, wenn wir eine Variable deklarieren, die Sie verwenden möchten, und geben ihr dann einen Namen. Sobald wir ihm dann einen tatsächlichen Wert übergeben haben, wird dies als Initialisierung bezeichnet. Sie haben Deklaration und Initialisierung. Zurück zu diesem Beispiel für unsere Rollenvariable. Hier haben wir eine leere Variable deklariert und danach haben wir sie mit dem Wert von dev initialisiert. In der frühen Kompilierphase nur die leere Variablendeklaration wird nur die leere Variablendeklaration gehisst und im Speicher gespeichert. Obwohl die folgende Zeile, in der wir es initialisieren, dieser Wert von Entwickler zu diesem Zeitpunkt ignoriert. In diesem Stadium wird ihm der Wert von undefined zugewiesen. diesem Grund sehen wir in der Konsole undefiniert. Mit den vorherigen Beispielen, da wir dies jedoch mit einem Wert von Chris initialisieren, der Variablen in der Kompilierphase wird der Variablen in der Kompilierphase dieser Wert statt undefiniert zugewiesen . Um die Dinge noch verwirrender zu machen, müssen wir hier daran denken, dass wir das Schlüsselwort var für beide Beispiele verwenden . Das Verhalten unterscheidet sich auch mit dem Schlüsselwort let oder const. Wenn wir unsere Rolle auf den Grund ändern, um es zu lassen, schauen wir uns an, was hier passiert . Wir loggen uns den Wert der Rolle ein, aktualisieren und jetzt erhalten wir jetzt einen Fehler innerhalb der Konsole, anstatt dass der Wert von undefined dieser Variablen zugewiesen wird. Dieser Fehler besagt, dass wir vor der Initialisierung nicht auf unsere Rolle zugreifen können . Dies liegt daran, dass wenn wir das Schlüsselwort const oder let verwenden , es zuerst mit einem Wert deklariert werden muss , bevor wir darauf zugreifen können. Wenn wir ihm nicht zuerst einen Wert zuweisen, wird ihm hinter den Kulissen immer noch ein Wert von undefined gegeben , aber wir müssen ihn trotzdem deklarieren bevor wir versuchen, in unserem Code darauf zuzugreifen. Dies kann besonders am Anfang ein kniffliges Thema sein, da das Hissen für alle drei dieser Schlüsselwörter gilt, es gilt für let, var und const. Var macht die Dinge jedoch ein bisschen anders, wie wir es gerade gesehen haben. Aber selbst wenn Sie nicht vollständig verstehen, was zu diesem Zeitpunkt vor sich ging, ein grundlegendes Verständnis dafür kann Ihnen ein grundlegendes Verständnis dafür, dass Variablen hochgezogen werden , in Zukunft viel Ärger ersparen , wenn Sie laufen in einen ähnlichen Fehler hinein. 54. Temporal Dead Zone: Die temporale Totzone klingt schwieriger als sie tatsächlich ist. Die meisten Konzepte es umgeben, wurden in früheren Videos behandelt. Wenn wir uns den Code im Skriptbereich unten ansehen, haben wir ein Konsolenprotokoll und eine Variable. Wir wissen, dass eine Variable, die wie diese mit dem Schlüsselwort var erstellt wurde, Zugriff findet , bevor sie deklariert wurde. Dies liegt daran, dass die Variable an die Spitze ihres Geltungsbereichs angehoben wird . Wir können dies sehen, indem wir zuerst darauf zugreifen , und ich lege es in die Konsole, damit alles völlig gut funktioniert. Aber wie wir auch herausgefunden haben, ist das Verhalten anders, wenn wir die neueren let- oder const-Schlüsselwörter verwenden . Eine andere Möglichkeit, dies zu betrachten, wäre vielleicht, eine Variable zu initialisieren, bevor wir sie verwenden. Wenn wir den Wert entfernen und diesen dann nach oben initialisieren , ist der Name gleich Chris. Mal sehen, was hier drin passiert. Wir haben immer noch einen Fehler, da wir versuchen, zu früh auf unseren Namen zuzugreifen , bevor er überhaupt initialisiert wurde. Aber was ist, wenn wir die Linien eins und drei umschalten würden? Nun, wenn wir eins ganz unten platzieren und dann das Schlüsselwort let nach oben verschieben, dies stattdessen den Wert von undefined zurück. Dies wird auch im vorherigen Video angesprochen. Wenn wir einer Variablen mit dem Schlüsselwort let keinen Wert zuweisen , bevor wir sie verwenden , wird sie stattdessen mit dem Wert undefined initialisiert . Const, let und var erhalten alle den Wert undefined, wenn wir den Anfangswert nicht festlegen bevor wir versuchen, auf die Variable zuzugreifen. Der Unterschied ist, dass var zugegriffen werden kann , bevor es überhaupt deklariert wurde, genau wie wir es im vorherigen Video gesehen haben. Wie hängt das alles mit der temporalen Totzone zusammen? Nun, es ist einfach ein Name für etwas, das wir bereits gesehen haben , wenn wir die Schlüsselwörter const und let verwenden. Es ist der Name für einen Zeitraum, ab dem wir einen bestimmten Bereich eingeben, bis hin zu dem Zeitpunkt , an dem eine Variable initialisiert oder zugänglich ist. Eine Variable kann existieren, aber sie ist noch nicht initialisiert. In diesem Fall soll es sich in der temporalen Totzone befinden und wir können nicht darauf zugreifen oder sie so verwenden, wie wir es wollen. Wenn das alles etwas verwirrend klingt, lassen Sie uns ein Beispiel vereinfachen um Ihnen ein besseres Verständnis zu vermitteln. Was wir tun werden, ist, dass wir unsere oberste Zeile angesichts des Konsolenprotokolls entfernen unsere oberste Zeile angesichts des Konsolenprotokolls und sagen, dass der Name gleich einem Wert ist. Wenn wir das ausprobieren, wissen wir, dass dies nicht funktionieren wird, wie wir es in früheren Beispielen gesehen haben. Dies liegt daran, dass wir von Beginn des aktuellen Bereichs an die temporale Totzone betreten. Lassen Sie uns einen Kommentar hinzufügen, die temporale Totzone beginnt. Dies ist alles auf der obersten Ebene unseres Skripts, also befindet es sich im selben Umfang. Es ist nicht in einem inneren Bereich wie einer Funktion oder einer if-Anweisung verschachtelt . Wenn dann unsere Variable in Zeile 14 initialisiert wird, die aktuelle temporale Totzone endet die aktuelle temporale Totzone und die Variable ist jetzt zugänglich. Seine Anfangs- und Endzone passiert auch in jedem anderen Bereich. Wenn dies beispielsweise in einem bestimmten Block war, z. B. einer Funktion oder einer if-Anweisung, die in den geschweiften Klammern umgeben ist, würde dies auch zutreffen. Wenn man sich dieses Beispiel anschaut, scheint es, dass die Code-Reihenfolge der entscheidende Faktor ist, da die Variablendeklaration stattfindet, nachdem wir versucht haben , im Konsolenprotokoll darauf zuzugreifen. Dies ist jedoch nicht der Fall. Wie bereits erwähnt, ist die temporale Totzone eine Zeitspanne, von dem wir einen bestimmten Bereich betreten, bis hin zur Initialisierung einer Variablen. Es ist die Zeit, die wichtig ist und nicht die Reihenfolge des Codes, da sich das Wort temporal tatsächlich auf die Zeit bezieht. Wir können dies sehen, wenn wir dieses Protokoll in eine Funktion umwickeln. Erstellen Sie eine Funktion nach oben. Sagen wir 'nimm den Namen. Melden Sie sich mit dieser Konsole in einer Funktion an und rufen Sie dann unsere Funktion auf. Wir können jedoch erwarten, dass dies einen Fehler verursachen wird, genau wie wir es zuvor gesehen haben. die Code-Reihenfolge anschaut, das Konsolenprotokoll immer noch passiert das Konsolenprotokoll immer noch, bevor wir unsere Variable deklarieren. Es ist verständlich, dass Sie möglicherweise einen Fehler erwarten. Dies ist jedoch nicht der Fall da die Funktion tatsächlich außerhalb der temporalen Totzone aufgerufen wird. Die temporale Totzone ist nicht die Code-Reihenfolge, es ist die Zeit, die benötigt wird, um diese Variable tatsächlich zugänglich zu machen. Hier und auch in den letzten Videos gibt es einige komplizierte Dinge zu erfassen . Ich erwarte nicht, dass Sie beim ersten Versuch alles vollständig bekommen, aber ich denke, es ist wichtig zu wissen, dass diese Dinge existieren, weil Sie eines Tages deswegen auf ein Problem stoßen können beim ersten Versuch alles vollständig bekommen, aber ich denke, es ist wichtig zu wissen, dass diese Dinge existieren, weil Sie eines Tages deswegen auf ein Problem stoßen können und es kann Sie nur dazu veranlassen, über diese Konzepte nachzudenken und wie sie sich auf Ihren Code auswirken könnten. Wie erleichtern wir unser Leben und minimieren Fehler? Nun, ein einfacher Weg könnte darin bestehen, const zu setzen und Variablen an den Anfang ihres erforderlichen Umfangs zu setzen, sei es ganz oben in einer if-Anweisung, an der Spitze einer Funktion oder sogar ganz oben in unserer Skripte. Auf diese Weise sind sie bei Bedarf immer einsatzbereit. 55. Verschlüsse: Wenn wir Funktionen erstellen, müssen sie nicht immer eigenständige Funktionen sein. Sie können stattdessen im Starterprojekt verschachtelt werden. In diesem Schließabschnitt sehen Sie hier, dass wir einen leeren Skriptbereich haben. Jetzt erstellen wir eine einfache Funktion um die Wirkung von Schließungen zu demonstrieren. Springen Sie in den Skriptbereich und erstellen Sie hier eine reguläre Funktion. Ich nenne diesen das äußere Innere mit einer Variablen. Wir sagen äußerer Wert. Ich setze das auf eine Reihe von Äußerem. Jetzt können wir hier eine zusätzliche Funktion verschachteln. Ich blase einfach unsere Variable und erstellt eine neue Funktion. Diesmal mit dem Namen „Inner“. Wir werden tun, was wir direkt oben getan wir erstellen eine neue Variable. Dieser kann in einem Wert sein, der der Zeichenfolge von inner entspricht. Dann erstellen wir innerhalb dieser inneren Funktion zwei Konsolenprotokolle. Der erste wird für den Wert des inneren Wertes sein , der in derselben Funktion enthalten ist. Wir werden dies duplizieren und unseren äußeren Wert setzen. Wir wissen aus früheren Videos , dass wir bei der Arbeit mit Scope und wenn wir den Umfang innerhalb von Funktionen oder Klammern wie diesen verschachteln , immer noch auf Variablen zugreifen können, die in äußeren Ebenen erstellt wurden, wie diese hier. Grundsätzlich kann ein innerer Bereich auf Variablen aus einem äußeren Bereich zugreifen. Damit diese innere Funktion unsere Konsolenprotokolle tatsächlich ausführen und im Browser platzieren können. Wir müssen dies hier aufrufen, so genannte innere Funktion macht Sie diese innerhalb der äußeren Funktion verschachtelt ist. Dann rufen wir endlich unsere äußere Haupt-Funktion auf, wir tun dies auch innerhalb eines Konsolenprotokolls. Stellen Sie sicher, dass Sie die Klammern platzieren. Dann teste das aus, indem du in die Konsole springst. Wir sehen inneres, wir sehen außen, was unsere beiden Konsolenprotokolle sind. Dann ist der dritte unten der Wert unserer Funktion , der nicht definiert ist. Wir können diesen undefinierten Wert im Moment ignorieren , da wir von dieser Funktion nichts zurückgegeben haben . Aber wir wissen jetzt, dass dies funktioniert, da wir unsere beiden Konsolenprotokolle haben , während wir von innerhalb dieser inneren Funktion auf beide Variablen zugreifen können . Wir können zuerst auf den inneren Wert zugreifen , da er für diese Funktion lokal ist. der Scope-Kette können wir auch auf den äußeren Wert zugreifen Aufgrund der Scope-Kette können wir auch auf den äußeren Wert zugreifen. Der von Ihnen erwähnte Geltungsbereich oder lexikalische Geltungsbereich ermöglicht dieser inneren Funktion den Zugriff auf unsere beiden Variablen. Was ist mit dieser inneren Funktion wurde aus dieser aktuellen Einstellung herausgezogen. Ich spreche nicht davon, die innere Funktion physisch woanders zu bewegen. Aber was wäre es, wenn wir es in einer Variablen speichern und anderswo nutzen würden? Nun, um dies tun zu können, stattdessen zurück, anstatt die innere Funktion ganz unten aufzurufen wir sie stattdessen zurück, anstatt die innere Funktion ganz unten aufzurufen, also entfernen wir dies und geben den Wert von inner zurück. Der wichtige Teil, den Sie hier verstehen müssen, ist, dass wir die eigentliche innere Funktion zurückgeben. Wenn wir diese äußere Funktion aufrufen. Wir können das in der Konsole sehen. Wir loggen uns immer noch ein und führen das auch aus. Wenn wir dies aktualisieren, sehen wir diese innere Funktion jetzt in der Konsole. Ertragen Sie mit mir hier hier. Was wir hier in diesem Stadium machen , ist, dass wir es ein Äußeres nennen, das die innere Funktion zurückgibt. Diese innere Funktion ist Grunde eine eigenständige Information. Es hat keinen Bezug auf diese äußere Funktion oder Inhalte darin. Schnappen wir uns diesen inneren Wert , den wir im Konsolenprotokoll sehen können. Installieren Sie dies innerhalb einer Konstante namens interact. Jetzt stelle ich statt direkt die äußere Funktion ein. Wir können unsere ständige Aktualisierung einsetzen und wir können immer noch sehen, dass wir Zugriff auf diese innere Funktion haben . Alles, was wir hier tun, ist eine Variable zu erstellen, die einen Verweis auf diese zurückgegebene Funktion speichert . Diese Variable kann jetzt an anderer Stelle verwendet werden. Was wir jetzt haben, ist eine Funktionsreferenzunabhängigkeit der ursprünglichen äußeren Funktion. Dies hinterlässt uns jetzt eine zentrale Frage. Diese innere Funktion, die wir in einer Konstante gespeichert haben, greift von außen auf diese Variable zu. Nun, wir können es herausfinden, indem wir diese Funktion tatsächlich ausführen indem wir die Klammern kurz nach dieser Konstante platzieren. Sagen Sie dies, denken Sie daran, dass wir immer noch versuchen, auf seinen äußeren Wert zuzugreifen. Aktualisieren Sie, und wir sehen immer noch unsere beiden Konsolenprotokolle. Das heißt ja, wir können immer noch auf diese äußeren Variablen zugreifen. Das mag ziemlich merkwürdig erscheinen. Wir greifen auf Variablen zu , die mit dem, was wir bereits über den Umfang gelernt haben, keinen Sinn zu ergeben scheinen . Dies alles bezieht sich auf etwas, das als Schließungen bezeichnet wird. Eine Funktion, genau wie unsere innere Funktion hier, werden wir uns auch daran erinnern, auf welche Variablen sie Zugriff hat. In unserem Fall ist es dieser äußere Wert. Das nennt man eine Schließung. Die Schließung ist ein Zaun um alles, zu dem wir Zugang haben. Denken Sie an alle diese Variablen wo auch immer diese Funktion in Zukunft aufgerufen werden kann. Dies kann jetzt nützlich sein, denn anstatt einen äußeren Wert als globale Variable erstellen zu müssen , können wir diesen Zugriff stattdessen auf diese Funktion einschränken und trotzdem jedes verschachtelte innere zulassen Funktionen, um es zu benutzen. Beachten Sie auch, dass dieser Begriff von Schließungen nur innerhalb von Funktionen erfolgen kann . Das ist immer noch nicht klar. Werfen wir einen Blick auf ein anderes Beispiel, das den Spielerstand verwendet , der aktualisiert werden muss. Wir werden das alles einfach auskommentieren und ganz unten. Erstellen Sie eine neue Variable. Scrollen wir, um gleich 0 zu sein. Erstellen Sie dann eine neue Funktion namens Update-Score. Dann hier drinnen weisen wir unseren Punktestand erneut mit dem Wert des aktuellen Punktepunkts plus 10 zu. Melden Sie dies bei der Konsole an. Rufen Sie unten unsere Funktion auf. Testen wir das mal. Dies sollte ein Wert von 10 sein, da wir unsere ursprüngliche Punktzahl von 0 haben. Wir rufen dann unsere Funktion auf , die 10 zur ursprünglichen Punktzahl hinzufügt und dann den neuen Wert ausgibt. Wenn wir dies mehrmals aktualisieren, indem wir unsere Funktion mehrmals aufrufen, sollten sie auch funktionieren. Das ist alles in Ordnung, es funktioniert wie wir wollten, aber die Punktzahl, die wir außerhalb einer Funktion haben , wird als globale Variable eingestuft. Es kann auch aus anderen Bereichen aktualisiert werden. Stattdessen ist es besser, mehr Kontrolle über diese Variable zu haben und sie nur innerhalb der zu diesem Zweck erstellten Funktionen zu aktualisieren . Sie denken vielleicht, lassen Sie uns diese Variable in die Funktion verschieben . Wir können das runterziehen. Diese Technik erzeugt einen Funktionsbereich und auf seine Variable kann nicht von außen zugegriffen werden. Dies löst eines unserer Probleme, schafft aber auch ein anderes. Sehen wir uns das im Browser an, aktualisieren Sie es. Wir erhalten den Wert von 10 freien Zeiten zurück, da die Variable zu Beginn jedes Funktionsaufrufs wieder auf Null zurückgesetzt wird. Auch wenn dies ein echtes Spiel war, möchten wir möglicherweise auch außerhalb dieser Funktion auf die Score-Variable zugreifen . Vielleicht machen Sie so etwas wie die Anzeige auf dem Bildschirm für den Benutzer. Um dabei zu helfen, können wir eine Schließung verwenden, um innerhalb einer Funktion zum Aktualisieren der Score-Variable zu verschachteln. Wir haben den äußeren Wrapper des Update-Scores. Dann können wir ein neues verschachteltes in einer Funktion namens Vergrößern erstellen , wobei unsere Score-Variable im Inneren und auch dem Konsolenprotokoll das die innere Funktion ist, genau wie zuvor. Speichern Sie diese Funktion auch in eine neue Variable. Der erste, wir sagen const, new score ist gleich diesem zurückgegebenen Wert. Wir könnten diese Funktion immer noch mehrmals aufrufen , wenn Sie möchten. Aber dieses Mal müssen wir auf diese neue Punktzahl verweisen , also ändert es sich. Lassen Sie auch kurz danach in den Klammern stehen, also führen wir diese Funktion tatsächlich aus. Dann probiere das durch Erfrischung aus. Dies hat sich jedes Mal, wenn wir unsere Funktion aufrufen, um den Wert von 10 zugenommen . Dies löst nun die Probleme, die wir zuvor mit der ursprünglichen Update-Score-Funktion hatten. Bevor wir diese Änderungen vorgenommen haben, setzen wir die Score-Variable auf Null zurück. Dies bedeutete, dass das Ergebnis, wie wir zuvor gesehen haben , jedes Mal, wenn wir diese Funktion aufrufen , immer der Wert von 10 war und dies nicht zu jedem der Aufrufe hinzufügte. Schließungen lösen dies, indem sie sich bei jedem Aufruf an die Score-Variable im Speicher erinnern . Eine Score-Variable hat jetzt auch engeren Umfang, sodass wir nicht versehentlich anderswo aktualisiert werden können versehentlich anderswo aktualisiert wenn es sich um eine globale Variable handelt. Wenn wir jedoch immer noch nicht von außerhalb dieser Funktion auf diese Score-Variable zugreifen mussten . Wir können einen Wert zurückgeben und diesen innerhalb einer neuen Variablen speichern. heißt, wir könnten immer noch von innerhalb der Schließung auf diesen Punktestand zugreifen und es dem Endbenutzer anzeigen. 56. Ein Bisschen Hintergrund: Dieser neue Abschnitt enthält einige Schlagworte wie: Callbacks, asynchron, synchron und auch einige Konzepte, die schwer zu verstehen sind, ohne ein bisschen zu wissen Hintergrund, warum wir sie benutzen. Dieses Video wird versuchen, diese in einfachen Worten zu erklären und was genau jeder tut. Beginnend mit synchronem Code. Jede Codezeile ist ein bisschen wie eine Aufgabe und jede wird in der richtigen Reihenfolge abgeschlossen. Zeile 1 wird gelesen, warten Sie, bis dies verarbeitet wurde, und fahren Sie dann mit Zeile 2 fort. Wir werden auch darauf warten, dass dies beendet ist, bevor dann zur dritten Zeile übergehen. Bei einem winzigen Programm wie diesem spielt es keine Rolle , da die Operationen schnell und einfach zu verarbeiten sind und Sie keine Wartezeit zwischen jedem einzelnen bemerken würden . Aber im Extremfall, wenn eine Zeile die Verarbeitung nie beendet hat oder lange gedauert hat , bleiben wir fest. Im Browser können wir einige einfache Beispiele dafür sehen, also springen Sie in diesen neuen Abschnitt, der Nummer 10 ist, Asynch-Javascript. In einem kleinen Hintergrundbereich haben wir zwei Beispiele, aber jetzt konzentrieren wir uns auf Beispiel 1, das nicht kommentiert ist und auch auf den HTML-Code oben. Wir haben den Button und die Überschrift der Stufe 3. Ignoriere das Bild vorerst, dies bezieht sich auf das zweite Beispiel. Alles, was wir hier tun, ist, diese beiden ersten beiden Elemente zu greifen. Wir fragen den Selektor ab, wir wählen unseren Button aus. Fügen Sie einen EventListener hinzu , der auf den Klick wartet, und diese Funktion löst eine Warnung aus , und kurz danach greifen wir unsere Überschrift und setzen den InnerText-Inhalt effektiv wenn wir zwei Stufen zu dieser Funktion. Warnungen können zum Beispiel so gut sein, da sie die Ausführung des Codes blockieren, bis wir ihn schließen. Wenn wir dies jetzt im Browser öffnen; kopieren Sie den Pfad dazu, fügen Sie ihn ein und aktualisieren Sie ihn, wir sehen unsere Schaltfläche, die nun auf den Klick abhört. Ich klicke darauf, wir sehen dann das Pop-up das die allererste Zeile unserer Funktion ist, und wenn wir dann auf diesen Button klicken, wird es geschlossen. Die nächste Zeile der Funktion wird dann aufgerufen, die den innerText der Überschrift setzt, sodass wir eine klare Reihenfolge der laufenden Dinge haben. Wir haben die Warnung, und sobald dies beendet ist, bewegt er sich zum Einstellen des Textes. In diesem Beispiel wird jede Zeile nicht in die vorherige Zeile laufen, wie abgeschlossen. So funktioniert synchroner Code. Eines der Probleme bei synchronem Code ist, dass eine einzelne Codezeile die Ausführung des restlichen Programms verhindern kann , was durch die Verwendung von asynchronem Code vermieden werden kann. Der Code wird immer noch zeilenweise gelesen , eine Operation muss jedoch nicht abgeschlossen werden, bevor Sie zur nächsten Zeile übergehen. Effektiv wird der gesamte Code ausgeführt und dann nacheinander abgesetzt. Wir müssen damit umgehen, was zu tun ist, wenn jede Aufgabe abgeschlossen ist, und dies ist der entscheidende Teil hier, und was zu tun ist, wenn der Code erfolgreich ist oder ein Fehler vorliegt. unser zweites Beispiel ansehen, lassen Sie uns diesen Abschnitt einfach auskommentieren. Hier haben wir etwas namens Fetch. Dies ist die Fetch-API, und denken Sie daran, dass wir von früher bestimmte Web-APIs wie Canvas haben . Diese Fetch-API ermöglicht es uns, Dinge in einem Netzwerk abzurufen, bei denen es sich um eine andere Website, eine Datenbank, einen Server oder eine externe API handeln könnte , die jemand anderes erstellt hat , und das Wichtigste hier ist der Fetch-Aufruf asynchron. Es wird ausgeführt und lässt dann den Rest des unten stehenden Codes laufen auch den Rest des unten stehenden Codes laufen, bevor er abgeschlossen ist, oder er erhält Daten zurück. Die Grundidee hier ist, dass wir Daten von woanders erhalten als innerhalb unserer eigenen Anwendung. In diesem Beispiel wird ein Bild aus Wikipedia ausgewählt und dann den Rückgabewert in einer Variablen gespeichert. Protokollieren wir zunächst den Rückgabewert dieser Variablen in der Konsole. einfach dieses erste Beispiel heraus und platzieren Sie es dann in ein Konsolenprotokoll mit dem Wert der Variablen , die ImageSource des Browsers ist. Springe in die Konsole und wir werden etwas sehen, das „Versprechen“ genannt wird. Wir bekommen ein Versprechen zurück und es hat das Ergebnis in Klammern von ausstehend, also worum es geht Ihrer Meinung nach , worum es geht? Nun, wir werden bald Promises genauer nachschlagen, aber es geht auf den wichtigen Punkt zurück , den ich zuvor erwähnt habe. Wenn Sie kurz asynchronen Code oder Asynchron verwenden, müssen wir damit umgehen, was passiert, wenn der Code erfolgreich ist oder wenn ein Fehler aufgetreten ist, und ein Versprechen kann dies für uns erledigen. Als wir das erste Mal von Wikimedia nach diesem Bild gefragt haben, wissen wir derzeit nicht, ob die Wikimedia-Site ausgefallen ist , langsam läuft oder ob es ein Verbindungsproblem zwischen uns und ihrem Server gibt . Dieses unten stehende Konsolenprotokoll wurde sofort nach unserem Abruf aufgerufen, also wurde es ausgeführt, bevor das Image überhaupt zurückkam. diesem Grund erhalten wir das Ergebnis von ausstehend, da wir nie ein Image hatten, um uns tatsächlich an der Konsole anzumelden. Als weiteres Beispiel, wenn dies ausstehend ist und wir kein Image haben, was ist, wenn wir versuchen, das Konsolenprotokoll vielleicht um drei Sekunden zu verzögern ? Nun, lasst uns das rausschneiden. Wir können ein Timeout einsetzen, das eine Funktion auslöst, und sagen wir drei Sekunden. Platzieren Sie innerhalb der Funktion ein weiteres Konsolenprotokoll von zuvor, aktualisieren Sie es, und Sie können nach drei Sekunden sehen, dass unser Versprechen nun erfüllt ist. Wir haben eine Antwort, also drei Sekunden warten, haben wir die Zeit, die Informationen oder das Bild, das wir benötigen, zurückzubekommen . Wenn es sich um einen synchronen Code handelte, müsste der Rest des Codes stattdessen darauf warten, dass dieses Bild drei Sekunden lang zurückkommt , auch wenn wir es nicht verwenden müssten. Oder wenn wir es nie so behandelt haben, kann die Zeile, die unmittelbar auf unseren Abrufaufruf folgt, versuchen , auf unser Bild zuzugreifen, das Sie nicht zurück haben, und verursacht daher einen Fehler. Vor diesem Hintergrund werden wir uns Versprechen und andere Möglichkeiten ansehen, Versprechen und andere Möglichkeiten mit einer Antwort in den kommenden Videos umzugehen. 57. Callback-Funktionen: Dieses Video wird Ihnen etwas vorstellen , das als Callback-Funktion bezeichnet wird. Ein Callback ist nur der Name einer Funktion, die aufgerufen wird, nachdem etwas passiert ist. Die Anomalie, die als nächster Schritt verwendet wird, sobald etwas abgeschlossen ist. Nach dem, was wir zuvor behandelt haben, wissen wir, dass der asynchrone Code einige Zeit in Anspruch nehmen kann. Dies könnte das Abrufen von Daten aus einer Datenbank oder sogar das Speichern in einer Datenbank sein. Mal sehen, wie sich dies auf unseren Code auswirken kann. Der Code in diesem Beispiel beginnt mit einer leeren, ungeordneten Liste. Jetzt hat unser Skript ein leeres User-Array. Eine typische App, die Benutzer hat hätte wahrscheinlich eine Funktion, um unsere Datenbank aufzurufen und das Array dieses Benutzers mit dem Ergebnis zu aktualisieren. Wir haben eine Funktion, um dies zu simulieren und zwei neue Benutzer hinzuzufügen. Alles, was wir innerhalb dieser Funktion tun, ist, auf unser Benutzerarray zuzugreifen und es an Benutzerobjekte zu platzieren. Sobald wir unsere Benutzer wieder aus unserer Datenbank haben, die wir hier assimilieren, werden wir wahrscheinlich als Nächstes eine neue Funktion erstellen möchten , die alle unsere Benutzerschleifen durchzieht jeder und dann zeigt es sie im Browser an. Werfen wir einen Blick darauf, wie das geht. Wir werden eine Funktion erstellen, sagen wir ListUsers. Unter ListUsers greift zuerst auf ein Benutzer-Array zu, wir mit forEach durchlaufen, das eine Funktion für jeden unserer Array-Werte ausführt oder den Variablennamen des Benutzers übergibt. Führen Sie das dann aus, bevor wir diese leere ungeordnete Liste haben, können wir für jeden unserer Benutzer ein neues Listenelement erstellen. Const-Elemente sind gleich document.createElement, erstellen Sie ein neues Listenelement und fügen Sie dann den Textinhalt hinzu , der der Benutzername ist. documents.createTextNode , wo wir unsere Benutzervariable nutzen und auf die Name-Eigenschaft zugreifen können unsere Benutzervariable nutzen . Wie immer müssen wir unseren dreiteiligen Prozess erstellen, der darin besteht, die Elemente zu erstellen, den Inhalt zu erstellen und diese dann im dritten Teil zusammenzuführen. Um die übergeordneten Elemente abzurufen, rufen wir AppendChild auf, fügen den Namen hinzu und fügen dieses Element schließlich zu unserer ungeordneten Liste hinzu. Schnappen Sie sich zuerst unsere ungeordnete Liste mit document.QuerySelector, fügen Sie sie in unsere ungeordnete Liste und dann appendChild, das sind unsere Elemente. Dies ist es für unsere Listenbenutzerfunktion. Wir können dies unten aufrufen und überprüfen alles im Browser funktioniert sogar die Namen unserer beiden Array-Werte. Das funktioniert vollkommen gut. Wir haben keine Probleme mit funktionalen Daten, da wir wissen, dass sie sich in derselben Datei befinden. Aber realistisch gesehen werden wir wahrscheinlich unsere Benutzer aus einer Datenbank zurückholen, und dieser Datenbankaufruf wäre asynchron und kann einige Zeit in Anspruch nehmen. Wenn das alles gut gelaufen ist, wird die Zeitverzögerung gering sein, aber dennoch eine Verzögerung. Um diese Verzögerung zu simulieren, könnten wir unseren beiden Funktionen auch ein setTimeout hinzufügen. Ich hole unsere Benutzer, lasst uns das ausschneiden, einen setTimeout-Aufruf und dann eine Funktion abgeben. Ich würde dem nur eine Sekunde Verzögerung hinzufügen. Öffnen Sie den Funktionstext und fügen Sie ihn in unser Benutzerarray ein, und sehen wir uns jetzt an, was im Browser passiert. Aktualisieren, und selbst nach einer Sekunde sehen wir unsere Benutzer nicht im Browser. Jetzt wurde der Benutzer aufgelistet, da wir sofort Lupin der Benutzer unten sind der Benutzer unten da unsere Funktion sofort aufgerufen wird. Dies geschieht effektiv vor der Verzögerung um eine Sekunde nach unserem Timeout, was bedeutet, dass es keine Werte hat, wenn wir versuchen, auf unsere Benutzer zuzugreifen . Dies ist eine übliche Sache, mit der wir umgehen müssen, wenn wir mit extern gespeicherten Daten arbeiten, fragen wir grundsätzlich nach den Daten, die wir benötigen, aber wir müssen auch sicherstellen, dass die Daten zurückgegeben und verfügbar sind bevor wir sicher darauf zugreifen können. Es muss in Ordnung sein, damit die Dinge nicht kaputt gehen. Obwohl wir die Funktionen in der richtigen Reihenfolge aufrufen , also werden wir unsere Benutzer erstellt und dann unsere Benutzer auflisten, verursacht die Zeitverzögerung das Problem. Wir können dies auch mit einigen Konsolenprotokollen bestätigen. Zunächst einmal, wenn wir direkt nach dem Erstellen unserer Benutzer in einem Ort platzieren, platzieren Sie den ersten und wir sagen, dass dies die GetUsersFromDatabase-Funktion ist und dann auch eine darin platziert wird unsere Listenbenutzerfunktion mit dem Text der Listenbenutzer. Wenn diese Zeitverzögerung nicht von oben nach unten läuft, würden Sie erwarten, dass das erste Konsolenprotokoll angezeigt wird, gefolgt von diesem hier. Aber wenn wir speichern und aktualisieren, passiert das Gegenteil, wir sehen die Liste der Benutzer kalt vor GetUsersFromDatabase, und wir wissen, dass dies der falsche Weg für das ist , was wir tun müssen. Es wäre schön, wenn diese Listenbenutzerfunktion erst aufgerufen würde, wenn der Code in einem Timeout als Erfolg angesehen wurde , und wir können dies tun, indem wir eine Callback-Funktion einführen. Um dies zu tun, verschieben wir die Liste mit Funktionsaufruf, ziehen diesen heraus und übergeben dann die Callback-Funktion an GetUsersFromDatabase. Diese Callback-Funktion wird dann als Parameter aus create our function übernommen . Wie bei jedem anderen Parameter ist dieser Name in Richtung. Es muss kein Rückruf sein, wir werden das darin platzieren, nur damit klar ist, was wir tun. Jetzt können wir diese Callback-Funktion am Ende von setTimeout aufrufen . Kurz nach unserem Konsolenprotokoll rufen wir dies als Funktion auf und können dann zur Konsole zurückkehren und sehen , in welcher Reihenfolge diese angezeigt werden. Aktualisieren Sie, und wir erhalten einen Fehler hier. Wir sagen, dass Callback keine Funktion ist. Rückruf. Dies muss nur keine Funktionsaufrufe haben, da wir nur einen Verweis auf diese Funktion übergeben. Jetzt aktualisiere. Die Dinge scheinen in der richtigen Reihenfolge zu laufen. Wir holen unsere Benutzer aus der Datenbank zurück, dann listen wir jetzt auf, dass Benutzer diese auch wieder im Browser sehen können . Diese Lösung ist ein asynchroner Callback. Denken Sie daran, dass sich das synchrone Video auf den Code bezieht, der in der Reihenfolge ausgeführt wird und eine Operation abgeschlossen werden muss , bevor Sie zum nächsten wechseln. An diesem Beispiel, das wir gerade gemacht haben, können wir, sobald die Benutzer erfolgreich aus der Datenbank zurückgekommen sind, die wir mit unserem setTimeout simulieren, aus der Datenbank zurückgekommen sind, die wir mit unserem setTimeout simulieren, unsere Kohle zurück die Listenbenutzer-Funktion verwenden und auf diese Weise, wenn die Dinge in der richtigen Reihenfolge gehalten werden. Wir können auch zusätzliche Argumente an diese Funktion übergeben . Nehmen wir an, wir wollten nur die Benutzer bekommen , die die Rolle des Admins hatten, wir können dies mit Ausnahme des Parameters übergeben. Wenn wir nun unsere Funktion als Übergabe der Rolle des Admins aufrufen , ist das völlig in Ordnung. Wir können so viele Argumente wie eins, zwei an die Funktion übergeben . Wir müssen sicherstellen, dass der Rückruf immer der letzte ist. Diese Methode, Funktionen als Funktionsparameter zu übergeben , ist nichts Neues. Wir können das sehen, wenn wir zu einer vorherigen Datei zurückkehren. Öffnen wir die Seitenleiste, springen in die vorherige und innerhalb des ersten Beispiels, und innerhalb des ersten Beispiels dem wir einen Ereignis-Listener hinzugefügt haben. Wir hören zuerst auf das Klicken und dann als letzten Parameter , der eine Funktion ausgelöst hat. Hier übergeben wir es in einer Callback-Funktion, die wir ausführen möchten , sobald etwas angeklickt wurde, und betrachten auch eine Array-Methoden, die wir uns für jeden angesehen haben, in dem wir uns befinden dieses aktuelle Beispiel. Jedes Element innerhalb unseres Arrays führen wir dann eine Funktion aus, in der sich auch ein Callback befindet, was bedeutet, dass diese Technik nichts Neues ist. Wenn wir über Rückrufe sprechen, sind dies im Allgemeinen eine ältere traditionelle Art, Dinge zu tun. Als nächstes werden wir uns modernere Wege ansehen. Aber Rückrufe sind wirklich wichtig, um sich dessen bewusst zu sein, da es noch viele von ihnen und heute noch verwendet wird. Auch Rückrufe werden in der JavaScript-Welt ein bisschen Hass bekommen und nicht, weil sie nicht funktionieren. Es liegt mehr daran, wie die Dinge leicht unordentlich werden können. Dieses Beispiel, das wir einfach benutzen, ist nicht so schlimm. Weil wir nur eine einzige Funktion haben, die dann eine zweite Funktion zurückruft. Das Problem liegt jedoch, wenn wir einen Callback haben , der eine andere Callback-Funktion aufruft, die eine andere Callback-Funktion aufruft und so weiter. Selbst wenn man sich dieses Beispiel anschaut, die Benutzerliste möglicherweise benötigt die Benutzerliste möglicherweise auch einen eigenen Rückruf. Dann braucht dieser Callback möglicherweise auch eigenen Rückruf und dann stecken wir in einer langen Kette fest. Wir können dieses Ding auch mit unserem eigenen Leben vergleichen. Wir haben eine Reihenfolge von Aufgaben, die Sie in einer bestimmten Reihenfolge erledigen möchten. Sag, wir wollen das Auto fahren. Aber bevor wir das Auto tatsächlich fahren können, müssen wir zum Auto laufen, bevor wir zum Auto laufen, müssen wir die Schlüssel finden, davor müssen wir uns anziehen und so weiter. Dies ist eine Reihe von Aufgaben, die darauf beruhen die vorherige zuerst erledigt wird. Dies ist vergleichbar mit den Callback-Funktionen, die aufgerufen werden , sobald der vorherige Code erfolgreich ist. Es sind diese mehrfachen Callbacks , die zu einem großen Durcheinander führen können. Um ein Beispiel dafür zu sehen, haben wir einige kleine Demonstrationsfunktionen erstellt. Lassen Sie uns alles von oben kommentieren. Erstellen Sie nun ein paar neue Funktionen. Das erste ist GetOutOFBed, das in der console.log platziert ist, sagt aus dem Bett, und dupliziert dies dann noch dreimal, was uns vier Funktionen gibt. Die zweite besteht darin, unsere Schlüssel zu finden und nur console.log. Der nächste ist zu Fuß zum Auto, und der letzte ist, das Auto zu fahren. Ich werde ja sagen, da unsere Aufgabe abgeschlossen ist. Anhand dessen, was wir aus unserer vorherigen Callback-Demonstration wissen , muss jede dieser Funktionen als Rückruf an die nächste Funktion übergeben werden . Rufen Sie dies dann innerhalb jeder Funktion auf. Der erste GetOutOFBed. Dies wird einen Callback annehmen , der ganz unten ausgeführt wird, auch in den zweiten übergeht, ruft unsere Funktion auf. Wir müssen dies nicht zu unserer letzten Funktion hinzufügen , da sie keine weiteren Funktionen aufrufen wird, da dies unser Endergebnis ist. Es hat tatsächlich diese Kette des Aufrufs all dieser Funktionen ausgelöst , wir werden eine weitere Funktion erstellen um all dies aufzurufen. Erstellen Sie eine neue Funktion namens CompleteTasks. Wir können diese Funktion aufrufen, die CompleteTask ist die die erste Funktion übergibt , die Sie zurückrufen möchten. Unsere erste in unserer Bestellung ist GetOutOfBed. Was wir jetzt tun werden, mag ziemlich komplex aussehen, aber es ist im Grunde das gleiche Setup wie zuvor. Wir würden Benutzer aus der Datenbank holen. Nur dieses Mal gibt es mehr als eine Funktion in der Kette, die wir zurückrufen, und dann können wir innerhalb der CompleteTask-Funktion jede unserer Funktionen schachteln, dann können wir innerhalb der CompleteTask-Funktion jede unserer Funktionen schachteln um sie im Inneren aufzurufen. Der erste ist aufstehen. Übergeben Sie eine Funktion. Lass uns zur Konsole gehen und sehen, was passiert. Wenn wir uns aktualisieren, sehen wir den Text aus dem Bett in der Konsole und wenn wir nachschlagen, ist dies das Konsolenprotokoll ganz oben. Die nächste Partei wird der Schlüssel sein , um all dies zu verstehen. Was wir hier tun werden, ist, dass wir unsere erste Funktion namens CompleteTask erstellen . Dies wird dann bei unserem ersten Schritt aufgerufen, der aus dem Bett aufsteht, dann übergeben wir eine Funktion hinein. Diese Funktion wird als Callback akzeptiert, und diese Funktion wird dann am Ende dieser Funktion aufgerufen. Sobald diese Funktion beendet ist, ruft sie unsere zweite Funktion auf, die darin verschachtelt ist. Dieser nächste Abschnitt, den wir anrufen werden, kann unsere nächste Stufe sein , nämlich Findkeys. Rufen Sie diese Funktion auf, findkeys muss auch eine Callback-Funktion übernehmen , also geben Sie diese ein. Dies sollte jetzt unsere zweite console.log ausführen. Hab einen Rechtschreibfehler, also ändern wir das einfach, Findkeys. Jetzt haben wir unsere zweite console.log, also wird in diesem Abschnitt nur hier ausgeführt und dann wird diese nächste Funktion ausgeführt, wenn die nächste Funktion darin verschachtelt ist. Vorbei an unserer nächsten Etappe, die zu Fuß zum Auto ist. Gehen Sie zum Auto nimmt auch eine Rückruffunktion ein. Wir speichern und aktualisieren, senden Abdrücke aus dem Text des Gehens. Es wird dann unsere nächste Funktion ausführen, die sich darin befindet. Die letzte Etappe besteht darin, das Auto zu fahren. Dies ist die allerletzte Stufe, daher nimmt es keine Callback-Funktion auf. Wir können dies einfach als reguläre Funktion bezeichnen. Aktualisieren. Dieser Code wird zusammen mit allen unseren anderen Funktionen ausgeführt. Wenn Sie möchten, können wir auch zusätzliche Schritte oder zusätzlichen Code in jede dieser Funktionen übergeben . Nur um klarzustellen, dass wir hier eine Hauptfunktion erstellen, die ausgeführt wird, und dann ruft ihre Funktion zusätzliche Funktionen auf. Bei jeder dieser Funktionen warten wir auf den Abschluss des Codes, bevor wir die nächste zurückrufen. Wenn das etwas chaotisch aussieht , dann ist es wahrscheinlich so, weil es ein Durcheinander ist, und deshalb einige alternative Möglichkeiten werden einige alternative Möglichkeiten geschaffen, damit umzugehen. Aber nur weil es neue Wege gibt, heißt das nicht unbedingt, dass dies immer noch nicht relevant ist. Callbacks sind derzeit immer noch ein wichtiger Teil von JavaScript, und Sie werden dies auch im Legacy-Code sehen . Sie werden wahrscheinlich so etwas hören , das auch Callback **** genannt wird, die Pyramide des Untergangs, verschachtelte Callbacks. Auch viele weitere Namen. Alle diese Namen weisen auf die gleiche Komplexität verschachtelter Callbacks hin. In kommenden Videos werden Sie einige alternative Möglichkeiten entdecken, dies zu behandeln, einschließlich der asynchron Verwendung von Callbacks mit Versprechen. 58. Versprechen: Wir wissen jetzt, dass eine asynchrone Anfrage einige Zeit dauern kann, vielleicht nur ein paar Millisekunden oder vielleicht ein paar Sekunden, Minuten oder gar nie abgeschlossen. Wenn wir über dieses Ding sprechen, bezieht es sich oft darauf, etwas von woanders abzurufen, z. B. von einem Server, einer Art Datenspeicher, einer API oder einer externen Website. Ein Versprechen ist großartig, um dieses Ergebnis zu bewältigen. Promise ist ein Objekt und dieses Objekt repräsentiert das Ergebnis einer asynchronen Aufgabe. Das Ergebnis könnte ein Fehler sein, wir kommen möglicherweise nicht vom Server zurück, wonach wir gefragt haben, oder es kann etwas dauern. Versprechen halten diese Aufgabe fest und versprechen Ihnen in Zukunft mitzuteilen , wann sie das Ergebnis kennen. Wir haben bereits Versprechen und einige der Ergebnisse gesehen . Vor ein paar Videos haben wir uns ein einfaches Beispiel für das Abrufen eines Bildes von Wikimedia angesehen . Ich verwende die Fetch-API. Fetch ist eine asynchrone Operation, und wir sehen, dass ein Versprechen in der Konsole zurückgegeben wird. Als wir versuchten, zu früh auf das Versprechen zuzugreifen , bevor es das Bild aufgenommen hat, wurden die Ergebnisse als ausstehend angesehen. Wir fügten dann eine kleine Zeitverzögerung mit einem festgelegten Timeout hinzu, das in der Erfüllung des Versprechens geändert wurde. Dies sind zwei der drei verfügbaren Bundesstaaten mit Versprechen. Ausstehend ist der Ausgangszustand, in dem wir noch nicht wissen, ob die Aufgabe abgeschlossen wird oder nicht, dann erfüllt, wenn die Aufgabe als erfolgreich angesehen wurde, z. B. wann die Daten zurückgekehrt sind und jetzt einsatzbereit sind. Wir haben auch einen Status namens „ abgelehnt“ , wenn die Aufgabe fehlgeschlagen ist. Wir haben nicht die Daten, die wir angefordert haben, und wir müssen etwas dagegen unternehmen. Vielleicht hören Sie auch das Wort, das mit Versprechen geklärt ist. Geschlossen ist, wenn wir das Schicksal der Aufgabe kennen, was bedeutet, dass sie entweder erfüllt oder abgelehnt wird. Wir müssen nichts über den ausstehenden Zustand wissen , da wir nicht sagen können , in welche Richtung er mit dem Ergebnis gehen wird. Aber wir müssen mit einem Erfolg oder einem Misserfolg umgehen. Rüber zu den Starterdateien, was der Abschnitt „Versprechen“ ist. Hier haben wir ein anderes Beispiel, das diese Fetch-API verwendet. Dies ist das Abrufen von Daten von einer externen API, und dies ist nur eine externe URL. Diese URL wählt ein zufälliges Hundebild aus. Wir können dies kopieren und in den Browser einfügen . Wir können sehen, dass wir ein Ergebnis in einem Format namens JSON haben, das für JavaScript Object Notation steht. Es ist eine Syntax für den Datenaustausch über das Internet. Es sieht aus wie ein JavaScript-Objekt, ist aber tatsächlich sprachunabhängig, was bedeutet, dass es auch von anderen Sprachen erstellt und übergeben werden kann . Wir können sehen, dass wir eine Nachricht haben, die eine URL für ein bestimmtes Hundebild und den Code des Erfolgs enthält . Wir können dieses Bild kopieren und diesen Link einfügen, wodurch wir dann Zugriff auf das jeweilige Bild erhalten. Ich habe die Browsererweiterung installiert , um das etwas hübscher aussehen zu lassen. Ihre sehen vielleicht etwas schwieriger zu lesen aus, aber die Daten sollten immer noch genau gleich sein . Zurück zum Redakteur. Wie wir wissen, ist der Abrufaufruf asynchron, sodass wir das Ergebnis des Abrufs dieses Bildes mit dem Versprechen behandeln können . Erstens können wir mit dem erfüllten Zustand umgehen , der ein Erfolg ist, und wir tun dies, indem wir uns am Ende des Abrufs verketten . Wir können das Semikolon entfernen, am Ende ketten. Dann. Dann ist eine Methode, die wir an ein Versprechen binden können. Denken Sie daran, wenn wir die Fetch-API verwenden, wird dies ein Versprechen als Antwort zurückgeben, was bedeutet, dass wir Zugriff auf die damalige Methode haben. Übergeben Sie eine Funktion. Da es sich um einen asynchronen Callback handelt, führen wir den Code nur hier aus. Möchte wissen, dass die Aufgabe erfolgreich abgeschlossen wurde. Natürlich möchten wir wahrscheinlich auf die Daten zugreifen, die wir vom Abrufaufruf zurückerhalten. Dies kann an unsere Funktion übergeben werden, sodass beliebige Variablennamen wie Antwort übergeben werden. Dann könnten wir das an der Konsole protokollieren und prüfen, ob das funktioniert. Ich speichere im Browser und öffne die Konsole. Es gibt eine Antwort. Dieses erfolgreiche Versprechen gibt ein Antwortobjekt zurück, das Details darüber enthält, was wir vom Server oder von der API zurückerhalten . Dieses Objekt enthält Dinge wie den Statuscode. In unserem Fall sind es 200, was bedeutet, dass alles gut ist. Bis zur niedrigen URL sehen wir die tatsächliche URL, die wir im Abrufaufruf angefordert haben , anstatt die URL des Bildes , das wir zurückerhalten. Der Grund, warum wir dies nicht sehen, ist , dass alle Daten, die wir zurückerhalten, in diesem Body-Abschnitt gespeichert sind. Wenn wir dies öffnen, sehen wir immer noch nicht die URL des tatsächlichen Bildes. Stattdessen sehen wir einen lesbaren Stream. Dies geht auf das zuvor erwähnte JSON-Format zurück. Um dieses JSON-Format zu lesen, das im Body-Abschnitt gespeichert ist, haben wir eine JSON-Methode , die wir verwenden können. Im Konsolenprotokoll können wir die JSON-Methode am Ende hinzufügen. Dann probieren wir das mal aus. Speichern und aktualisieren. Wir sind wieder bei einem Versprechen , das den aktuellen Stand ausstehend hat, was bedeutet, dass die Aufgabe noch nicht abgeschlossen ist. Dies liegt daran, dass die JSON-Methode auch ein Versprechen zurückgibt, das wir wieder behandeln müssen. Es gibt ein paar Möglichkeiten, dies zu tun. Zuerst können wir den Konsolenprotokoll-Wrapper entfernen und Response.json verlassen. Da diese JSON-Methode auch ein Versprechen zurückgibt, können wir auch die damalige Methode verketten. Geben Sie das ein, was wieder eine Funktion ausführt. Auch diese Funktion nimmt die Daten aus der Antwort auf geht also in eine Datenvariable über. Dann können wir diese Daten an der Konsole protokollieren. Versuchen wir es, speichern und aktualisieren. Jetzt haben wir unseren JSON-Inhalt, der im Body-Bereich gespeichert ist , erfolgreich weitergegeben . Dies gibt das tatsächliche Bild des Hundes zurück, das in der Nachricht gespeichert ist, sowie Erfolg als Statuscode. Dies ist die gleiche Antwort , die wir gesehen haben, als wir diese früher in den Browser eingefügt haben. Alles hier gibt ein Versprechen zurück, der Abholaufruf gibt ein Versprechen zurück und auch der JSON gibt ein Versprechen zurück. Aber eine andere Möglichkeit, dies zu tun, die ich persönlich bevorzuge, aber es liegt ganz an Ihnen, ist, nicht verschachtelt zu sein, dann Anrufe wie diese. Wenn möglich, bevorzuge ich es, sie alle auf dem obersten Niveau zu halten , um die Lesbarkeit zu gewährleisten. Um dies zu tun, müssen wir die verschachtelte dann Methode ausschneiden , die wir gerade hinzugefügt haben. Wir lassen es in response.json hier drin und schneiden den zweiten bis letzten Satz Klammern bis kurz nach response.json aus. Schneid das raus. sollte die Funktion einfach mit response.json verlassen. Stellen Sie sicher, dass das Semikolon vom Ende entfernt wird, und wir können es am Ende einfügen uns zwei Methoden hintereinander geben. Wenn wir jedoch zum Browser gehen und aktualisieren, die Meldung von undefined angezeigt. Dies liegt daran, dass wir versuchen, auf die Daten unserer vorherigen Methode zuzugreifen . Aber zuerst müssen wir das zurückgeben, um dies zu tun. Das funktioniert alles wie zuvor. Wir können auch so viele dieser dann Methoden wie 1, 2 verketten , und jede wird auf das vorherige Ergebnis warten bevor der Code darin ausgeführt wird. Wir behalten die volle Kontrolle über unsere asynchrone Aufgabe und die Reihenfolge, in der der Code ausgeführt wird. Wir können dies auch wie jedes andere Objekt nach unten filtern. Wir könnten auf die Nachricht zugreifen, die die URL des Bildes ist, das Sie benötigen. Wir können darauf klicken und dies im Browser öffnen. Wir können diese Bild-URL auch verwenden und an ein Bildelement übergeben. Fügen Sie zuerst ein leeres Bildelement direkt über unserem Skript hinzu, und wenn wir wissen , dass wir Zugriff auf diese URL haben, können wir dieses Konsolenprotokoll entfernen unser Image auswählen -Elemente mit document.query-Selektor, und setzen Sie dann das Quellattribut auf data.message. Speichern wir das und aktualisieren Sie den Browser. Jedes Mal, wenn wir aktualisieren, erhalten wir anderes zufälliges Bild von unserer API zurück. Dies ist der erfüllte Staat, der behandelt wird. Aber was ist, wenn es ein Problem gibt und wir einen abgelehnten Staat zurückbekommen? Dies geschieht, wenn beim Abrufen der Daten oder beim Abschließen der von uns angeforderten Aufgabe ein Fehler auftritt . Das ketten wir am Ende eine Fangmethode an. Hier verketten wir die Ereignismethode , entfernen das Semikolon und ketten dann an das Ende der Catch-Methode, und ketten dann an das Ende der die wir ausführen werden, wenn ein Fehler vorliegt Wir übergeben diesen Fehler an diese Callback-Funktion. Viel Funktion mit dem Fehler basierend auf einem Konsolenprotokoll. Beginnen wir mit einer Reihe von Fehlern. Wir können auch die Fehlermeldung am Ende hinzufügen. Wenn wir dies testen und aktualisieren, sehen wir nichts in der Konsole, da das Image erfolgreich zurückgegeben wird. Um dies tatsächlich zu testen, müssen wir in die Entwicklertools springen und in die Registerkarte „Netzwerk“ gehen. Ich wähle dies aus und um dies zu tun, können wir unser Netzwerk tatsächlich ausschalten. Lassen Sie uns das ein bisschen größer machen. Chrome hat dieses Dropdown-Menü , das Sie hier sehen können. Wir verwenden derzeit keine Drosselung, aber wir können dies auch auf eine langsame Verbindung oder sogar offline umstellen . Wenn wir dies tun und in die Konsole springen und aktualisieren, bedeutet das Ausschalten dieses Netzwerks, wann jetzt nicht das gewünschte Image erhalten. Das Versprechen sollte jetzt einen Fehler auslösen. Bei all dem ist das Letzte, was wir uns ansehen werden , die endgültige Methode. Die endgültige Methode wird unabhängig davon ausgeführt, ob das Versprechen erfüllt wurde oder ob es abgelehnt wurde. Dies kann auch am Ende angekettet werden. Wie bei allen oben genannten Methoden müssen wir auch das Semikolon wie in der finly-Methode entfernen , die wiederum eine Callback-Funktion ausführt. Platzieren Sie in ein Konsolenprotokoll mit dem Text von, ich werde immer laufen. Wenn das Netzwerk immer noch ausgeschaltet ist, können wir diese Nachricht aktualisieren und sehen. Lassen Sie uns das Netzwerk wieder einschalten, aktualisieren, in die Konsole springen, und wir sehen dieses Konsolenprotokoll immer noch selbst wenn das Versprechen erfolgreich war. Die endgültige Methode ist nützlich, um einen Code zu verfolgen , den wir ausführen müssen, nachdem das Versprechen abgewickelt ist. Alternativ wäre es, diesen Code sowohl in die dann auch in die Fangabschnitte zu platzieren . Dies würde jedoch zu doppeltem Code führen. Das ist Versprechen und wie kann es mit asynchronem JavaScript wirklich nützlich sein. Diese ganze Sache ist möglich, weil die fetch-Methode anfänglich ein Versprechen zurückgibt, diese ganze Kette zu starten. Aber was ist mit Dingen, die kein Versprechen zurückgeben? Nun, als nächstes schauen wir uns an, wie wir damit umgehen können. 59. Der Versprechen Bauer: Im vorherigen Beispiel könnten wir damit beginnen, Versprechen zu verwenden, da die Fetch-API ein Versprechen zurückgibt. Aber was ist mit Funktionen , die kein Versprechen zurückgeben? Um die Dinge anzufangen, schreiben wir eine einfache benutzerdefinierte Funktion, und diese wird nach einem Timeout ausgeführt und einige Daten festlegen . Ich werde in die Promise-Konstruktordatei springen, die derzeit im Skript leer ist, um oben eine Variable zu erstellen, die als Daten bezeichnet wird. Stellen Sie dies auf ein leeres Objekt ein. Create Funktion namens GetData. Dann passe Inside in unserem setTimeout, das eine Funktion übernehmen wird. Als Funktion Dann führen wir dies kurz danach nach einer Zeitverzögerung von 2.000 Millisekunden aus. Nach zwei Sekunden möchten wir uns nur mit dieser Funktion beschäftigen , unser Datenobjekt auf einen Wert einzustellen. Wir weisen dies neu zu, um ein neues Objekt zu sein , bei dem wir eine Name-Eigenschaft übergeben , die einer Zeichenfolge entspricht. Dies wird GetData aufrufen, um unsere Funktion tatsächlich auszuführen. Am Ende protokollieren wir den Wert der Daten, wir können sehen, was wir zurückbekommen. Parsen unserer Daten. Wir können uns auch für den Namen entscheiden. die Datei im Browser Öffnen Sie die Datei im Browser und springen Sie in die Konsole. Die Konsole sieht den Wert von undefined. Dies ist wahrscheinlich nicht überraschend, da wir auf das Datenobjekt im Konsolenprotokoll zugreifen das Datenobjekt im , bevor wir überhaupt die Name-Eigenschaft festgelegt haben, die Daten zwei Sekunden dauern, bis die Daten festgelegt werden. Dies ist eine etwas simulierte Anfrage an eine Datenbank, frei ist, was zwischen dem Anfordern der Daten und der Rücknahme passiert es frei ist, was zwischen dem Anfordern der Daten und der Rücknahme passiert. Dafür sind keine Versprechen gut, aber diese Funktion gibt standardmäßig kein Versprechen zurück. Dafür können wir unsere eigenen mit dem Promise-Konstruktor erstellen . Konstrukteure haben wir uns bereits mit dem neuen Betreiber in der Vergangenheit angeschaut. Wir haben uns Dinge wie neues Array angeschaut. Wir haben uns ein neues Objekt und auch eine neue Funktion angeschaut. Diese alle erzeugen eine neue Instanz eines Objekts. Denken Sie daran, dass die Versprechen auch Objekte sind. Wir können diesen neuen Operator auch verwenden , um selbst ein neues Versprechen zu schaffen. Kommentieren Sie vorerst unser Beispiel, das alles außer der Datenvariablen ist . Entferne das. Dann können wir unten anfangen, unser neues Versprechen zu konstruieren. Nur mit den Beispielen, die wir zuvor gesehen haben, verwenden wir das neue Schlüsselwort, um ein neues Versprechen zu erstellen und dieser Konstruktor nimmt eine neue Funktion auf, die ausgeführt wird. Diese Funktion nimmt zwei optionale Parameter auf, eine Funktion, die ausgeführt werden soll, wenn das Versprechen auf einem aufgelöst wird, wenn das Versprechen abgelehnt wurde. Dies sind Namen unserer Wahl, aber Entschlossenheit und Ablehnung sind ziemlich beschreibend. Was es war unser eigenes benutzerdefiniertes Versprechen, wir legen genau fest, wann und wo diese Auflösungs- und Ablehnungsfunktionen ausgeführt werden sollen. Der erste Schritt besteht darin, unser Versprechen innerhalb einer Variablen zu speichern. Wir nennen dieses Versprechen einfach. Ich kann das in einem Moment nennen. Aber ich werde einfach Entschlossenheit aufrufen , um dieses Versprechen zu lösen. Danach können wir diese Versprechensvariable nutzen , die unter den kalten, dann fangen und schließlich Methoden liegt dann fangen und schließlich , die wir uns zuvor angeschaut haben. Wir können auf promise.dann zugreifen, und diese Methode ist genau die gleiche wie wir es im vorherigen Video angesehen haben, das eine Funktion annimmt, die ausgeführt wird, der Code war ein Erfolg. diesem Hintergrund platzieren wir in ein Konsolenprotokoll mit dem Text des Erfolgs. Erlauben Sie dies und stellen Sie sicher, dass kein Semikolon am Ende ist. Wir werden uns auch am Ende des Versprechens anschließen. Die Catch-Methode, die auch eine Funktion übernehmen wird. Denken Sie daran, dass die Catch-Methode auch den Fehler übergeben wird , den wir in einem Konsolenprotokoll platzieren können. Gehen wir jetzt zur Konsole und sehen, welche davon protokolliert wurde. Wir sehen den Wert des Erfolgs, was nicht überraschend ist, weil wir dieses Versprechen gelöst haben, was bedeutet, dass es erfolgreich war. Diese Ergebnisfunktion kann auch einen Fulfillment-Wert annehmen , den Sie weitergeben möchten. Sagen wir eine Reihe von Erfolg. Dann wird diese Erfolgsbotschaft auch der Kette weitergegeben, wenn dies erfolgreich war. Der erfolgreiche Abschnitt ist der dann Abschnitt. Wir können dies in unsere Funktion weitergeben. Wir können dies in einer Variablen wie Response speichern und dann können wir dies auf der Konsole protokollieren. Refresh, und los geht's. Dies ist praktisch, wenn Sie benutzerdefinierte Daten oder Nachrichten an den Ergebnisabschnitt übergeben müssen. Aber wenn man auf das frühere Beispiel zurückgeht einige Daten abzurufen, die wir oben hatten, wäre dies ein besseres Beispiel als einfach nur eine Nachricht zu senden. Was wir tun werden, ist, diesen Timeout-Abschnitt aus der Funktion zu kopieren und einzufügen . Dann können wir dies direkt oberhalb des Ergebnisabschnitts einfügen und alle drei Zeilen auskommentieren. Wir können dann den Ergebnisbereich nach oben verschieben , um innerhalb des Timeouts zu sein. Es wird auch die Daten festlegen und dieses Versprechen dann lösen. Dies bedeutet, dass das Versprechen jetzt erst gelöst werden sollte , nachdem die Daten festgelegt wurden. Wir können dies testen, indem wir uns bei der Konsole anmelden. Springen Sie in den dann Abschnitt, wenn dies mit einer neuen Konsole erfolgreich war , protokollieren Sie den Wert unserer Daten. Aktualisieren. Gib diese zwei Sekunden. Sehen Sie sich die Botschaft des Erfolgs an, und unser Objekt wurde mit unserer Zeichenfolge aktualisiert. So können wir mit einem Versprechen mit einem Erfolg umgehen. Aber was ist mit dem Ablehnen? Nun, da dies unser Versprechen ist, können wir es dazu bringen, alles zu tun, was wir wollen. In diesem Beispiel, was erfolgreichen Lösung ist, ist der Name Chris wurde festgelegt. Ich lehne ab, ob das Datenobjekt leer ist. Wir können direkt unten in unser Timeout springen , wo wir unsere Daten festlegen. Wir können eine if-Erklärung abgeben. Wir können prüfen, ob Object.Keys in unserem Datenobjekt enthalten ist. Wir können prüfen, ob die Länge davon größer als Null ist. Der Name ist hier die Schlüsseleigenschaft, wir prüfen, ob die Länge dieses Objekts größer als Null ist. Wenn ja, bedeutet dies, dass dies festgelegt wurde , wo wir die Resolve-Funktion übergeben können. Eine Erfolgsbotschaft. Wenn nicht, wird kurz nach der if-Anweisung ablehnen, die mit der Nachricht von abgelehnt in unsere Funktion übergegangen ist. Probieren wir es mal aus. Wir haben Dateneigenschaftssätze, daher sollten wir mit dem Wert des Erfolgs rechnen . Gibt das zwei Sekunden. Das war ein Erfolg. Wenn wir den abgelehnten Status überprüfen wollen, können wir prüfen, ob Object.keys gleich der Länge von Null ist, was zu einem abgelehnten Versprechen führt. Hier ist ein bisschen los, aber die Idee ist ziemlich einfach. Wenn eine Funktion standardmäßig kein Versprechen zurückgibt, können wir unser eigenes erstellen. Dies kann sich an jedem Punkt lösen oder ablehnen , was uns die vollständige Kontrolle über das Verhalten unserer Funktion gibt. 60. Umgang mit mehreren Versprechen: Sobald wir verstehen, wie Versprechen funktionieren, wird die Handhabung einer AsyncTask viel einfacher. Aber was ist, wenn mehr als eine AsyncTask gleichzeitig ausgeführt wird, kann dies zu verschiedenen Problemen führen. Warten wir auf die erste Aufgabe, bevor wir mit der nächsten Aufgabe fortfahren? Wenn wir beispielsweise 10 AsyncTask gleichzeitig laufen würden, wenn wir auf jeden Abschluss warten, bevor wir zum nächsten übergehen, könnte sich 10 AsyncTask gleichzeitig laufen würden, wenn wir auf jeden Abschluss warten, bevor wir die Verzögerung von jedem wirklich summieren. auch, wenn Was wäre auch, wenn sich Aufgabe Nummer 10 auf den Wert von Aufgabe Nummer 3 stützte , aber Aufgabe 10 zuerst abgeschlossen wurde. Nun, um bei einigen dieser Probleme zu helfen, haben wir Zugriff auf einige nützliche Versprechensmethoden. Wir haben bisher einige Methoden behandelt, einschließlich dann, Catch und schließlich, und diese bevorstehenden Methoden werden sich mit mehreren Versprechen befassen, beginnend mit einer Methode namens ALL. Die ALL-Methode überwindet mehrere Versprechungen und gibt einziges Versprechen und ein einziges Versprechen zu einem Array des Ergebnisses zurück. Es ist nützlich, um mehrere Daten zu sammeln und sie möglicherweise zu einem einzigen Ergebnis zusammenzufassen. Werfen wir einen Blick darauf, wie das im Starter funktioniert. Lassen Sie zwei separate Versprechen in Variablen speichern . Verspreche Nummer 1. Dies ist wiederum ein einfaches Beispiel , das wir zuvor gesehen haben , wo wir ein Bild von unserer API abrufen. Wenn dies erfolgreich war, führt es eine Funktion aus, die den Wert der Antwort zurückgibt. Zusammen mit diesem werden wir das Versprechen Nummer 2 haben, das den Versprechenskonstruktor verwendet , der im vorherigen Video zu sehen war. Dies wird nach zwei Sekunden gelöst. Ich habe sie für dieses Beispiel bewusst einfach gehalten. Aber stell dir vor, wir wollten wissen, ob beide ein Erfolg waren. Anstatt jeden einzeln überprüfen zu müssen , können wir dafür promise.all nutzen. Ganz unten, Zugangsversprechen, Kapital P. Die ALL-Methode. Wir werden ein Array übergeben diese beiden Variablen enthält, also verspreche 1, verspreche 2. Diese promise.all-Methode nimmt jeden iterierbaren Wert wie ein Array auf. Wir haben uns während dieses Unterrichts reichlich über Arrays geschaut . Auch diese ALL-Methode wird ein Versprechen zurückgeben, was bedeutet, dass wir verschiedene Methoden wie dann und fangen an das Ende ketten können . Wir machen genau das Gleiche wie zuvor. Wir ketten dann weiter, was eine Funktion annimmt. Diese Funktion kann auch die Ergebnisse aufnehmen. Wir loggen das bei der Konsole an. Wenn es danach einen Fehler gab, können wir auch als ALL-Funktion, die den Fehler aufnimmt, als eine ALL-Funktion, die den Fehler aufnimmt , im Protokoll platzieren. Dann lasst uns das mal ausprobieren. Stellen Sie sicher, dass die aktuelle Seite geöffnet ist. Aktualisieren. Nach zwei Sekunden kommen wir zurück , kehren zurück und ein Array mit zwei Ergebnissen. Das erste ist unser zufälliges Bild, das in diesem Objekt gespeichert ist. Wenn wir das öffnen, können wir sehen, dass dieser ein Erfolg war. Der zweite wird jedoch nach dem Timeout als undefiniert angezeigt, da das Versprechen eigentlich nichts zurückgibt. Wenn wir wollen, könnten wir einen dritten Parameter an setTimeout übergeben . Lasst uns reinspringen und das machen. Trennen Sie sich durch Komma. übergeben wir eine einfache Zeichenfolge, bei sich um einen optionalen Parameter handelt, der an die Funktion übergeben wird, die wir aufrufen, die aufgelöst ist. Jetzt, nach einer Aktualisierung, sollten wir diesen Wert in der Konsole sehen. Wir können auch einen Fehler testen und sehen, was passiert, wenn eines dieser Versprechen abgelehnt wird. Wir können dies tun, anstatt zu lösen, wir können weitergeben, ablehnen und diesen heraus und dann werde ich den Abschnitt abfangen, das Konsolenprotokoll wird ausgeführt. Wir sehen diesen Wert der Ergebnisse , die wir hier weitergeben werden. Aber eine Sache, die Sie bemerken werden, ist, dass wir das zufällige Bild nicht sehen. Obwohl wir diese beiden Versprechen zu versprechen einhalten, sehen wir nur das Ergebnis der Ablehnung. Dies liegt daran, dass bei Verwendung der ALL-Methode es nur aufgelöst wird, wenn alle Versprechen, die sie einnimmt , erfolgreich erzielt werden oder wenn eine einzelne fehlschlägt. Entweder erhalten wir erfolgreich ein Array das alle Versprechen enthält, wie wir es zuvor gesehen haben , oder das erste, das abgelehnt wird. Es kann jedoch Vorkommen geben, wenn dies nicht das Verhalten ist, das wir wollen. Wir möchten vielleicht immer noch, dass alle Versprechen zurückgegeben werden , unabhängig davon, ob es einen Fehler gab oder nicht. Dafür können wir alle durch alles abgewickelt ersetzen. Alles, was geregelt ist, wird immer noch ein Array aufnehmen , das alle Versprechen enthält. Aber wenn wir dies speichern und aktualisieren, geben Sie diese zwei Sekunden. Anstatt den einzelnen Fehler zu sehen, sehen wir alle unsere Versprechen innerhalb des Arrays. Der erste wurde erfüllt. Wir werden alle Werte sehen. Dann sehen wir den zweiten, der abgelehnt wurde. Wir könnten diese Ergebnisse auf jede Weise nutzen, wie wir es wollten, wie zum Beispiel darüber zu schleifen, um damit umzugehen, was zu tun ist, wenn es einen Misserfolg oder einen Erfolg gab. Zum Beispiel möchten wir vielleicht wissen, welche abgelehnt wurden , damit wir sie erneut anrufen können. Oder zeigen Sie einem Benutzer vielleicht nur einen bestimmten Abschnitt an, wenn die Benutzeranfrage erfolgreich war. Etwas anderes, das wir haben, sind zwei Methoden Race “ bezeichnet werden. Beide geben nur einen Wert zurück. Werfen wir zunächst einen Blick auf alles, was wir anstelle von allen Siedlungen verwenden können . Speichern und aktualisieren Sie und wir werden sehen, was wir zurückbekommen. Dieses Mal sehen wir die Ablehnung nicht. Alles was wir sehen ist unser erfolgreiches Image. Dies liegt daran, dass jede Methode, wie sie klingt, aufgelöst wird, sobald eines der an sie übermittelten Versprechen erfüllt wurde. Was im Grunde genommen das erste Versprechen bedeutet, das ein Erfolg ist. Dies bedeutet nicht immer , dass es das erste sein wird , das im Array übergeben wird. Es bedeutet nur das erste, das abgeschlossen ist. Die Rennmethode, wenn wir uns das ansehen, Speichern und Aktualisieren, gibt dies auch das gleiche zufällige Bild zurück, aber dies wird das erste Versprechen zurückgeben, das an sie weitergegeben wurde, das abgerechnet wurde. Abgerechnet könnte sogar erfüllt oder abgelehnt werden. In unserem Fall ist es ein zufälliges Bild, da dieses Bild schneller zurückkommt , da es keine Verzögerung von zwei Sekunden hat. Unabhängig davon, ob das Versprechen ein Erfolg oder ein Misserfolg war, wird der erste zurück sein, den Sie in der Konsole sehen. Zusammenfassend gibt die Rennmethode das erste Versprechen zurück, auf das sie trifft , das aufgelöst oder ablehnt. Die beliebige Methode wird auch ein Versprechen zurückgeben, aber diese muss erfüllt werden. Sie sind beide sehr nützlich, wenn eine dieser Situationen auftaucht. 61. Async / Warten: Mit der Ankunft von ES 2017 kam eine neue Art, mit asynchronem Code umzugehen. Oft haben wir uns vorher angesehen, ist überflüssig, es ist alles noch etwas, was wir wissen müssen, insbesondere für das, was wir uns jetzt ansehen werden, was als async/await bezeichnet wird. Async/await ist tatsächlich Versprechen hinter den Kulissen, aber es wurde entwickelt, um einfacher auszusehen und für Entwickler einfacher zu lesen. Es sieht einfacher aus, weil wir zu etwas Vertrauterem zurückkehren, was eine Funktion ist. In Startdateien haben wir ein Beispielbild, in dem wir ein Versprechen zurückgeben, das wir zuvor gesehen haben. Wenn Sie stattdessen eine reguläre Funktion verwenden würden , um dieses Bild einzustellen, würden wir so etwas tun. Dies wird wahrscheinlich eine Funktion namens set image erzeugen, und dann könnten wir wieder unseren Abrufaufruf nutzen. Fügen Sie dies ein und speichern dies innerhalb einer Konstante namens Response. Versuchen wir dann, ein Konsolenprotokoll für die Antwort zu erstellen, und wie Sie alle aus früheren Videos wissen, versuchen wir hier, direkt unten auf diesen asynchronen Code zuzugreifen , bevor er möglicherweise die Chance hatte um wiederzukommen. Um dies auszuführen, rufen Sie unsere Set-Image-Funktion auf, aktualisieren Sie die Konsole, wir kehren in den Status „Ausstehend“ zurück. Wir können die Antwort sehen, die unsere URL ist, die wir ursprünglich hier aufrufen, anstatt unser tatsächliches Bild, das wir zurückbekommen. Was Sie vielleicht denken, dass wir als Nächstes tun könnten, ist response.json zu verwenden. Probieren wir das mal aus. Speichern Sie dies in einer Konstante namens image, die gleich response.json ist. Wir können diese Antwort weitergeben. Sieh dir dieses Bild an, die Konsole. Versuchen wir es noch einmal. Dieses Mal erhalten wir eine Fehlermeldung, die besagt, dass response.json keine Funktion ist, und dies geschieht, weil die Bilddaten noch nicht verfügbar sind. Wir haben Versprechen, von denen wir wissen, dass wir das Ende aller Abrufaufrufe, dann Methoden, die dann auf die erfolgreiche Antwort warten müssen dass wir das Ende aller Abrufaufrufe, dann Methoden, die dann auf die erfolgreiche Antwort warten , bevor eine Funktion ausgeführt wird. Obwohl wir diesmal keine Versprechen verwenden, werden wir async/await verwenden. Dafür haben wir zwei einfache Schritte. Um unsere reguläre Funktion in eine asynchrone Funktion umzuwandeln, müssen wir lediglich das asynchrone Schlüsselwort davor übergeben . Sobald Sie dies mit einer Markierung gemacht haben, auf welche Codezeile wir warten möchten, wenn die Daten zurückgegeben werden, bevor wir zur nächsten wechseln . Wenn wir nun darauf warten möchten, dass das Bild zurückkommt, wird dies unsere Funktion effektiv pausieren und warten , bis die Daten zurückgegeben werden, bevor es auf den Rest des Codes verschoben wird. Lasst uns das speichern und sehen, was passiert. Wenn wir jetzt aktualisieren, ist der Fehler jetzt verschwunden. Das Versprechen sind immer noch unabhängige Staaten, aber wenn wir dies öffnen, können wir auf die Daten zugreifen, die wir in diesem Objekt benötigen. Wir können jetzt sehen, ob wir dieses Bild mit Zitaten kopieren, wir erhalten jetzt unser zufälliges Hundebild und die Botschaft des Erfolgs zurück . Der Grund, warum wir auf dieses Versprechen eingehen müssen , ist dass wir versuchen, auf unsere response.json in der Zeile direkt unten zuzugreifen . Wir haben immer noch darauf gewartet, dass unser Image zurückkommt, aber dann haben wir uns bei der Console response.json angemeldet. Aber denken Sie an früheren Beispielen daran, die json-Methode auch ein Versprechen zurückgeben wird. Um damit fertig zu werden, müssen wir nur darauf warten, dass unsere json-Methode endgültig abgeschlossen ist unsere json-Methode endgültig , bevor wir diese an der Konsole protokollieren. Wenn wir das jetzt speichern, versuchen Sie es erneut im Browser, anstatt in das Versprechen und in das Objekt springen zu müssen . Sehen Sie sich nun direkt die richtigen Informationen wir in der Konsole benötigen. Wir haben jetzt die URL in dieser Nachrichteneigenschaft zurückgegeben , mit der wir unsere Bildelemente festlegen können . Lasst uns das schnappen. Wir können das Konsolenprotokollzugriffsdokument.queryselector entfernen . War nicht im Bild, wo wir die Bildquelle so einstellen können, dass die Bildquelle gleich der image.message ist. Da sind wir los. So können wir async/await mit diesem regulären Funktionsstil verwenden. Es gibt aber auch verschiedene Arten von Funktionen , die Sie sich angesehen haben, einschließlich Funktionsausdrücken und Pfeilfunktionen. Genau so. Mit einem Funktionsausdruck. Sagen Sie, lasst func als Variablennamen und sagen Sie dies gleich unserer Funktion, die einfach eine Reihe von hey zurückgibt. Das Äquivalent der Pfeilfunktion würde genau so aussehen. Hier haben wir unseren Funktionsausdruck und dann haben wir unsere Pfeilfunktion. Async/await kann in einer dieser beiden verwendet werden. Die Möglichkeit, unseren Funktionsausdruck als asynchron zu markieren , besteht darin, genau wie oben das asynchrone Schlüsselwort kurz vor dem Funktionsschlüsselwort zu übergeben , und auch dasselbe für unsere Pfeilfunktion. Wir können dies gleich am Anfang platzieren, und dann können wir das await-Schlüsselwort überall im Funktionskörper verwenden . Async/Await ist eine saubere und leistungsstarke Lösung für den Umgang mit asynchronen Aufgaben. Aber wir müssen darauf achten, dass wir uns nicht zu sehr mitreißen lassen. In diesem Beispiel setzen wir das Bild in der nächsten Zeile. Es ist absolut sinnvoll, auf die zurückkommenden Daten zu warten , bevor wir sie verwenden. Aber stell dir vor, wir hätten so etwas. Wenn wir diese Antwort dupliziert haben, fragten wir nach unseren beiden separaten Bildern. Was wir hier machen, ist, dass wir zwei Anfragen für zwei unabhängige Bilder gleichzeitig stellen . Aber das Problem, das wir derzeit haben, ist das zweite Bild erst aufgerufen wird, wenn das erste Bild zurückgekehrt ist erst aufgerufen wird, wenn das erste Bild zurückgekehrt , weil wir das Schlüsselwort await verwenden. Dies führt zu einer unnötigen Zeitverzögerung im folgenden Code. Hier versuchen wir, auf unser erstes Bild zuzugreifen, aber wir müssen immer noch warten , bis das zweite Bild zurückgegeben wird, bevor diese Zeile überhaupt ausgeführt wird. Wir benutzen eine Welle, aber wir müssen auf die Daten warten, die wir brauchen und danach. Aber wir wollen immer noch nicht verhindern, dass der Rest des Codes ausgeführt wird, wenn wir es nicht brauchen. Der Umgang mit mehreren Anfragen wie diesen ist etwas, das wir uns als Nächstes genauer ansehen werden. Zusammen mit der baldigen Betrachtung auch der Fehlerbehandlung. 62. Handhabung mehrerer Warten: Am Ende des vorherigen Videos haben wir die Auswirkungen mehrerer Warteanrufe besprochen. Hier haben wir drei, haben Antwort, antwortet 2 und Antwort 3, die alle denselben Abrufaufruf tätigen. Wir wissen zum Beispiel, dass, wenn das zweite Bild auf die ersten Bilddaten warten musste auf die ersten Bilddaten warten bevor sie ausgeführt werden, dies völlig in Ordnung war. Wenn Bild 2 jedoch nicht auf das erste Bild angewiesen ist, sollte es diesen Code nicht unnötig blockieren. Mit mehreren Anfragen nach asynchronen Daten wie diesen bringt es uns zurück zu einem früheren Video, in dem wir uns angeschaut haben, wie wir mit mehreren Versprechen umgehen können. Was ist, wenn wir wissen wollen, ob einer scheitert oder wenn sie alle scheitern, wie würden wir dann damit umgehen? Mit Versprechungen könnten wir Methoden anwenden wie alles und alles geklärt. Aber mit asynchronem Code versprechen diese auch unter der Haube. Wir können diese Methoden wie alle immer noch nutzen. Zum Beispiel können wir ganz unten in unserer Funktion unten in unserer Funktion auf Versprechen für alle zugreifen, die ein Array aufnehmen. Wir können als Antwort, Antwort 2 und auch Antwort 3 passieren . Lassen Sie uns dies in einer Variablen oder einer Konstante namens result speichern einer Konstante namens result und protokollieren Sie dies dann in der Konsole. Ein Fehler, der also eine Antwort benötigt. Dies gibt immer noch ein Versprechen zurück, aber denken Sie daran, dass die All-Methode in ein einziges Versprechen aufgelöst wird , wenn alle Versprechen, die sie einnimmt , erfolgreich gelöst werden oder wenn eine einzelne fehlschlägt. In diesem Sinne können wir auch das Schlüsselwort await verwenden, um sicherzustellen alle zuerst gelöst werden, bevor wir zur nächsten Zeile übergehen. Geh vorbei warten, es ist davor. Jetzt warten wir darauf, dass alle drei dieser Versprechen jetzt abgeschlossen werden. Dies bedeutet, dass wir das await-Schlüsselwort jetzt vor jedem dieser kostenlosen unabhängigen Anrufe entfernen können. Probieren wir das aus, aktualisieren Sie es. Wir bekommen jetzt ein Array mit allen drei separaten Antworten. Wir können auf jeden einzelnen von diesen eingehen. Aber eines der Probleme, die wir immer noch haben, ist, wenn wir uns die URL ansehen, dies die Bild-URL, die wir innerhalb eines Abrufs anfordern, nicht das eigentliche JPEG-Bild , von dem zurückkommt die API. Wenn Sie sich erinnern, um auf dieses tatsächliche Bild zuzugreifen, das wir benötigen dieses im Körper enthalten ist, und um den Inhalt des Körpers zu lesen, müssen wir erneut die JSON-Methode verwenden. Die JSON-Methode liest den Inhalt davon und verwandelt ihn in ein JavaScript-Objekt, das wir lesen können. Wie wir sehen können, haben wir ein Array mit drei separaten Werten. Was wir tun können, ist, dass wir unser Konsolenprotokoll entfernen und alle drei dieser Werte mit der forEach-Methode durchlaufen können, also Ergebnisse. Speichern Sie diese für jede Funktion innerhalb des Wertes. Jetzt können wir diesen Wert an der Konsole protokollieren und die JSON-Methode für jeden dieser Werte aufrufen . Dies gibt uns jetzt unsere drei getrennten Versprechen zurück. Aber wenn wir das öffnen, sehen wir ein vertrautes Objekt, auf das wir eintauchen müssen , um unser eigentliches Bild zurückzubekommen. Dies geschieht, weil die JSON-Methode, wie wir zuvor gesehen haben , auch ein Versprechen zurückgeben wird. Um darauf zu warten, dass diese Daten zurückkommen, bevor wir darauf zugreifen, können wir das Schlüsselwort await verwenden, und da das Schlüsselwort await nur innerhalb einer Funktion verwendet werden kann, können wir dies als asynchron markieren. Erneut laden. Das gibt uns dann unsere drei Bilder zurück, die wir brauchen. Diese All-Methode bedeutet jetzt, dass wir etwas tun können, nachdem alle Versprechen erfolgreich waren oder wenn eine einzelne versagt. Apropos Scheitern: Das Thema des nächsten Videos untersucht wie wir Fehler mit async warten können. 63. Fehlerbehandlung: Dieses Video zeigt Ihnen einige Möglichkeiten, mit Fehlern in Ihrem asynchronen Code umzugehen . Code ist großartig, wenn alles gut läuft, aber wenn die Dinge nicht funktionieren, müssen wir damit umgehen, was zu tun ist. Einige der Versprechensmethoden, die wir uns angeschaut haben , geben uns eine gewisse Fehlerbehandlung. Zum Beispiel schlägt die All-Methode fehl, wenn ein Versprechen fehlschlägt, daher haben wir dort einige Optionen, aber wir müssen auch alle anderen Situationen behandeln, entweder einen allgemeinen Fehlerbehandler oder die Bearbeitung jeder spezifischen Anfrage. Im Starterprojekt in der Fehlerbehandlungsdatei haben wir in der Fehlerbehandlungsdatei ein leeres Bildelement oben und auch eine einzige Funktion. Nichts Neues hier für diese Funktion, dies ist nur eine Bild-URL mit der Fetch-API. Wir warten darauf, dass die Daten zurückkommen, die als Antwort gespeichert werden. Wir extrahieren diese Daten dann über die JSON-Methode und geben dann die Bild-Eigenschaft zurück , die die URL enthält. Kurz zuvor verwenden wir diese Funktion, schauen wir uns ein anderes einfaches Beispiel an. Lassen Sie uns unten eine neue Funktion mit einem beliebigen Namen erstellen, und dies wird einfache Zeichenfolge zurückgeben. Danach werden wir den Rückgabewert konsolenprotokollieren, wir rufen unsere Funktion auf, öffnen sich im Browser und es gibt unsere Rücksendenachricht. Nichts Unerwartetes hier, aber wenn wir diese Funktion als asynchron markieren, markieren Sie dies kurz vor dem Funktionswort als asynchron, und dieses Mal erhalten wir ein Versprechen zurück. Wir werden diese Funktion einfach dort lassen, aber denken Sie einfach für einen Moment daran. Sobald wir eine Funktion als asynchron markieren, wird sie dann ein Versprechen zurückgeben. Wir wissen, dass wir eine Funktion haben, um die Bild-URL abzurufen, also erstellen wir eine zweite Funktion, die tatsächlich die Bild-URL über dieses Bildelement festlegt. Dies kann auch asynchron sein, nennen Sie dies setImage. Dann werden wir im Inneren nur unsere Bildelemente mit dem Selektor document.query abrufen und die Quelle so einstellen, dass sie dem Rückgabewert der obigen Funktion entspricht. Ich beginne mit dem Bildelement und setze die Quelle auf unsere obige Funktion , nämlich geTimageUrl. Wir müssen das nennen. Die getimageUrl-Funktion ist asynchron, daher müssen wir darauf warten, dass dieses Versprechen zurückgegeben wird , bevor wir es tatsächlich verwenden können. Wir werden warten, dass diese Funktion den Wert zurückgegeben hat. Dies ist alles aktiviert, da wir seine Funktion als asynchron markiert haben . Nennen wir das gleich unten, setImage. Früher beim Umgang mit Fehlern unter Verwendung von Versprechungen haben wir einfach einen Fangabschnitt an das Versprechen gekettet. Diese setImage-Funktion ist auch asynchron, was auch ein Versprechen zurückgibt wie wir es zuvor mit dem einfachen Beispiel gesehen haben, was bedeutet, dass wir uns am Ende verketten könnten, dann den gesamten Catch-Block , der ist ich werde als Nächstes laufen. Wir können dies am Ende verketten, um sicherzustellen, dass es kein Semikolon gibt, und Fang hinzufügen. Catch führt eine Funktion aus, die die Fehlermeldung aufnimmt und sie in einem Konsolenprotokoll die Meldung „noooo“ und auch eine zweite mit diesem Fehler platziert einem Konsolenprotokoll die Meldung . Mal sehen, was passiert, wenn wir versuchen, diese Funktion aufzurufen. Bekommen wir den Fehler zurück, den wir fangen würden , oder stellen wir das Bild ein. Dieser spezielle Aufruf war ein Erfolg, daher sehen wir, dass das Bild zurückgegeben wird. Um den Catch-Block zu testen, müssen wir das Netzwerk wie zuvor ausschalten , also springen Sie in die Registerkarte Netzwerk. Hier drunter stellen wir die Voreinstellungen so fest, dass sie offline sind, jetzt können wir aktualisieren, wir sehen das Bild nicht. Springe in die Konsole. Unser erstes Konsolenprotokoll und unser zweites Konsolenprotokoll konnten nicht abgerufen werden. Wir sehen, dass das gut funktioniert und wir mischen die Syntax von Async erwartet mit Versprechen. Wenn wir einfach bei der Versprechenssyntax bleiben oder die Fehlerbehandlung in die Funktion selbst verschieben wollten , könnten wir etwas namens try and catch verwenden. Versuchen Sie zu fangen, wie es klingt, wird versuchen, etwas zu tun, und wenn es funktioniert, ist das alles großartig, wenn nicht, fangen wir den Fehler auf und behandeln ihn auf irgendeine Weise, die Sie möchten. Lassen Sie uns den Catch-Abschnitt aus setImage entfernen, und dann erstellen wir innerhalb unserer SetImage-Funktion einen Try-Block und unterhalb eines Catch-Blocks, ebenfalls die Fehlermeldung aufnimmt. Dies ist ziemlich einfach. Alles, was wir tun müssen, ist unseren Code, den Sie innerhalb des Test-Blocks ausführen möchten, zu verschieben was wir tun müssen, ist unseren Code, den Sie innerhalb des Test-Blocks ausführen möchten, zu . Schneiden Sie dies also aus, fügen Sie ihn in den Abschnitt „try“ und dann in den Catch ein -Bereich können wir in den gleichen Konsolenprotokollen platzieren, also eine Zeichenfolge und auch ein zweites Konsolenprotokoll mit der Fehlermeldung, die an diese Funktion übergeben wird. Sparen wir uns das auf und probieren es aus. Denken Sie daran, dass mein Netzwerk immer noch deaktiviert ist Wenn wir es erneut versuchen, sehen wir das Bild nicht, Sie werden unsere beiden Fehlermeldungen in der Konsole sehen. Versuchen wir, dies wieder einzuschalten, das Netzwerk zurückzugeben, das Image wird jetzt zurückgegeben und wir sehen keines dieser Konsolenprotokolle hier. Dieser Try-and-Catch-Bereich läuft synchron, also führen wir den allerersten Abschnitt aus, der versucht wird. Wenn das alles funktioniert, ist das völlig Ordnung, aber wenn es fehlschlägt, wechselt es zum nächsten Catch-Block und führt den darin enthaltenen Code aus. Darüber hinaus haben wir auch einen endgültigen Abschnitt 2. Das funktioniert genau so, als wir uns endlich an das Ende eines Versprechens gekettet haben. Endlich läuft immer, unabhängig davon ob das Versprechen erfüllt oder abgelehnt wurde. Gehen Sie unten endlich und wir legen einfach ein einfaches Konsolenprotokoll ein. Versuchen wir es, aktualisieren und wir sehen das Konsolenprotokoll mit dem Text „immer läuft“. Genau wie eine kurze Randnotiz der Fang oder der endgültige Block vorhanden sein. Es muss mindestens eine davon vorhanden sein, oder genau wie dieses Beispiel können wir beides verwenden. Das ist in Ordnung für den allgemeinen Fehler, aber was ist, wenn wir wissen wollten , welcher Teil des Testcodes fehlgeschlagen ist? Im Moment ist das ziemlich einfach, da wir nur eine Codezeile haben. Aber was ist, wenn dieser Versuchs-Abschnitt mehr als das getan hat? Dafür könnten wir einen Catch-Block direkt auf die asynchrone Aufgabe ketten und um ein Beispiel zu sehen, kopiere ich einfach diese volle Funktion, kommentiere diese als Referenz aus füge sie dann unten ein. Wir können die gesamte Fehlerbehandlung entfernen , die wir gerade hinzugefügt haben, darunter den Catch, das Endlich und auch den Try-Block, der unsere einfache asynchrone Funktion verlässt. Damit können wir dann das Semikolon entfernen, wir können dann am Ende verketten, innerhalb des Fangs, wir könnten eine Funktion direkt im Inneren übergeben, oder wenn wir diese Funktion wiederverwenden wollten, könnten wir ein separate Funktion innerhalb unseres Codes. Lassen Sie uns eine Funktion direkt über dem Namen Handle-Fehler erstellen. Wir schnappen uns einfach unsere beiden Fehlermeldungen und fügen diese ein. Der Fehler wird auch die Fehlermeldung aufnehmen , dann können wir dies innerhalb von catch aufrufen. Dies gibt uns eine separate wiederverwendbare Funktion, die wir dann am Ende mehrerer Versprechen verketten können . Probieren wir das mal aus. Wir sollten jetzt unsere beiden Fehlermeldungen sehen. Wenn es einen Misserfolg gibt. Wenn nicht, sehen wir das Bild, das funktioniert gut. Versuchen wir, das Netzwerk noch einmal auszuschalten, zur Konsole zu gehen, hier gibt es unsere Fehlermeldungen . Natürlich würde ein Konsolenprotokoll in einer realen Anwendung nicht ausreichen, wir würden vielleicht das Bild ausblenden möchten, wenn ein Fehler aufgetreten ist, oder sogar ein Platzhalterbild hinzufügen. Der Schlüssel hier ist jedoch, etwas zu tun, anstatt nur die Website oder die Anwendungsaufschlüsselung zu sehen . Umgang mit Fehlern ist ein großer Teil von asynchronem JavaScript, und wir sehen hier einige allgemeine Muster , die Sie in Ihren Projekten verwenden können, was die Funktionalität und Benutzererfahrung wirklich verbessern wird . 64. So Bald: Dieses erste Projekt, das wir im letzten Abschnitt dieser Klasse finden , heißt Leaving So Soon und enthält einen Startercode, und enthält einen Startercode sodass wir uns auf das JavaScript konzentrieren werden. Dieses Projekt wird als Exit-Intent-Pop-up bezeichnet. Ein Pop-up zur Exit-Absicht ist im Grunde eine Möglichkeit, die Aufmerksamkeit des Benutzers wenn er versucht, Ihre Website zu verlassen. Wir haben etwas einfaches HTML, haben unseren Titel, und dann haben wir diesen Pop-up-Bereich innerhalb eines Div. Wenn wir zum Projekt gehen und aktualisieren, sehen wir derzeit nur diesen Titel. Die Idee ist, dass wir eine einfache Website wie diese haben und Sie diese Art von Websites möglicherweise gesehen haben , wenn Sie online surfen. Wenn Sie versuchen, die Maus nach oben zu bewegen und versuchen, den Browser zu schließen oder sogar die Website zu suchen oder von der Website zu navigieren, wird möglicherweise häufig ein Pop-up angezeigt. Dieses Pop-up könnte Informationen enthalten. Es kann einen Gutscheincode oder im Allgemeinen alles enthalten, um den Benutzer auf Ihrer Website zu halten. Wir sehen diesen Pop-up-Abschnitt nicht denn wenn wir uns dieses div ansehen, hat es die ID des Exit-Popups. innerhalb unserer Stylesheets Wenn wir innerhalb unserer Stylesheets nach diesem Abschnitt suchen, ist der Anzeigetyp derzeit auf „None“ festgelegt. Wenn wir dies ändern, um flexibel und aktualisiert zu werden, wird der Hintergrund aufgrund der CSS-Animation ausgeblendet , die wir gerade unten haben. Unser Pop-up erscheint jetzt mit dem gesamten Text darin. Die Inhalte innerhalb dieser Websites oder innerhalb dieses Popups sind irrelevant. Die Idee ist, dass wir diese Anzeigeeinstellung umschalten möchten , sobald die Maus eines Benutzers den oberen Rand des Browsers verlässt. Gehen wir vorerst zurück in unser Stylesheet, und ich werde es standardmäßig ausblenden. Dann arbeiten wir innerhalb unseres Skripts, das unten bereits verlinkt ist. Lasst uns das aufmachen. Wenn Sie darüber nachdenken, was wir hier tun wollen, müssen wir nicht viele Aufgaben ausführen. Beginnen wir damit, eine Funktion zu erstellen, die ausgeführt wird , wenn die Maus den Fensterbereich verlassen hat. Sobald das Pop-up tatsächlich im Browser angezeigt wird , benötigen wir auch eine Möglichkeit , auf ein X in der Ecke zu klicken und dieses zu schließen. Erstellen Sie eine zweite Funktion namens ClosePopUp. Wir beginnen mit unserer ersten Funktion, nämlich LefTwinDow, und dafür müssen wir auf ein Mausereignis achten. Wir wählen das Dokument aus, das unsere vollständige Webseite ist, und hören dann zu, wann die Maus mit dem Mausaus-Ereignis geht. Lasst uns unsere Dokumente schnappen. Wir können einen Event-Listener hinzufügen. Ereignisse. Wir wollen darauf achten, dass es Maus raus ist, was dann unsere obige Funktion auslösen wird. Denken Sie daran, dass dies bei Ereignissen auch die Ereignisinformationen aufnimmt , auf die wir innerhalb einer Variablen zugreifen können. Loggen wir dies zunächst in der Konsole an. Protokollieren Sie die Ereignisinformationen in der Konsole, aktualisieren Sie sie, und wir können sehen, ob wir die Maus außerhalb des Dokumentenbereichs bewegen , dieses Mausereignis wird jetzt ausgelöst. Dies wird auch funktionieren, wenn Sie sich für die andere Seite und auch für die Top Zwei entscheiden. Springe hier rein. Die Mauskoordinaten , an denen wir interessiert sind , sind dieser ClientX und der ClientY. Dies ist ein Pixelwert , der uns die Position der Maus mitteilt , sobald dieses Ereignis ausgelöst wurde. Genau wie beim frühen Betrachten des Canvas ist X die linke oder rechte Richtung, und das Y ist von oben nach unten. Da wir versuchen, auf die Maus aufzupassen und den oberen Teil des Browsers zu verlassen, um dieses Fenster zu schließen, werden wir uns für die Richtung ClientY interessieren. Wir können das nach unten filtern, e.Clienty. Lasst uns nachladen. Wenn wir nun nach oben gehen, können wir sehen, sobald wir den oberen Teil des Browserbereichs passieren , dann beginnen wir, eine negative Zahl zu erhalten, was bedeutet, dass die Spitze hier der Wert von Null ist. Wir müssen auf einen 20-Pixel-Bereich achten , der alle Popups angezeigt wird, sobald der Benutzer die Maus in den oberen Bereich des Browsers bewegt . Wir können das Konsolenprotokoll entfernen. Platzieren Sie eine if-Anweisung. Wir können sagen, wenn e.Clienty weniger als jeder Wert Ihrer Wahl ist , werde ich mich für 20 entscheiden. Wie wir in diesen Stylesheets gesehen haben, können wir unsere Elemente mit der ID des Exit-Popups abrufen und den Anzeigetyp umschalten. Schnappen Sie sich das mit dem document.QuerySelector. Ich schicke die ID des Exit-Popups. Stellen Sie die Stileigenschaft der Anzeige auf Flex ein. Probieren wir das mal aus. Aktualisieren Sie und gehen Sie jetzt nach oben, und dieses wird unser Pop-up auslösen. Sie denken vielleicht, dass das alles gut funktioniert und das ist alles, was wir tun müssen. Wir müssen auch einige Schritte unternehmen , damit wir den Benutzer nicht irritieren. Sie müssen dieses Kreuz aktivieren, damit es unsere ClosePopup-Funktion umschaltet. Aber wahrscheinlich möchten Sie diesen Code nur ausführen, um das Pop-up nach einer gewissen Zeit zu aktivieren, und wir möchten auch sicherstellen, dass dies nur einmal beim Besuch des Benutzers ausgelöst wird. Um sicherzustellen, dass dies nur einmal ausgelöst wird, machen wir das Gegenteil und entfernen den Ereignis-Listener aus den Dokumenten. Aus frühen Videos wissen wir, dass wir dieselben Informationen aus addEventListener kopieren müssen . Wir können das noch nicht testen , da wir das Fenster auch schließen können müssen , bevor wir es reaktivieren können. Wir machen das jetzt, wir gehen in den ClosePopup-Bereich und machen dann das Gegenteil, indem wir den Anzeigetyp auf „None“ setzen. Um diese Funktion zu aktivieren, müssen wir auf einen Klick auf unser Kreuz achten. Innerhalb der Indexseite enthält die Spanne den Querbereich. Lassen Sie uns das in unserem Skript unter der Unterseite document.QuerySelector aufnehmen. Wir wählen unsere Spanne aus. Bewahren Sie dies in einer Konstante namens closeBtn auf. Schnappen Sie sich die Elemente und fügen Sie einen Ereignis-Listener hinzu. Wir möchten auf die Klickereignisse achten, die unsere obige Funktion ausführen. Probieren wir das mal aus. Bewegen Sie sich nach oben, um das Pop-up zu aktivieren. Klicken Sie auf das Kreuz. Wir können auch sehen, ob wir an den Anfang des Browsers wechseln, unser Pop-up wird nicht reaktiviert da wir den Ereignis-Listener entfernt haben. Alles gut, das funktioniert ziemlich gut. Eine schnelle Ergänzung, die wir machen werden, besteht jedoch darin, sicherzustellen, dass das Pop-up nicht aktiviert wird, sobald der Benutzer die Website besucht. Wenn beispielsweise oben etwas eingegeben und dann sofort verschoben wird, möchten Sie nicht, dass das Pop-up sofort angezeigt wird. Was wir tun werden, ist, dass wir ein setTimeout platzieren, um diese Funktion erst nach einer gewissen Zeitverzögerung zu aktivieren. Rufen Sie ein setTimeout auf. Übergeben Sie eine Funktion, bei der wir unser Maus-Out-Ereignis bewegen können, was unsere Funktion auslöst. Ruft dies erst nach einer Zeitverzögerung von drei Sekunden auf. Probieren Sie das aus, damit wir die ersten drei Sekunden mit der Maus nach oben bewegen können . Dann, nach drei Sekunden, ist unsere Funktion aktiv. Ziemlich einfaches Projekt, und wir können ziemlich viel mit einer kleinen Menge an JavaScript-Code machen. Es ist etwas, das Sie möglicherweise nützlich finden , wenn Sie in Zukunft Websites erstellen. Ebenso wie unser nächstes Projekt, das ein Image-Karussell sein wird, das wir komplett von Grund auf neu bauen werden. 65. Bild Carousel- Die Bilder Einstellen: In unserem nächsten Projekt bauen wir ein Image-Karussell ein. Dies wird das Endergebnis sein und es ist komplett mit JavaScript erstellt. Was wir haben werden, ist ein großes Hauptbild ganz oben. Wir können die unteren Bilder durchlaufen, um dies mit den Pfeilen nach links und rechts zu ersetzen . Außerdem können wir zu einem dieser Bilder springen , indem wir darauf klicken und diese in den oberen Bereich platzieren. Dies wird viele der Fähigkeiten zusammenstellen , die Sie gelernt haben, und auch besser sehen, wie die Dinge in der Praxis mit einer realen App funktionieren . Fangen wir das in den Starterdateien von vorne an. Wenn wir in den nächsten Abschnitt springen, nämlich das Bildkarussell, haben wir einen Startercode. Wir haben eine sehr einfache Indexseite, wir werden alle Inhalte mit JavaScript injizieren. Alles was wir haben ist ein leeres Div mit der ID des Karussell. Wir platzieren alle Bildinhalte und verlinken dann auf unser Skript. Das Skript befindet sich im Karussellordner , der unsere Bilder, unsere Stylesheets und auch das JavaScript enthält , damit dies funktioniert. In diesem Kurs stehen fünf verschiedene Bilder zur Verfügung , die Sie ersetzen können , und auch einige grundlegende CSS. Wir haben nur ein bisschen grundlegendes Styling. Zum Beispiel stellen wir das Hauptkarussell auf eine bestimmte Breite ein und platzieren es auch in die Mitte mit dem Rand 0 auto. Wir haben ein paar Hover-Effekte. Ansonsten ein allgemeines Styling zusammen mit der kleinen und der großen Klasse, die wir hier haben. Wir werden diese kleineren als großen Klassen zu jedem dieser Bilder hinzufügen als großen Klassen zu jedem dieser , damit sie gut auf den Bildschirm passen. Fangen wir an. Wir springen in unsere leere carousel.js. Wir fangen damit an, diesen Karussell-Div-Abschnitt zu greifen und auch ein Array mit allen Bildern zu erstellen. Springe in die carousel.js. Wir werden damit beginnen, eine Reihe unserer Bilder zu erstellen. Jeder von ihnen wird eine Zeichenfolge sein, die auf die URL im Bildordner verweist . Wenn Sie Ihre eigenen Bilder verwendet haben, denken Sie daran, die Namen hier so zu ändern , dass sie mit denen übereinstimmen, die Sie darin platziert haben. Der erste ist im Karussellordner, und der Dateipfad ist images/beach.jpg. Lassen Sie uns dies duplizieren, um uns fünf verschiedene Bilder zu geben. Der zweite war Elefanten. Wir haben Gras. Wir haben See, und der letzte ist Stadt. Als Nächstes holen wir uns einen Hinweis auf unser Karussell. Wir speichern dies in einer Konstante namens Wrapper ist gleich document.query Selector, plus in der ID des Karussell. Im nächsten Schritt werden wir eine Funktion erstellen, die all diese Bilder aufnimmt, diese durchläuft und diese auf den Bildschirm legt. Erstellen Sie also unten eine Funktion namens setImages. Der erste Schritt innerhalb dieser Funktion besteht darin, unseren Wrapper zu greifen, und wir werden alle vorhandenen Inhalte löschen. Auf diese Weise können wir den Vorgang der Einstellung unserer Bilder wiederholen , aber manchmal befinden sie sich in einer anderen Reihenfolge. Wir werden alle zusätzlichen Bilder löschen, indem wir unseren Wrapper greifen und den inneren HTML-Code auf eine leere Zeichenfolge setzen . Bevor ich es vergesse, rufen wir unsere Funktion von unten auf, und dann greifen sie unsere Bilder und erstellen eine für jede Schleife, um über jede einzelne dieser Bilder, Bilder.forEach, plus innere Funktion zu schleifen . Wir erstellen einen Verweis auf jeden von diesen und nennen es Bildquelle ImageSRC. Öffnen Sie den Funktionskörper, und dann erstellen wir hier ein neues Bildelement, speichern dieses in einer Variablen namens elements, documents.createElement. Schreibe ein Bildelement. Dann müssen wir festlegen, dass die Bildelementquelle dieser Variablen entspricht. Schnappen Sie sich unser Element und legen Sie das Quellattribut so fest, dass es unserer Bildquelle entspricht. Wir können dann unseren Wrapper greifen , den wir in dieser Konstante gespeichert haben, dann können wir dieses neue Element, Wrapper.AppenChild, plus in unserem neu konstruierten Element hinzufügen Wrapper.AppenChild, . Gehen wir zum Browser und sehen, was wir haben. Wir haben unsere fünf verschiedenen Bilder aus dieser Schleife, aber wenn wir uns die endgültige Version ansehen, möchten wir nicht nur fünf zufällige Bilder im Container platzieren. Was wir tun möchten, ist, das erste Bild groß zu machen und dann unten einen separaten Abschnitt mit den verbleibenden kleinen Bildern zu erstellen unten einen separaten Abschnitt mit den . Um dies zu tun, erstellen wir einen Wrapper für alle kleinen Bilder unten, und dann wird dies von der Stelle abgeschnitten , an der ein kleines Bild hier drin und das große Bild oben liegt. Lassen Sie uns zuerst in unsere Funktion zurückkehren und einen neuen Wrapper für die vier kleinen Bilder unten erstellen . Gleich danach, wo wir unser Obermaterial räumen und eine neue Konstante namens SmallimageWrapper erstellen . Dies ist gleich document.createElement. Dies kann jedes Element sein, das Sie möchten, z. B. ein div oder ein Abschnitt, es spielt keine Rolle. Dann schnapp dir unsere Sektion und wir geben ihm eine eindeutige ID von SmallimageWrapper. Was wir jetzt tun wollen, ist alle fünf unserer Bilder im Array zu durchlaufen . Der allererste muss in den Wrapper platziert werden, und dann müssen alle vier verbleibenden Bilder in unserem kleinen Bild-Wrapper platziert werden. Wir können dies tun, indem wir zuerst unseren vollständigen Wrapper auswählen und prüfen, ob er aktuelle Inhalte enthält. Wenn diesem Wrapper noch kein Bildelement zugewiesen ist, bedeutet dies, dass es sich um ein allererstes Bild im Array handelt. Was wir innerhalb unserer Schleife tun können ist, dass wir eine if-Anweisung platzieren können, und wir können überprüfen, ob unser Wrapper keine untergeordneten Knoten hat. Wir können sagen! wrapper.hasChildNodes. Der Code in hier wird nur ausgeführt, wenn dieser Wrapper leer ist und keine zusätzlichen Bilder enthält. Dies wird immer der Fall sein, wenn wir das erste Bild durchlaufen. Wenn dies der Fall ist, möchten wir die Klasse festlegen. Wenn wir uns unsere Stylesheets ansehen, möchten wir diese Klasse groß festlegen, da diese eine Breite von 100 Prozent hat. Wenn nicht, fügen wir die Klasse von Small hinzu, die Ihnen diese kleinere Größe gibt. Es ist eine Klasse hinzuzufügen, wir können unsere elements.classlist.add, Platz in der Klasse von Large und auch in der Klasse des Karussells. Wenn wir erneut in das Stylesheet zurückkehren, verwandelt diese Karussellklasse den Cursor in einen Zeiger, wenn der Benutzer den Mauszeiger über das Bild bewegt. Dieser sollte nur für das allererste Element in unserem Wrapper gelten, sonst sollte es für die restlichen vier Bilder gelten. Wir fügen eine Klassenliste von kleinen hinzu. Wir fügen alles kleine und auch Karussell hinzu. Wir erhalten immer noch den Hover-Effekt, aber dieses Mal, da wir es mit den vier kleineren Bildern zu tun haben, möchten wir diese nicht zum Haupt-Wrapper hinzufügen. Stattdessen möchten wir sie zu unserem Small Image-Wrapper hinzufügen , den wir gerade erstellt haben. Also lasst uns das schnappen, Kind öffnen in unsere Elemente legen. Sparen wir uns das auf und probieren es aus. Da sind wir los. Es gibt unser großes Bild und die vier kleinen Bilder in diesem separaten div. Genau als Zusammenfassung haben wir hier einen großen Wrapper für alle unsere Bereiche erstellt . Wir haben eine Funktion namens Set-Images erstellt. Sobald dies ausgeführt wird, werden alle vorhandenen Inhalte aus dem Wrapper gelöscht , was bedeutet, dass wenn wir unsere Bilder durchlaufen, wenn dieser Wrapper leer ist, dies bedeutet, dass es sich um ein allererstes Element in handelt das Array, daher geben wir ihm die große Klasse. Wenn nicht, sind es die restlichen vier Bilder, in denen wir den kleinen Cluster hinzufügen und diesen auch in ein separates div platzieren. Dies ist eine gute erste Stufe für unser Projekt. In den kommenden Videos werden wir verschiedene andere Funktionen nachschlagen, werden wir verschiedene andere Funktionen nachschlagen wie zum Beispiel das Neuordnen dieser Bilder, das Austauschen der Bilder und das Platzieren in den Pfeilen, um nach links und rechts zu gehen. 66. Bild Carousel- Erstellen Der Pfeile: Wir befinden uns jetzt in unserem Projekt, wo alle fünf Bilder auf dem Bildschirm angezeigt werden. Wir haben oben ein großes Feature-Bild, dann von vier kleineren Miniaturansichten unten. Wir müssen einige Verbesserungen vornehmen, wir möchten in der Lage sein, auf eines dieser kleineren Bilder und Orte im vorgestellten Bereich oben zu klicken dieser kleineren Bilder und . Wir möchten diese auch drehen können , indem wir einen kleinen Pfeil nach links und auch nach rechts hinzufügen. Beginnen wir damit, indem wir die Pfeile hinzufügen , sobald die Bilder geladen werden. Um dies zu tun, können wir diese in eine eigenständige Funktion einfügen und dies aufrufen. Lass mich unsere Bilder nennen. Ganz unten in dieser Funktion rufen wir unsere Funktion auf, die wir setArrows aufrufen werden. Dies ist die Funktion , die wir als Nächstes erstellen werden. Direkt darunter richtet sich unsere Funktion ein, die setArrows war. SetArrows muss nichts als Parameter aufnehmen . Was wir also hier tun müssen, ist, dass wir einige Symbole mit HTML-Entitäten erstellen und diese als inneren HTML eines Span-Elements speichern können HTML-Entitäten erstellen und diese als inneren HTML eines Span-Elements speichern . Was wir brauchen, sind zwei Konstanten, die erste ist der Pfeil nach links, der genau dem document.createElement entspricht wie in einer Spanne. Der Grund, warum wir die Span verwenden, ist, dass es sich standardmäßig um ein Inline-Element handelt, sodass wir diese mit unseren vier Bildern inline platzieren können. dem Pfeil nach links greifen wir auf diese Konstanten zu und stellen den inneren HTML so ein, dass er unserer HTML-Entität entspricht , und der Code für den Pfeil nach links ist der ‹ Beide Pfeile, Sie müssen auf diese klicken und ordnen Sie alle unsere Bilder neu an. Wir wählen unsere Konstanten aus und fügen einen Ereignis-Listener hinzu, der jetzt ein kostenloser Klick ist , der eine Funktion auslösen wird. Wir haben diese Funktion noch nicht erstellt, aber sie wird ReOrder heißen und nur damit wir keine Fehler auslösen, erstellen wir diese Funktion oben. Das braucht keinen Inhalt, wir werden darauf zurückkommen. Direkt unter unserem Event-Listener machen wir so ziemlich dasselbe, aber dieses Mal erstellen wir für den Pfeil nach rechts die Span-Elemente mit Dokument. createElement, setze den inneren HTML-Code, RightArrow.innerHTML. Der HTML-Entitätscode für den Pfeil nach rechts lautet › , der nur einer vom Pfeil nach links entfernt ist. Fügen Sie einen Ereignis-Listener hinzu. hört auch auf ein Klickereignis ab, das dieselbe Funktion auslöst. Das sind unsere beiden Pfeile die mit dem Inhalt und dem Event-Listener erstellt wurden. Aber was wir jetzt tun müssen, ist, beides zu einem bestimmten Abschnitt hinzuzufügen. Wenn wir zu unserer ersten Funktion zurückkehren , die setImages war, haben wir diesen SmallimageWrapper. Dies ist ein div-Abschnitt , der mehr als vier kleine Miniaturansichten enthält , daher fügen wir beide in diesen Abschnitt hinzu. Wir können dies am Anfang und am Ende tun, besteht darin, eine JavaScript-Methode namens AppendChild zu verwenden, die dies am Ende des rechts platzierten Divs hinzufügt . Dann können wir für den Pfeil nach links die Prepend-Methode verwenden, die dies zum Anfang unseres div hinzufügen wird. Machen wir dies am Ende unserer setArrows-Funktion. Lasst uns zuerst den Abschnitt greifen, also auf der Innenseite einer Konstante namens SmallimagewRapper, dem document.QuerySelector, hat dies die ID von SmallimageWrapper. Schnapp dir diesen Abschnitt. Wie ich gerade erwähnt habe, legen wir mit AppendChild den Pfeil nach rechts in diesen Inhalt, wie wir zuvor nachgeschlagen haben. Dies wird dies am Ende unseres Div-Abschnitts nach unseren Bildern hinzufügen . Platzieren Sie unseren Pfeil nach rechts, dann fügen wir unseren Pfeil nach links zum Start hinzu, wir verwenden die Prepend-Methode und fügen unseren Pfeil nach links ein. Probieren wir es mal aus. Jetzt nach Aktualisierung sehen wir unsere Pfeile immer noch nicht auf dem Bildschirm. Werfen wir einen Blick in die Konsole und sehen, ob uns dies Hinweise gibt. Im Inneren können wir sehen, dass wir Eigenschaften von null nicht lesen können, indem wir AppendChild lesen. Wenn wir also versuchen, ein neues Element an unseren einzelnen Bild-Wrapper anzuhängen , scheinen wir ein Problem zu bekommen. Der Grund, warum dies passiert, ist, dass wir einen SmallimageWrapper haben, den wir oben erstellen. Wenn wir unsere Bilder einstellen, haben wir den Hauptwrapper, der unser vollständiges Karussell enthält , und dann haben wir unseren SmallimageWrapper , den wir anhand dieser ID in der Schleife auswählen möchten. Aber jedes unserer Bilder, wir erstellen ein neues Bildelement in dieser Variablen gespeichert ist, wir fügen entweder die große oder die kleine Klasse hinzu, und wenn es sich um ein kleines Bild handelt, fügen wir diese hinzu vier kleine Bilder zu diesem SmalliimagewWrapper. Aber derzeit fügen wir dem DOM keinen SmallimageWrapper hinzu, alles, was wir tun, ist es zu erstellen und wir fügen unsere vier Elemente hinzu, aber wir platzieren dies nicht wirklich im DOM. Zumindest können wir dann unten unten auswählen. Das einzige Mal, dass dem DOM etwas hinzugefügt wird , ist, wenn wir dieses Element zu unserem Wrapper hinzufügen. Das Hinzufügen des Elements direkt zu unserem Wrapper ist völlig in Ordnung, wenn dies das große Bild ist, da es direkt in das Hauptkarussell fließt . Wenn wir es jedoch mit einem kleinen Bild zu tun haben, möchten wir diese SmallimageWrapper diesem Abschnitt zuweisen . Wir können dies tun, indem wir unser Element auswählen und dieses auf unseren SmallimageWrapper setzen. Dieser SmallimageWrapper wird alle unsere vier kleinen Bilder enthalten und dann fügen wir dies unserem Haupt-Wrapper hinzu. Wenn wir das jetzt speichern und auffrischen, können wir das jetzt öffnen, wir sehen, wie unsere beiden Pfeile in die Elemente springen und wenn wir in den Körper gehen, sehen wir unseren Hauptwrapper mit der ID des Karussell. Wir können das aufmachen. Wir sehen unser erstes Bild mit der Klasse von Large. Nur um klarzustellen, wird dieser zugewiesen denn sobald wir alle unsere Bilder durchlaufen haben, prüfen wir, ob dieser Abschnitt leer ist, ob er mit der Klasse der großen Größe größer ist und füge das zu unserem Wrapper hinzu. Wenn nicht, werden die vier verbleibenden Bilder die Klasse klein und fügen dann zu unserem SmallimageWrapper hinzu , der dann an unsere Elemente übergeben wird , und dann können wir diese dem DOM hinzufügen, was wir sehen können, ob wir sieh dir dieses Div genau hier an. Wir können das aufmachen. Wir haben unser Span-Element, das wir gerade mit Prepend hinzugefügt haben, wir haben unsere vier Bilder und dann die letzte Spanne, die wir mit AppendChild hinzugefügt haben. 67. Bild Karussell - Bilder neu bestellen: Zuvor haben wir unsere Pfeile nach links und rechts eingerichtet und diese auch mit einer Funktion namens Reorder verknüpft. Wir haben dies getan, indem wir unsere Pfeile innerhalb dieser Funktion unser für ein Klickereignis verwendet haben, das darin unsere Funktion ausgelöst hat. Was wir jetzt tun werden, ist im Grunde ein neues Array zu erstellen. Dieses neue Array wird erstellt, indem die Reihenfolge all dieser Bilder neu angeordnet wird. Wir tun dies innerhalb unserer Funktion, indem zuerst die Ereignisinformationen aus dem Klick aufnehmen, und der Grund, warum wir dies tun, ist, dass wir feststellen müssen , auf welche dieser Schaltflächen geklickt wurde. Wir müssen wissen, ob es der linke oder der rechte Knopf ist. Wir können dies tun, indem wir jedem von diesen eine ID hinzufügen, sodass die Leftarrow.ID einfach gleich links ist. Dann geh nach rechts runter. ID nach rechts. Jetzt können wir auf diese ID anhand der Elementinformationen des Ereignisses zugreifen . Wir wissen von zuvor, durch ein Konsolenprotokoll, wenn wir den Wert von e.target protokollieren, die tatsächlichen Elemente innerhalb der Konsole erhalten. Klicken Sie auf eine dieser Punkte holen Sie sich die rechte Schaltfläche und dann auf die linke Schaltfläche. Wir können dieses Objekt auch nach unten filtern und nur die ID nehmen. Dies gibt uns jetzt einen eindeutigen Zeiger darüber , welche Taste gedrückt wurde. Wir können dies jetzt aus einem Konsolenprotokoll entfernen in einer konstanten gerufenen Richtung speichern. Was wir jetzt tun werden, ist, dass wir unser Bilder-Array ganz oben durchlaufen . Wir werden sicherstellen, dass wir alle fünf dieser Bilder abdecken. Wir ermitteln dann, ob die linke oder die rechte Schaltfläche angeklickt wurde, und dann verwenden wir diese, um unsere Bilder neu anzuordnen. Diese neuen Bilder werden in einem neuen Array namens NewarRay gespeichert , das den Anfangswert eines leeren Arrays haben wird, und dann können wir alle unsere Bilder durchlaufen. Tun Sie dies mit einer forEach-Schleife, übergeben Sie unsere Funktion. Dann wird es innerhalb dieser Funktion zwei Dinge aufnehmen. Erstens geben wir wie immer einen Variablennamen ein , der jedes Bild in dieser bestimmten Schleife sein wird, und dann können wir auch auf die Indexnummer zugreifen. Für die erste Schleife dies der erste Punkt, der unser Strand mit der Indexnummer 0 ist. Dann wird dies in jeder Schleife eins erhöht. Um diese Bilder neu anzuordnen, müssen wir zuerst prüfen, ob die Richtung mit links beginnt. Wenn nicht, fügen wir einen anderen Abschnitt hinzu, der ausgeführt wird , wenn die Richtung gleich rechts ist. Denken wir darüber nach, was wir tun wollen, wenn die Richtung übrig bleibt. Wenn auf diese linke Schaltfläche geklickt wird, müssen wir das ursprüngliche Array durchlaufen, das wir tun, und für das allererste Element in hier möchten wir dies an das Ende unseres neuen Arrays schieben und dann für die restlichen vier Bilder unten wollen wir diese um eine Position nach hinten verschieben. Wir können das innerhalb des linken Knopfes machen. Wir prüfen, ob die Indexnummer, auf die gerade hier Zugriff haben wird , gleich 0 ist, dh es ist das Hauptbild oben. Wenn dies der Fall ist, wollen wir es bis ans Ende unseres neuen Arrays bringen . Wir können dies tun, indem wir auf diese Variable zugreifen. Wir können dies ganz am Ende positionieren, indem unsere Eigenschaft images.length zugreifen. In diesem Beispiel sollte dies unser neues Array in Indexposition 5 sein. Wir werden festlegen, dass dies das erste Bild ist. Nehmen Sie unser erstes Bild aus dem ursprünglichen Array oder schieben Sie es bis zum Ende unseres neuen. Wir nennen es auch Newarray.Shift für den Fall, dass am Anfang dieses Arrays etwas vorhanden ist. Dies ist das allererste Bild, um das sich gekümmert hat, aber was ist mit den restlichen vier? Nun, für die restlichen vier Bilder müssen wir nur die aktuelle Indexnummer abrufen und diese um eins zurückverschieben. Wir können dies innerhalb eines anderen Abschnitts direkt danach , anderswo platzieren. Dies wird bei den restlichen vier Bildern der Fall sein. Alles, was wir tun möchten, ist unser neues Array zu greifen, den aktuellen Index auszuwählen, der den Wert von eins annimmt, und diesen auf unser aktuelles Bild zu setzen. Wenn unser aktuelles Bild beispielsweise Index Nummer 3 ist, wird dies zurück zu Nummer 2 verschoben, was für die vier verbleibenden Bilder gleich ist. Bevor wir weiter gehen, probieren wir das aus. Derzeit wird unsere Funktion aufgerufen und es wird das Array neu angeordnet, wir müssen auch das ursprüngliche Bilder-Array mit unserem neuen überschreiben . Wir können dies am Ende unserer Funktion tun und unser Bild-Array so einstellen, dass es dem neuen Array entspricht. Sobald wir unser Bilder-Array zurückgesetzt haben, müssen wir die Funktion „Bilder einstellen“ aufrufen, die dieses Array tatsächlich durchläuft und sie auf dem Bildschirm anzeigt. Wir machen das ganz unten. Rufen Sie diese Funktion auf und probieren wir das aus. Aktualisieren. Wenn wir auf den „Pfeil nach rechts“ klicken, erhalten wir einen Fehler, da wir diesen Fall noch nicht bearbeitet haben. Versuchen wir es nach links. Wir haben die Elefanten, die jetzt auf die erste Indexposition gestiegen sind. Klicken wir erneut auf „Links“. Dies ist bis zum Ende übergegangen. Das scheint alles gut zu funktionieren. Um es zusammenzufassen, schnappen wir uns das allererste Bild und schieben es dann am Ende unseres neuen Arrays. Derzeit ist es der Strand, der bis zum Ende geht, und die restlichen vier Bilder werden um eine Indexzahl nach links verschoben . Als Nächstes kümmern wir uns um den L-Bereich, heißt, wenn auf die rechte Schaltfläche geklickt wurde. Was wir hier drin machen werden, ist im Grunde das Gegenteil von dieser Zeile gerade hier. Anstatt eine Indexnummer zu entfernen, um sie nach links zu verschieben, müssen wir eine hinzufügen, um jede nach rechts zu verschieben. Wir fügen dies ein, alles bei einer Indexnummer von Eins. Anstatt zu prüfen, ob wir auf das erste Bild zugreifen, müssen wir prüfen, ob wir auf das letzte Bild zugreifen. Wenn es das letzte Bild ist, muss es vom Ende des Arrays entfernt und ganz am Anfang platziert werden. Wir können dies innerhalb eines if-Abschnitts tun. Wenn der Index plus eins den Bildern oder der Länge entspricht. Der Grund, warum wir dies getan haben, denn denken Sie daran, dass Indexzahlen bei 0 beginnen, aber wenn wir auf die Länge des Arrays zugreifen, ist dies die tatsächliche Zahl. Derzeit ist dies 5, aber die Indexzahl steigt nur auf 4, was bedeutet, dass wir plus 1 müssen. Prüfen Sie, ob dies auch gleich 5 ist. Wenn dies also gleich 5 ist, ist dies unser allerletzter Wert im Array. Wir müssen festlegen, dass dies ganz am Anfang steht. Der Anfang unseres neuen Arrays wird die Indexnummer 0 sein, die wir als aktuelles Bild einstellen können. Ebenso wie wir es getan haben, als wir das allererste Element aus dem Array entfernt haben, müssen wir dieses Mal das allerletzte entfernen , Newarray.pop. Lasst uns das aufheben und das ausprobieren. Rechts sollten wir sehen, wie die Häuser nach oben gezogen sind und der Strand nach links bewegt wird. Gut. Jetzt der See, das Gras, die Elefanten. Das funktioniert jetzt in beide Richtungen völlig einwandfrei. 68. Bild Carousel- Tauschen Bilder: Unsere nächste und letzte Aufgabe für dieses Projekt besteht darin, dem Benutzer zu ermöglichen, auf eines dieser kleinen Miniaturbilder zu klicken , und dann wird dieses durch das Hauptbild oben getauscht . Das kleine Bild wird im großen Bereich platziert und das große Bild wird dann in den Miniaturansichtsbereich fallen. Dafür erstellen wir unsere kleinen Bilder von beliebigen Set-Images Funktion springen in den anderen Abschnitt, wo wir die Klasse von klein hinzufügen. Was wir hier tun werden, ist, dass wir jedem einzelnen einen Event-Listener hinzufügen . Kurz nachdem wir die Klasse hinzugefügt haben. Bevor wir dies an unseren Wrapper anhängen, wählen wir unsere Elemente aus, fügen einen Ereignis-Listener hinzu, bei dem wir den Klick abhören, eine Funktion auslöst, die nur in einem Moment namens SwapImages. Runter nach unten. Unsere Funktion tauscht Bilder aus. Im Inneren haben wir den Ereignis-Listener hinzugefügt , der diese Funktion auslösen wird, jedes Mal, wenn wir auf eines der kleinen Bilder klicken, aber als zusätzlichen Vorsichtsschritt fügen wir eine if-Anweisung hinzu um aus dieser Funktion zurückzukehren, wenn auf das große Bild geklickt wurde. Was wir tun werden, ist, da dies ein Ereignis ist, klicken Sie auf „Ereignis“, wir analysieren die Veranstaltungsinformationen greifen auf die Elemente mit e.target zu. Dann können wir prüfen, ob die ClassList mit einer containts-Methode die Klasse von large enthält . Wenn ja, kehren wir aus dieser Funktion zurück. Dies ist nur zu unserer Vorsichtsmaßnahme. Als Nächstes werden wir die event.target-Informationen verwenden, das eigentliche Bild, auf das geklickt wurde. Alles, was wir tun müssen, ist das Quellattribut zu greifen und herauszufinden, welches dieser Bilder im vorgestellten Bereich platziert werden muss. Wir können dies tun, installieren Sie dies innerhalb einer Konstante namens Imagequelle, setzen Sie dies auf e.target. Wir verwenden getAttribute, wo wir die Quelle abrufen werden. Jetzt haben wir diese Bildquelle, die der Dateipfad ist. Wir können damit die Indexnummer unseres Arrays abrufen. Wir schnappen uns unser Bild-Array. Wir verwenden dann die Methode namens indexOf und analysieren dann unsere Quelle. Also die Bilder, indexOf, wie in unserem Variablennamen , der Bildquelle ist. Dies wird eine Indexnummer zurückgeben, die Sie innerhalb einer Konstante namens SelectedimageIndex speichern können . Was wir jetzt haben, ist die Indexnummer des angeklickten Miniaturbildes. Jetzt müssen wir dies durch das Bild tauschen, das sich an der Indexposition 0 befindet . Aber bevor wir diesen Swap tatsächlich durchführen, müssen wir zuerst speichern, welches Bild sich derzeit in Indexposition 0 befindet . Wir speichern dies in einer Konstante namens FirstImage. Stellen Sie diese beiden Bilder auf Indexnummer 0 ein. Dann können wir das ursprüngliche erste Bild neu zuweisen, sodass die Bilder 0 jetzt den Bildern entsprechen und diesen ausgewählten Bildindex analysieren. Dies ersetzt das erste Bild das angeklickte Miniaturbild, und dann müssen wir das Gegenteil tun, indem wir erneut unsere Bilder im SelectedimageIndex auswählen. Tausche das mit unserem ersten Bild aus. Dies ist ein Grund, warum wir ursprünglich mit FirstImage beginnen , da wir in der nächsten Zeile das erste Bild neu zuweisen. Daher gibt es uns unten den falschen Wert. Am Ende rufen wir unsere SetImages Funktion auf, um den Browser erneut mit der neuen Reihenfolge des Arrays zu aktualisieren. Probieren wir das für das Gras aus. Der Strand fällt auf den Grund, wir versuchen es. Gut. Dies schließt nun unser Image-Karussell-Projekt ab. Ich hoffe, es hat dir gefallen und dabei ein paar neue Tricks gelernt . 69. Folge mir auf Skillshare: Herzlichen Glückwunsch von mir das Ende dieses Kurses erreicht habe. Ich hoffe, es hat dir sehr gut gefallen und etwas Wissen daraus gewonnen. Wenn Ihnen dieser Kurs gefallen hat, schauen Sie sich den Rest meiner Kurse hier auf Skillshare an und folgen Sie mir auch, um Updates zu erhalten und auch neue Kurse informiert zu werden, sobald sie verfügbar sind. Nochmals vielen Dank, viel Glück, und hoffentlich sehen wir uns in einem zukünftigen Kurs wieder.