1. מבוא
מה תפַתחו
ב-Codelab הזה תלמדו איך ליצור אפליקציה של גלריית תמונות של חיות בר באמצעות Angular v14. בסיום המילוי של הבקשה יוצגו סט של תמונות, וגם טופס שליחת הודעה ליצירת קשר עם הצלם וחלון צ'אט שבו אפשר לקבל עובדות מעניינות על בעלי החיים שמופיעים בתמונות.
אתם בונים את כל מה שצריך באפליקציה באמצעות Angular v14 והתכונה החדשה של רכיבים עצמאיים.
כל ההפניות ל-Angular framework ול-Angular CLI משקפות את Angular v14. רכיבים עצמאיים הם תכונת תצוגה מקדימה של Angular v14, ולכן צריך ליצור אפליקציה חדשה לגמרי באמצעות Angular v14. רכיבים עצמאיים מספקים דרך פשוטה לבניית אפליקציות Angular. רכיבים עצמאיים, הנחיות עצמאיות וצינורות עצמאיים נועדו לייעל את חוויית הכתיבה על ידי צמצום הצורך ב-NgModules. רכיבים עצמאיים יכולים לנצל את היתרונות של המערכת האקולוגית הקיימת של ספריות Angular.
זו האפליקציה שאתם בונים היום.

מה תלמדו
- איך משתמשים ב-Angular CLI כדי ליצור פרויקט חדש
- איך משתמשים ברכיבים עצמאיים של Angular כדי לייעל את הפיתוח של אפליקציות Angular
- איך יוצרים רכיב עצמאי, כלומר איך בונים את ממשק המשתמש ומוסיפים לו לוגיקה עסקית
- איך מפעילים אפליקציה באמצעות רכיב עצמאי
- איך מבצעים טעינה עצלה של רכיב עצמאי
- איך מטמיעים דיאלוג בצ'אט ברכיב עצמאי באמצעות Dialogflow Messenger
- איך פורסים אפליקציית Angular ב-Google Cloud App Engine באמצעות Google Cloud CLI (gcloud)
מה צריך
- חשבון Gmail או חשבון Google Workspace
- ידע בסיסי בנושאים הבאים
- HTML. איך יוצרים רכיב
- CSS ו-less. איך משתמשים בסלקטור ב-CSS ויוצרים קובץ הגדרת סגנון.
- TypeScript או JavaScript. איך מבצעים פעולות במבנה ה-DOM.
- git ו-GitHub. איך יוצרים עותק של מאגר ומורידים אותו.
- ממשק שורת פקודה, כמו
bashאוzsh. איך מנווטים בספריות ומריצים פקודות.
2. הגדרת הסביבה
הגדרת הסביבה המקומית
כדי להשלים את ה-codelab הזה, צריך להתקין את התוכנה הבאה במחשב המקומי.
- גרסה של Node.js מסוג active LTS או maintenance LTS. משמש להתקנת מסגרת Angular ו-Angular CLI.
כדי לאמת את הגרסה של Node.js במחשב המקומי, מריצים את הפקודהגרסת הצומת
נתמך על ידי Angular
גרסה 14.15 ואילך
נתמך
גרסה 16.10 ואילך
נתמך
18.1.0
לא נתמך
nodeמחלון שורת הפקודה.node -v
- עורך קוד או סביבת פיתוח משולבת (IDE). משמש לפתיחה ולעריכה של קבצים.Visual Studio Code או עורך קוד אחר לפי בחירתכם.
התקנת Angular CLI
אחרי שמגדירים את כל התלויות, מריצים את הפקודה npm הבאה כדי להתקין את Angular CLI מחלון של שורת פקודה.
npm install --global @angular/cli
כדי לוודא שההגדרה נכונה, מריצים את פקודת Angular הבאה משורת הפקודה.
ng version
אם פקודת Angular מסתיימת בהצלחה, אמורה להתקבל הודעה שדומה לזו שמופיעה בצילום המסך הבא.

קוד מקור ותמונות
אתם יוצרים את כל האפליקציה מאפס, וההדרכה הזו של Codelab עוזרת לכם. חשוב לזכור שהקוד הסופי נמצא במאגר ב-GitHub. אם נתקעתם, כדאי לעיין בקוד הסופי ובתמונות שמוצגות בדף הגלריה.
כדי להוריד את קוד המקור.
- בדפדפן, עוברים לדף הבא.
https://github.com/angular/codelabs/tree/standalone-components - בחלון שורת הפקודה, יוצרים עותק של המאגר ומורידים אותו.
בשלב הבא, בונים את אפליקציית גלריית התמונות.
3. יצירת אפליקציה חדשה
כדי ליצור את אפליקציית המתחילים הראשונית, מבצעים את הפעולות הבאות.
משתמשים ב-Angular CLI כדי ליצור סביבת עבודה חדשה. מידע נוסף על Angular CLI ועל מסגרת Angular זמין באתר angular.io.
יצירת פרויקט חדש
בחלון שורת הפקודה, מבצעים את הפעולות הבאות.
- מזינים את פקודת Angular הבאה כדי ליצור פרויקט Angular חדש בשם
photo-gallery-app.ng new photo-gallery-app
- בכל הנחיה, מאשרים את ברירת המחדל.מסגרת Angular מתקינה את החבילות והרכיבים התלויים הנדרשים. התהליך עשוי להימשך כמה דקות.
אחרי שה-Angular CLI יסיים את הפעולה, יהיה לכם סביבת עבודה חדשה של Angular ואפליקציה פשוטה שמוכנה להרצה.
המבנה של האפליקציה החדשה דומה למבנה של אפליקציית Angular רגילה. ה-NgModule באפליקציה החדשה מיותר בשביל ה-codelab הזה.
הסרת מודול האפליקציה
כדי להסיר את מודול האפליקציה, מבצעים את הפעולה הבאה.
- מנווטים לספרייה
src/appבספריית הפרויקט החדשהphoto-gallery-app. - מוחקים את הקובץ
app.module.ts.
אחרי שמוחקים את מודול האפליקציה, לא נשאר מודול באפליקציה. לאפליקציה יש רק רכיב אחד, שהוא רכיב האפליקציה. צריך להצהיר על הרכיב כרכיב עצמאי.
הצהרה על רכיב עצמאי
בעורך קוד, מבצעים את הפעולות הבאות.
- מנווטים לספרייה
src/appבספריית הפרויקט החדשהphoto-gallery-app. - פותחים את הקובץ
app.component.ts. - מוסיפים את הפרמטר והערך הבאים לרשימת ה-decorators.
קובץstandalone: trueapp.component.tsצריך להיות דומה מאוד לדוגמת הקוד הבאה.import { Component } from '@angular/core'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'], standalone: true }) export class AppComponent { title = 'photo-gallery-app'; } - שומרים את קובץ ה-
app.component.ts.
קומפילציה של האפליקציה החדשה העצמאית
בחלון שורת הפקודה, מבצעים את הפעולות הבאות.
- מנווטים לספריית הפרויקט החדשה
photo-gallery-app - מזינים את פקודת Angular הבאה כדי לקמפל את האפליקציה החדשה.
ng serve
הקומפילציה של האפליקציה תיכשל. אל דאגה, צריך רק לתקן עוד כמה דברים.
שימוש ב-bootstrapApplication API
כדי לאפשר לאפליקציה לפעול בלי NgModule, צריך להשתמש ברכיב עצמאי כרכיב הבסיס באמצעות bootstrapApplication API.
הסרת הפניות למודול האפליקציה
בעורך קוד, מבצעים את הפעולות הבאות.
- מנווטים לספרייה
srcבספריית הפרויקט החדשהphoto-gallery-app - פותחים את הקובץ
main.ts. - צריך להסיר את קוד הייבוא הבא, כי אין לך יותר מודול של אפליקציה.
import { AppModule } from './app/app.module'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - מסירים את קוד ה-bootstrap הבא, כי אין יותר מודול אפליקציה.
קובץplatformBrowserDynamic().bootstrapModule(AppModule) .catch(err => console.error(err));main.tsצריך להיות זהה לדוגמת הקוד הבאה.import { enableProdMode } from '@angular/core'; import { environment } from './environments/environment'; if (environment.production) { enableProdMode(); }
הוספת הרכיב bootstrapApplication
בעורך קוד, מבצעים את הפעולות הבאות.
- מנווטים לספרייה
srcבספריית הפרויקט החדשהphoto-gallery-app. - פותחים את הקובץ
main.ts. - מייבאים את הרכיב
bootstrapApplicationמהשירות@angular/platform-browser.import { bootstrapApplication } from '@angular/platform-browser'; - מוסיפים את הקוד הבא כדי להפעיל את האפליקציה.
bootstrapApplication(AppComponent).catch(err => console.error(err)); - מייבאים את הרכיב ואת הספריות הנדרשות.
קובץimport { AppComponent } from './app/app.component';main.tsצריך להיות זהה לדוגמת הקוד הבאה.import { enableProdMode } from '@angular/core'; import { bootstrapApplication } from '@angular/platform-browser'; import { AppComponent } from './app/app.component'; import { environment } from './environments/environment'; if (environment.production) { enableProdMode(); } bootstrapApplication(AppComponent).catch(err => console.error(err));
הוספת נתב ומודולים נפוצים
כדי להשתמש ב-Router ובתכונות נפוצות אחרות של מודולים, צריך לייבא כל מודול ישירות לרכיב.
בעורך קוד, מבצעים את הפעולות הבאות.
- מנווטים לספרייה
src/appבספריית הפרויקט החדשהphoto-gallery-app. - פותחים את הקובץ
app.component.ts. - מייבאים את המודולים הנדרשים לרכיב.
import { CommonModule } from '@angular/common'; import { RouterModule } from '@angular/router'; - מוסיפים את הייבוא לרכיב.
קובץimports: [CommonModule, RouterModule],app.component.tsצריך להיות זהה לדוגמת הקוד הבאה.import { Component } from '@angular/core'; import { CommonModule } from '@angular/common'; import { RouterModule } from '@angular/router'; @Component({ selector: 'app-root', imports: [CommonModule, RouterModule], templateUrl: './app.component.html', styleUrls: ['./app.component.css'], standalone: true }) export class AppComponent { title = 'photo-gallery-app'; } - שומרים את קובץ ה-
app.component.ts.
קומפילציה והרצה של האפליקציה החדשה העצמאית
בחלון שורת הפקודה, מבצעים את הפעולות הבאות.
- מנווטים לספריית הפרויקט החדשה
photo-gallery-app. - מזינים את פקודת Angular הבאה כדי לקמפל ולהריץ את האפליקציה ולפתוח שרת אינטרנט. יכול להיות שתצטרכו לסגור את סביבת הפיתוח המשולבת לפני שתריצו את האפליקציה כדי להסיר שגיאות קומפילציה.
ng serve
שרת הפיתוח צריך לפעול ביציאה 4200. כל השגיאות הקודמות אמורות להיעלם והקומפילציה אמורה להצליח. כל הכבוד. יצרתם בהצלחה אפליקציית Angular שפועלת בלי מודול ועם רכיב עצמאי.
- בשלב הבא, נשפר את האפליקציה כדי להציג כמה תמונות.
4. הצגת התמונות
האפליקציה החדשה שלך מיועדת להיות גלריית תמונות, והיא אמורה להציג תמונות.
רכיבים הם אבני הבניין העיקריות של אפליקציות Angular. לרכיבים יש 3 היבטים עיקריים.
- קובץ HTML לתבנית
- קובץ CSS לסגנונות
- קובץ TypeScript להתנהגות האפליקציה
מעבירים את התמונות לאפליקציה
התמונות מופיעות באפליקציה שהורדתם בעבר מ-GitHub.
- מנווטים לספרייה
src/assetsשל פרויקט GitHub. - מעתיקים את הקבצים ומדביקים אותם בספרייה
analogueבספריית הפרויקטphoto-gallery-app.
יצירת תבנית HTML
קובץ app.component.html הוא קובץ תבנית HTML שמשויך לרכיב AppComponent.
בעורך קוד, מבצעים את הפעולות הבאות.
- מנווטים לספרייה
src/appבספריית הפרויקט החדשהphoto-gallery-app. - פותחים את הקובץ
app.component.html. - מוחקים את כל קוד ה-HTML הקיים.
- מעתיקים ומדביקים את קוד ה-HTML מדוגמת הקוד הבאה.
<article> <h1>Above and below the Ocean</h1> <h2>A taste of the Australia and Galapagos Wildlife, meet my friends!</h2> <section> <section class="row"> <div class="column"> <img src="/assets/49412593648_8cc3277a9c_c.jpg"> <img src="/assets/49413271167_22a504c3fa_w.jpg"> <img src="/assets/47099018614_5a68c0195a_w.jpg"> </div> <div class="column"> <img src="/assets/41617221114_4d5473251c_w.jpg"> <img src="/assets/47734160411_f2b6ff8139_w.jpg"> <img src="/assets/46972303215_793d32957f_c.jpg"> </div> <div class="column"> <img src="/assets/45811905264_be30a7ded6_w.jpg"> <img src="/assets/44718289960_e83c98af2b_w.jpg"> <img src="/assets/46025678804_fb8c47a786_w.jpg"> </div> </section> </section> </article - שומרים את קובץ ה-
app.component.html.
יצירת קובץ הגדרת הסגנון
בעורך קוד, מבצעים את הפעולות הבאות.
- מנווטים לספרייה
srcבספריית הפרויקט החדשהphoto-gallery-app. - פותחים את הקובץ
styles.css. - מעתיקים ומדביקים את ה-CSS מדוגמת הקוד הבאה.
article { display: flex; justify-content: center; align-items: center; flex-direction: column; font-family: 'Raleway'; } h1 { color: #4479BA; text-align: center; font-size: xx-large; } h2 { color: rgb(121, 111, 110); text-align: center; } .row { display: flex; flex-wrap: wrap; padding: 0 4px; } /* Create four equal columns that sits next to each other */ .column { flex: 25%; padding: 0 4px; } .column img { margin-top: 8px; vertical-align: middle; width: 100%; } .link_button { -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; border: solid 1px #20538D; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.4), 0 1px 1px rgba(0, 0, 0, 0.2); -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.4), 0 1px 1px rgba(0, 0, 0, 0.2); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.4), 0 1px 1px rgba(0, 0, 0, 0.2); background: #4479BA; color: #FFF; padding: 8px 12px; text-decoration: none; margin-top: 50px; font-size: large; } @media screen and (max-width: 800px) { .column { flex: 50%; max-width: 50%; } } @media screen and (max-width: 600px) { .column { flex: 100%; max-width: 100%; } } - שמירת קובץ
styles.css
עדכון קובץ האינדקס
בעורך קוד, מבצעים את הפעולות הבאות.
- מנווטים לספרייה
srcבספריית הפרויקט החדשהphoto-gallery-app. - פותחים את הקובץ
index.html. - מוסיפים את הגופן
Ralewayכדי שכל הדפים יירשו אותו.<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Raleway"> - שומרים את קובץ ה-
index.html. - שומרים את הקוד ובודקים בדפדפן. כשהשרת לפיתוח פועל, השינויים משתקפים בדפדפן כששומרים.
- בשלב הבא, תיצרו רכיב עצמאי חדש כדי לשלוח משוב ולשוחח עם ג'ימבו. כדאי להמשיך ב-Codelab הזה כדי לקבל מידע נוסף על Jimbo.
5. הוספת רכיב עצמאי חדש
כפי שראיתם עד עכשיו, רכיבים עצמאיים מספקים דרך פשוטה לבניית אפליקציות Angular, כי הם מצמצמים את הצורך ב-NgModules. בקטעים הבאים יוצרים רכיב עצמאי חדש שמאפשר למשתמש לשלוח משוב ולנהל שיחה עם נציג וירטואלי.
יצירת רכיב עצמאי חדש
כדי ליצור את הרכיב החדש הזה, משתמשים שוב ב-Angular CLI.
בחלון שורת הפקודה, מבצעים את הפעולות הבאות.
- מנווטים לספריית הפרויקט החדשה
photo-gallery-app. - מזינים את פקודת Angular הבאה כדי ליצור רכיב חדש בשם
feedback-and-chat. בטבלה הבאה מתוארים חלקי הפקודה.ng generate component feedback-and-chat --standalone
חלק
פרטים
ngהגדרת כל הפקודות של Angular CLI עבור מסגרת Angular
generate componentיוצר את התשתית לרכיב חדש
feedback-and-chatשם הרכיב
--standaloneהפקודה הזו אומרת למסגרת Angular ליצור רכיב עצמאי
ייבוא של רכיב חדש עצמאי
כדי להשתמש ברכיב החדש העצמאי, צריך קודם להוסיף אותו למערך imports בקובץ app.components.ts.
זהו רכיב עצמאי, ולכן צריך לייבא אותו כמו מודול.
בעורך קוד, מבצעים את הפעולות הבאות.
- מנווטים לספרייה
src/appבספריית הפרויקט החדשהphoto-gallery-app. - פותחים את הקובץ
app.component.ts. - מייבאים את הרכיב העצמאי החדש.
import { FeedbackAndChatComponent } from './feedback-and-chat/feedback-and-chat.component'; - מעדכנים את הייבוא ברכיב.
קובץimports: [CommonModule, RouterModule, FeedbackAndChatComponent],app.component.tsצריך להיות זהה לדוגמת הקוד הבאה.import { CommonModule } from '@angular/common'; import { Component } from '@angular/core'; import { RouterModule } from '@angular/router'; import { FeedbackAndChatComponent } from './feedback-and-chat/feedback-and-chat.component'; @Component({ selector: 'app-root', imports: [CommonModule, RouterModule, FeedbackAndChatComponent], templateUrl: './app.component.html', styleUrls: ['./app.component.css'], standalone: true }) export class AppComponent { title = 'photo-gallery-app'; } - שומרים את קובץ ה-
app.component.ts.
טעינה מדורגת של הרכיב
מעבר מפרדיגמה של טעינה מוקדמת לפרדיגמה של טעינה עצלה, שבה הקוד לא נשלח ללקוח עד שצריך אותו. טעינה עצלה היא גישה מצוינת לקיצור זמן הטעינה של דף, לשיפור הביצועים ולשיפור חוויית המשתמש. הנתב מטפל בטעינה העצלנית, שזהה לרכיב ngModule ולרכיב עצמאי.
עדכון תבנית ה-HTML שמשויכת לרכיב האפליקציה
כדי לבצע טעינה עצלה של הרכיב העצמאי, מוסיפים לחצן לממשק המשתמש שמפעיל את הרכיב רק כשמשתמש בוחר בו.
בעורך קוד, מבצעים את הפעולות הבאות.
- מנווטים לספרייה
src/appבספריית הפרויקט החדשהphoto-gallery-app. - פותחים את הקובץ
app.component.html. - גוללים לסוף הקובץ ומוסיפים את קוד הדוגמה הבא לפני שסוגרים את הרכיב
article.<a class="link_button" routerLink="feedback-and-chat">Find out more about these guys!</a> <router-outlet></router-outlet> - קובץ
app.component.htmlצריך להיות זהה לדוגמת הקוד הבאה.<article> <h1>Above and below the Ocean</h1> <h2>A taste of the Australia and Galapagos Wildlife, meet my friends!</h2> <section> <section class="row"> <div class="column"> <img src="/assets/49412593648_8cc3277a9c_c.jpg"> <img src="/assets/49413271167_22a504c3fa_w.jpg"> <img src="/assets/47099018614_5a68c0195a_w.jpg"> </div> <div class="column"> <img src="/assets/41617221114_4d5473251c_w.jpg"> <img src="/assets/47734160411_f2b6ff8139_w.jpg"> <img src="/assets/46972303215_793d32957f_c.jpg"> </div> <div class="column"> <img src="/assets/45811905264_be30a7ded6_w.jpg"> <img src="/assets/44718289960_e83c98af2b_w.jpg"> <img src="/assets/46025678804_fb8c47a786_w.jpg"> </div> </section> </section> <a class="link_button" routerLink="feedback-and-chat">Find out more about these guys!</a> <router-outlet></router-outlet> </article> - שומרים את קובץ ה-
app.component.html.
הגדרת המסלולים
בעורך קוד, מבצעים את הפעולות הבאות.
- מנווטים לספרייה
srcבספריית הפרויקט החדשהphoto-gallery-app. - פתיחת הקובץ
main.ts - מייבאים את השיטה
provideRouterואת המודול Routes. ב-Angular גרסה 14.2.0 נוספה שיטה חדשה בשם provideRouter, שמאפשרת להגדיר קבוצה של מסלולים לאפליקציה.import { provideRouter, Routes } from '@angular/router'; - מעתיקים את קטע הקוד הבא ומדביקים אותו בין שורות הייבוא לבין ההצהרה
if.const routes = [ { path: 'feedback-and-chat', loadComponent: () => import('./app/feedback-and-chat/feedback-and-chat.component').then(c => c.FeedbackAndChatComponent), } ] - מעתיקים ומדביקים את קטע הקוד הבא ומחליפים את השיטה
bootstrapApplication. קובץbootstrapApplication(AppComponent, { providers: [ provideRouter(routes) ] }).catch(err => console.error(err));main.tsצריך להיות זהה לדוגמת הקוד הבאה.import { enableProdMode } from '@angular/core'; import { bootstrapApplication } from '@angular/platform-browser'; import { provideRouter, Routes } from '@angular/router'; import { AppComponent } from './app/app.component'; import { environment } from './environments/environment'; const routes = [ { path: 'feedback-and-chat', loadComponent: () => import('./app/feedback-and-chat/feedback-and-chat.component').then(c => c.FeedbackAndChatComponent), } ] if (environment.production) { enableProdMode(); } bootstrapApplication(AppComponent, { providers: [ provideRouter(routes) ] }).catch(err => console.error(err)); - שומרים את קובץ ה-
main.ts.
קומפילציה ובדיקה באמצעות הכלים למפתחים ב-Chrome
משתמשים בכלים למפתחים ב-Chrome כדי לבדוק איך רכיב Angular נטען באופן עצלני.
בחלון שורת הפקודה, מבצעים את הפעולות הבאות.
- מנווטים לספריית הפרויקט החדשה
photo-gallery-app. - מזינים את פקודת Angular הבאה כדי לקמפל ולהריץ את האפליקציה ולפתוח שרת אינטרנט.
שרת הפיתוח צריך לפעול ביציאהng serve
4200.
בדפדפן, מבצעים את הפעולות הבאות.
- עוברים לדף הבא.
http://localhost:4200 - פותחים את הכלים למפתחים ב-Chrome ובוחרים בכרטיסייה רשת.
- מרעננים את הדף כדי להציג כמה קבצים, אבל לא את הרכיב
feedback-and-chat.המסך אמור להיראות כמו צילום המסך הבא.
- לוחצים על הלחצן Find out more about these guys! כדי לעבור לרכיב העצמאי.ביומן אמור להופיע שהרכיב נטען רק כשמגיעים לנתב המלא. גוללים לתחתית הרשימה כדי לבדוק שהרכיב נטען. המסך שלכם אמור להיראות כמו צילום המסך הבא.

6. הוספת ממשק המשתמש לטופס
בטופס לשליחת משוב יש שלושה שדות קלט בממשק המשתמש וכפתור בתחתית. שלושת שדות הקלט בממשק המשתמש הם שם מלא, כתובת האימייל של השולח והערות.
כדי לתמוך בממשק המשתמש, מוסיפים מאפיין formControlName ברכיב input שקושר לכל רכיב בקרה של טופס contactForm שמשויך לכל אחד משלושת שדות הקלט בממשק המשתמש.
הוספת הטופס לתבנית ה-HTML
מוסיפים טופס לממשק המשתמש כדי לאפשר למשתמש לשלוח משוב.
בעורך הקוד, מבצעים את הפעולות הבאות.
- עוברים לקובץ
feedback-and-chat.component.html. - מסירים את ה-HTML הקיים.
- מעתיקים ומדביקים את קוד ה-HTML מדוגמת הקוד הבאה.
<article> <h2>Send me a message or use the chat below to learn some cool facts of the animals in the photos</h2> <section class="container"> <form ngNativeValidate [formGroup]="contactForm" (ngSubmit)="onSubmit()"> <div class="row" *ngIf="showMsg"> <div class="row"> <p> <strong>Thanks for your message!</strong> </p> </div> </div> <div class="row"> <div class="col-25"> <label for="name">Full Name</label> </div> <div class="col-75"> <input type="text" id="fname" placeholder="Your name.." formControlName="fullname" required> </div> </div> <div class="row"> <div class="col-25"> <label for="lemail">Email</label> </div> <div class="col-75"> <input type="text" id="lemail" placeholder="Your email.." formControlName="email" required> </div> </div> <div class="row"> <div class="col-25"> <label for="comments">Comments</label> </div> <div class="col-75"> <textarea id="subject" formControlName="comments" placeholder="Write something.." style="height:200px" required></textarea> </div> </div> <div class="row"> <button type="submit" class="submit">Submit</button> </div> </form> </section> </article> - שומרים את קובץ ה-
feedback-and-chat.component.html.
עדכון קובץ הסגנונות של הטופס
בעורך הקוד, מבצעים את הפעולות הבאות.
- עוברים לקובץ
feedback-and-chat.component.css. - מעתיקים ומדביקים את ה-CSS מדוגמת הקוד הבאה.
/* Style inputs, select elements and textareas */ input[type=text], select, textarea{ width: 100%; padding: 12px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; resize: vertical; } /* Style the label to display next to the inputs */ label { padding: 12px 12px 12px 0; display: inline-block; } /* Style the submit button */ button { background-color: #4479BA; color: white; padding: 12px 20px; border: none; border-radius: 4px; cursor: pointer; float: right; font-size: medium; font-family: 'Raleway'; } /* Style the container */ .container { border-radius: 5px; background-color: #f2f2f2; padding: 20px; width: 100%; } /* Floating column for labels: 25% width */ .col-25 { float: left; width: 25%; margin-top: 6px; } /* Floating column for inputs: 75% width */ .col-75 { float: left; width: 75%; margin-top: 6px; } /* Clear floats after the columns */ .row:after { content: ""; display: table; clear: both; } /* Responsive layout - when the screen is less than 600px wide, make the two columns stack on top of each other instead of next to each other */ @media screen and (max-width: 600px) { .col-25, .col-75, input[type=submit] { width: 100%; margin-top: 0; } } - שומרים את קובץ ה-
feedback-and-chat.component.css.
קומפילציה של עדכון ממשק המשתמש של הטופס
בחלון שורת הפקודה, מבצעים את הפעולות הבאות.
- מנווטים לספריית הפרויקט החדשה
photo-gallery-app. - מזינים את פקודת Angular הבאה כדי לקמפל ולהריץ את האפליקציה ולפתוח שרת אינטרנט.
הקומפילציה של האפליקציה שלך אמורה להיכשל. אל דאגה, צריך לקשר את הטופס.ng serve
- בשלב הזה, כדאי לבדוק את הפריטים הבאים.
- משתמשים בקשירת המאפיין
formGroupכדי לקשור אתcontactFormלרכיבformואת קשירת האירועngSubmit - ההנחיה
FormGroupמקשיבה לאירוע השליחה שמופק על ידי הרכיבform. לאחר מכן, ההנחיהFormGroupשולחת אירועngSubmitשאפשר לקשר לפונקציית הקריאה החוזרתonSubmit. - בשלב מאוחר יותר, מטמיעים את פונקציית הקריאה החוזרת
onSubmitבקובץfeedback-and-chat.component.ts.
- משתמשים בקשירת המאפיין
- בשלב הבא, תקשרו את הטופס.
7. הוספת טיפול באירועים לטופס
ממשק המשתמש של טופס שליחת משוב הושלם, אבל חסרה בו האינטראקציה. טיפול בקלט של משתמשים באמצעות טפסים הוא אבן הפינה של הרבה אפליקציות נפוצות.
בתרחיש אמיתי, צריך להטמיע לוגיקה עסקית כדי לבצע את הפעולות הבאות.
- ניתוח קלט של משתמשים ממבנה ה-DOM שעבר רינדור ומשויך לרכיב.
- מאמתים את קלט של משתמשים, כולל captcha או מנגנון דומה כדי למנוע הפצת ספאם מבוטים.
- שליחת אימייל לכתובת אימייל ייעודית.
- להציג למשתמש הודעה ידידותית.
ב-codelab הזה מטמיעים רק את הפעולות הבאות.
- ניתוח קלט של משתמשים ממבנה ה-DOM שעבר רינדור ומשויך לרכיב.
- להציג למשתמש הודעה ידידותית.
כדאי לנסות את כל ארבע הפעולות כדי לשפר את הכישורים שלכם.
הוספת המודל של טופס שליחת ההודעה לרכיב
יוצרים את המודל של טופס שליחת המשוב ומוסיפים אותו למחלקת הרכיב. מודל הטופס קובע את הסטטוס של הטופס. שירות FormBuilder מספק שיטות נוחות ליצירת רכיב אינטראקטיבי.
בעורך הקוד, מבצעים את הפעולות הבאות.
- עוברים לקובץ
feedback-and-chat.component.ts. - מייבאים את השירות
FormBuilderואת המודולReactiveModuleמהחבילה@angular/forms. השירות הזה מספק שיטות נוחות ליצירת אמצעי בקרה. בשלב הבא נשתמש בפונקציהinject, ולכן נצטרך לייבא אותה גם מ-@angular/core.import { Component, inject, OnInit } from '@angular/core'; import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; - מייבאים את המודול
ReactiveFormsModule.imports: [CommonModule,ReactiveFormsModule], - מסירים את ה-constructor הבא.
constructor() { } - מזריקים את השירות
FormBuilderדרך הפונקציהinjectממש מתחת לחתימת המחלקה. משתמשים בשיטהprivate formBuilder = inject(FormBuilder);groupמהשירותFormBuilderכדי ליצור מודל של טופס ולאסוף את השם, כתובת האימייל וההערות של המשתמש. - יוצרים את הנכס החדש
contactFormומשתמשים בשיטהgroupכדי להגדיר אותו למודל של טופס.מודל הטופס מכיל את השדותname,emailו-comments. מגדירים שיטהcontactForm = this.formBuilder.group({ fullname: '', email: '', comments: '' });onSubmitלטיפול בטופס.בתרחיש אמיתי, השיטהonSubmitמאפשרת למשתמש לשלוח הודעת משוב לצלם באמצעות הודעת אימייל שנשלחת לכתובת אימייל ייעודית.ב-codelab הזה, מציגים את קלט המשתמש, משתמשים בשיטהresetכדי לאפס את הטופס ומציגים הודעת הצלחה ידידותית למשתמש. - מוסיפים את השיטה החדשה
onSubmitומגדירים את המשתנהshowMsgלערךtrueאחרי האתחול שלו. קובץshowMsg: boolean = false; onSubmit(): void { console.log('Your feedback has been submitted', this.contactForm.value); this.showMsg = true; this.contactForm.reset(); }feedback-and-chat.component.tsצריך להיות זהה לדוגמת הקוד הבאה.import { Component, inject, OnInit } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; @Component({ selector: 'app-feedback-and-chat', standalone: true, imports: [CommonModule, ReactiveFormsModule], templateUrl: './feedback-and-chat.component.html', styleUrls: ['./feedback-and-chat.component.css'] }) export class FeedbackAndChatComponent { showMsg: boolean = false; private formBuilder = inject(FormBuilder); contactForm = this.formBuilder.group({ fullname: '', email: '', comments: '' }); ngOnInit(): void { } onSubmit(): void { console.log('Your feedback has been submitted', this.contactForm.value); this.showMsg = true; this.contactForm.reset(); } } - שומרים את קובץ ה-
feedback-and-chat.component.ts.
איך אוספים ומציגים את המודל של טופס המשוב
בחלון שורת הפקודה, מבצעים את הפעולות הבאות.
- מנווטים לספריית הפרויקט החדשה
photo-gallery-app. - מזינים את פקודת Angular הבאה כדי לקמפל ולהריץ את האפליקציה ולפתוח שרת אינטרנט.
ng serve
- שרת הפיתוח צריך לפעול ביציאה
4200.
בדפדפן, מבצעים את הפעולות הבאות.
- עוברים לדף הבא.
http://localhost:4200 - פותחים את הכלים למפתחים ב-Chrome ובוחרים בכרטיסייה מסוף.
- מזינים ערכים בתיבות הטקסט שם מלא, אימייל והערות.
- לוחצים על הלחצן שליחה.אמורה להופיע הודעה על הצלחת הפעולה בדף.
- מוודאים שהערכים מוצגים בכרטיסייה Console.המסך צריך להיות זהה לצילום המסך הבא.
הטמעתם בהצלחה את הקוד כדי להוסיף טופס send message לממשק המשתמש של הרכיב ולנתח את קלט המשתמש. - בשלב הבא, מטמיעים דיאלוג צ'אט כדי לאפשר למבקרים באפליקציה לדבר עם Jimbo. ג'ימבו הוא קואלה שממנו אפשר ללמוד עובדות מגניבות על חיות בר.
8. הוספת דו-שיח בצ'אט
ניסיון בשימוש בממשקי צ'אט, כמו Dialogflow CX או פלטפורמות דומות. נציג אוטומטי של Dialogflow CX הוא נציג וירטואלי שמטפל בשיחות מקבילות עם בני אדם. זהו מודול להבנת שפה טבעית שמזהה את הניואנסים של השפה האנושית ומתרגם טקסט או אודיו של משתמשי קצה במהלך שיחה לנתונים מובנים שאפליקציות ושירותים יכולים להבין.
כבר נוצר בשבילכם נציג וירטואלי לדוגמה. במעבדה הזו, תצטרכו להוסיף דיאלוג צ'אט לרכיב העצמאי כדי לאפשר למשתמשי האפליקציה לקיים אינטראקציה עם הבוט. כדי לעמוד בדרישה הזו, תשתמשו ב-Dialogflow Messenger, שילוב מוכן מראש שמספק חלון דו-שיח שניתן להתאמה אישית. כשפותחים את תיבת הדו-שיח של הצ'אט, היא מופיעה בצד שמאל למטה של המסך ומפעילה את כוונת הפתיחה שמוגדרת כברירת מחדל לסוכן. הבוט מברך את המשתמש ומתחיל שיחה.
ההטמעה הבאה משתפת עם המשתמש עובדות מעניינות על חיות בר. הטמעות אחרות של סוכנים וירטואליים יכולות לתת מענה לתרחישי שימוש מורכבים של לקוחות (כמו נציג אנושי במוקד טלפוני). חברות רבות משתמשות בנציג וירטואלי כערוץ התקשורת העיקרי עם אתר החברה.
הוספת Dialogflow Messenger לרכיב
בדומה לטופס, תיבת הדו-שיח של הצ'אט צריכה להופיע רק כשהרכיב העצמאי נטען.
בעורך הקוד, מבצעים את הפעולות הבאות.
- עוברים לקובץ
feedback-and-chat.component.ts. - מעתיקים את הרכיב
df-messengerשבדוגמת הקוד הבאה ומדביקים אותו בכל מקום בדף. מערכת Dialogflow יוצרת את המאפיינים של הרכיב<df-messenger agent-id="762af666-79f7-4527-86c5-9ca06f72c317" chat-title="Chat with Jimbo!" df-cx="true" intent="messanger-welcome-event" language-code="en" location="us-central1"></df-messenger>df-messengerכשבוחרים בשילוב של Dialogflow Messenger.מאפיין
פרטים
agent-id
מאוכלס מראש. מציין את המזהה הייחודי של נציג Dialogflow.
chat-title
מאוכלס מראש. מציינים את התוכן שיוצג בחלק העליון של תיבת הדו-שיח של הצ'אט. השם הזה מאוכלס מראש בשם הסוכן, אבל מומלץ להתאים אותו אישית.
df-cx
מציין שהאינטראקציה היא עם נציג CX. מגדירים את הערך כ-
true.Intent
מציין את האירוע המותאם אישית שמשמש להפעלת הכוונה הראשונה כשתיבת הדו-שיח של הצ'אט נפתחת.
language-code
מציין את קוד שפת ברירת המחדל עבור הכוונה הראשונה.
location
מציינים את האזור שבו פורסים את הסוכן.
- שומרים את קובץ ה-
feedback-and-chat.component.ts.
הצגת טופס לדוגמה לשליחת משוב
בחלון שורת הפקודה, מבצעים את הפעולות הבאות.
- מנווטים לספריית הפרויקט החדשה
photo-gallery-app. - מזינים את פקודת Angular הבאה כדי לקמפל את האפליקציה.
הקומפילציה של האפליקציה שלך אמורה להיכשל. שורת הפקודה אמורה להציג את הודעת השגיאה הבאה.ng serve

- לאחר מכן מוסיפים סכימה מותאמת אישית.
הוספת סכימה מותאמת אישית לרכיב עצמאי
הרכיב df-messanger הוא לא רכיב מוכר. זהו רכיב אינטרנט בהתאמה אישית. הודעת השגיאה מ-Angular framework מצביעה על כך שצריך להוסיף CUSTOM_ELEMENTS_SCHEMA לשני הרכיבים העצמאיים כדי להסתיר את ההודעה.
בעורך הקוד, מבצעים את הפעולות הבאות.
- עוברים לקובץ
feedback-and-chat.component.ts. - מייבאים את הסכימה של
CUSTOM_ELEMENTS_SCHEMA.import { Component, CUSTOM_ELEMENTS_SCHEMA, inject, OnInit } from '@angular/core'; - מוסיפים את
CUSTOM_ELEMENTS_SCHEMAלרשימת הסכימות. קובץschemas: [CUSTOM_ELEMENTS_SCHEMA]feedback-and-chat.component.tsצריך להיות זהה לדוגמת הקוד הבאה.import { Component, CUSTOM_ELEMENTS_SCHEMA, inject, OnInit } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; @Component({ selector: 'app-feedback-and-chat', standalone: true, imports: [CommonModule,ReactiveFormsModule], templateUrl: './feedback-and-chat.component.html', styleUrls: ['./feedback-and-chat.component.css'], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) ... - רכיב האינטרנט df-messanger דורש JavaScript שצריך להוסיף אותו רק כשמרכיב המשוב והצ'אט נטען. לשם כך, נוסיף את הקוד הרלוונטי לשיטה ngOnInit(), שתטען את סקריפט הצ'אט שנדרש להפעלת הרכיב
.ngOnInit() { // Load the chat script, which activates the `<df-messenger>` element. const script = document.createElement('script'); script.async = true; script.src = 'https://www.gstatic.com/dialogflow-console/fast/messenger-cx/bootstrap.js?v=1'; document.head.appendChild(script); } - שומרים את קובץ ה-
feedback-and-chat.component.ts.
הידור והצגה של תיבת הדו-שיח המעודכנת של הצ'אט
בחלון שורת הפקודה, מבצעים את הפעולות הבאות.
- מנווטים לספריית הפרויקט החדשה
photo-gallery-app. - מזינים את פקודת Angular הבאה כדי לקמפל ולהריץ את האפליקציה ולפתוח שרת אינטרנט.
שרת הפיתוח צריך לפעול ביציאהng serve
4200.
בדפדפן, מבצעים את הפעולות הבאות.
- עוברים לדף הבא.
סמל הצ'אט אמור להופיע בחלק התחתון של הדף.http://localhost:4200 - לוחצים על הסמל ומקיימים אינטראקציה עם ג'ימבו.ג'ימבו מספק עובדות מעניינות על בעלי חיים.

- האפליקציה פועלת באופן מלא.
9. פריסת האפליקציה ב-Google App Engine
האפליקציה פועלת באופן מקומי במחשב. בשלב הבא והאחרון של ה-codelab הזה, תצטרכו לפרוס את האפליקציה ב-Google App Engine.
מידע נוסף על Google App Engine זמין במאמר App Engine.
הגדרת הסביבה ל-Google App Engine
אם אתם כבר עומדים בכל התנאים הבאים, אתם יכולים לדלג על השלבים הבאים ולהמשיך לפריסת האפליקציה.
- יצירת פרויקט בענן עם App Engine
- הפעלתם את Cloud Build API
- התקנתם את Google Cloud CLI
צריך לבצע את הפעולות הבאות.
- נכנסים לחשבון Gmail או לחשבון Google Workspace. אם אין לכם חשבון, צרו חשבון Google.
- כדי להשתמש במשאבי Cloud ובממשקי API של Cloud, צריך להפעיל את החיוב ב-Cloud Console. מידע נוסף זמין במאמר יצירה, שינוי וסגירה של חשבון לחיוב ב-Cloud בניהול עצמי.
- יוצרים פרויקט ב-Google Cloud כדי לאחסן את משאבי אפליקציית App Engine ומשאבים אחרים ב-Google Cloud. מידע נוסף זמין במאמר יצירה וניהול של פרויקטים.
- מפעילים את Cloud Build API במסוף Cloud. מידע נוסף מופיע במאמר הפעלת גישה ל-API.
- מתקינים את Google Cloud CLI ואת כלי שורת הפקודה של Google Cloud. למידע נוסף, אפשר לקרוא את המאמר בנושא התקנת ה-CLI של gcloud.
- מפעילים את Google Cloud CLI ומוודאים שה-CLI של gcloud מוגדר לשימוש בפרויקט Google Cloud שבו רוצים לבצע פריסה. מידע נוסף זמין במאמר אתחול ה-CLI של gcloud.
פיתוח אפליקציה נפרדת
בחלון שורת הפקודה, מבצעים את הפעולות הבאות.
- מנווטים לספריית הפרויקט החדשה
photo-gallery-app. - מזינים את פקודת Angular הבאה כדי לקמפל וליצור גרסה של האפליקציה שמוכנה לייצור.
ng build
הגרסה של האפליקציה שמוכנה לייצור נוצרת בספריית המשנה dist של ספריית הפרויקט photo-gallery-app.
10. פריסת האפליקציה באמצעות מסגרת Express.js
קוד לדוגמה ב-Codelab הזה משתמש ב-framework Express.js כדי לטפל בבקשות HTTP. אתם יכולים להשתמש ב-framework האינטרנטי המועדף עליכם.
התקנה של Express.js framework
בחלון שורת הפקודה, מבצעים את הפעולה הבאה.
- מזינים את הפקודה הבאה כדי להתקין את המסגרת Express.js.
npm install express --save
הגדרת שרת האינטרנט
בעורך הקוד, מבצעים את הפעולות הבאות.
- מנווטים לספריית הפרויקט החדשה
photo-gallery-app. - יוצרים קובץ
server.jsחדש. - מעתיקים ומדביקים את הקוד הבא.
const express = require("express"); const path = require("path"); // Running PORT is set automatically by App Engine const port = process.env.PORT || 3000; const app = express(); const publicPath = path.join(__dirname, "/dist/photo-gallery-app"); app.use(express.static(publicPath)); app.get("*", (req, res) => { res.sendFile(path.join(__dirname + "/dist/photo-gallery-app/index.html")); }); app.listen(port, () => { console.log(`Server is up on ${port}`); }); - שומרים את קובץ ה-
server.js.
צירוף שרת האינטרנט
בעורך הקוד, מבצעים את הפעולות הבאות.
- מנווטים לספריית הפרויקט החדשה
photo-gallery-app. - פותחים את הקובץ
package.json. - משנים את פקודת ההתחלה כדי להריץ את הצומת בקובץ
server.js. המאפיין"name": "photo-gallery-app", "version": "0.0.0", "scripts": { "ng": "ng", "start": "node server.js", "build": "ng build", "watch": "ng build --watch --configuration development", "test": "ng test" },startהוא נקודת הכניסה לאפליקציה. - שומרים את קובץ ה-
package.json.
הגדרת App Engine
בעורך הקוד, מבצעים את הפעולות הבאות.
- מנווטים לספריית הפרויקט החדשה
photo-gallery-app. - יוצרים קובץ
app.yamlחדש. - מעתיקים ומדביקים את הקוד הבא.
המידע בקובץruntime: nodejs16 service: defaultapp.yamlמציין את ההגדרה של App Engine. צריך לציין רק את זמן הריצה והשירות. - שומרים את קובץ ה-
app.yaml.
עדכון רשימת קטעי הקוד להתעלמות של gcloud
כדי לוודא שהספרייה node_modules לא תועלה, יוצרים קובץ .gcloudignore. הקבצים שמופיעים בקובץ .gcloudignore לא מועלים.
בעורך הקוד, מבצעים את הפעולות הבאות.
- מנווטים לספריית הפרויקט החדשה
photo-gallery-app. - יוצרים קובץ
.gcloudignoreחדש. - מעתיקים ומדביקים את הקוד הבא.
# This file specifies files that are *not* uploaded to Google Cloud # using gcloud. It follows the same syntax as .gitignore, with the addition of # "#!include" directives (which insert the entries of the given .gitignore-style # file at that point). # # For more information, run: # $ gcloud topic gcloudignore # .gcloudignore # If you would like to upload your .git directory, .gitignore file or files # from your .gitignore file, remove the corresponding line # below: .git .gitignore # Node.js dependencies: node_modules/ - שומרים את קובץ ה-
.gcloudignore.
אתחול האפליקציה
לפני שמפעילים את האפליקציה, צריך לאתחל אותה באמצעות הפרויקט ולבחור אזור משויך.
בחלון שורת הפקודה, מבצעים את הפעולות הבאות.
- מנווטים לספריית הפרויקט החדשה
photo-gallery-app. - מזינים את הפקודה הבאה כדי לאתחל את האפליקציה.
gcloud app create --project=[YOUR_PROJECT_ID]
- בבקשה, בוחרים את האזור שבו רוצים למקם את אפליקציית App Engine.
פריסת האפליקציה
בחלון שורת הפקודה, מבצעים את הפעולות הבאות.
- מנווטים לספריית הפרויקט החדשה
photo-gallery-app. - מזינים את הפקודה הבאה כדי לפרוס את האפליקציה.
gcloud app deploy --project=[YOUR_PROJECT_ID]
- בבקשה לאישור, מאשרים את הפעולה.אחרי שפקודת הפריסה של gcloud מסתיימת בהצלחה, מוצגת כתובת URL לגישה לאפליקציה.
- מזינים את הפקודה הבאה כדי לפתוח כרטיסייה חדשה בדפדפן.
gcloud app browse

11. מזל טוב
מעולה. יצרתם גלריית תמונות לדוגמה באמצעות Angular v14 ופרסתם אותה בהצלחה ב-App Engine.
התנסיתם בתכונה של רכיב עצמאי ובטעינה מדורגת. יצרתם תכונה לשליחת הודעות שמבוססת על טופס, כדי לספק משוב ותגובות. הוספתם גם דיאלוג בצ'אט עם נציג וירטואלי של Dialogflow CX באמצעות Dialogflow Messenger. כל הכבוד.
השלבים הבאים
אחרי שסיימתם את האפליקציה הבסיסית, תוכלו לשפר אותה באמצעות הרעיונות הבאים.
- הטופס לא שולח משוב בפועל, צריך לשכתב אותו כדי להוסיף את הלוגיקה העסקית לשליחת אימייל.
- בתרחיש מהעולם האמיתי, כדאי לאמת את קלט של משתמשים ולכלול Captcha או מנגנון דומה כדי למנוע מבוטים להפיץ ספאם
- יצירת סוכן חדש והסבר על תכנון זרימות שיחה ב-Dialogflow CX
תמשיכו להתנסות עם מסגרת Angular ותהנו.
ניקוי ומחיקה של הפרויקט בענן
אתם יכולים להשאיר את הפרויקט ב-Cloud או למחוק אותו כדי להפסיק את החיוב על כל המשאבים שנעשה בהם שימוש בפרויקט.
בדפדפן, מבצעים את הפעולות הבאות.
- נכנסים לחשבון Gmail או לחשבון Google Workspace.
- במסוף Google Cloud, לוחצים על הלחצן IAM & Admin Settings (הגדרות IAM ואדמין).
- בדף IAM ואדמין, בוחרים בכרטיסייה ניהול משאבים.
- בדף Manage resources, עוברים לפרויקט שרוצים למחוק ובוחרים אותו. לוחצים על הלחצן Delete כדי לפתוח חלון דו-שיח.
- בתיבת הדו-שיח, מזינים את מזהה הפרויקט ולוחצים על הלחצן Shut down כדי למחוק את הפרויקט.