1. מבוא
מה תפַתחו
בקודלאב הזה תלמדו איך ליצור אפליקציית גלריית תמונות של חיות בר באמצעות Angular v14. בבקשה שהושלמו יוצגו קבוצת תמונות וגם טופס שליחת הודעה ליצירת קשר עם הצלם, וחלון צ'אט עם עובדות מעניינות על בעלי החיים שמוצגים בתמונות.
אפשר לפתח את כל מה שצריך באפליקציה באמצעות Angular v14 ותכונת הרכיבים העצמאית החדשה.
כל ההפניות ל-Angular framework ול-Agular CLI מבוססות על Angular v14. רכיבים עצמאיים הם תכונה בתצוגה מקדימה של Angular v14, לכן צריך ליצור אפליקציה חדשה לגמרי באמצעות Angular v14. רכיבים עצמאיים מספקים דרך פשוטה לפיתוח אפליקציות ב-Agular. רכיבים עצמאיים, הוראות נפרדות וצינורות עיבוד נתונים שעומדים בפני עצמם נועדו לשפר את חוויית הכתיבה על ידי צמצום הצורך ב-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. איך יוצרים ענף (fork) ומשכפלים מאגר.
- ממשק שורת הפקודה (CLI), כמו
bash
אוzsh
. איך לנווט בספריות ולהריץ פקודות.
2. הגדרת הסביבה
הגדרת הסביבה המקומית
כדי להשלים את הקודלאב הזה, צריך להתקין את התוכנות הבאות במחשב המקומי.
- גרסת LTS פעילה או גרסת LTS לתחזוקה של Node.js. משמש להתקנת Angular framework ו-Agular CLI.
גרסת צומת
נתמכת על ידי 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 תושלם בהצלחה, אמורה להופיע הודעה שדומה לצילום המסך הבא.
קוד מקור ותמונות
אתם יוצרים את האפליקציה כולה מהתחלה, והקודלאב הזה יעזור לכם לעשות זאת. חשוב לזכור שמאגר GitHub מכיל את הקוד הסופי. אם נתקלת בבעיה, כדאי לבדוק את הקוד הסופי ואת התמונות שמוצגות בדף הגלריה.
להוריד את קוד המקור:
- בדפדפן, עוברים לדף הבא.
https://github.com/angular/codelabs/tree/standalone-components
- בחלון של שורת הפקודה, יוצרים פורק ומשכפלים את המאגר.
בשלב הבא, נבנה את אפליקציית גלריית התמונות.
3. יצירת אפליקציה חדשה
כדי ליצור את אפליקציית ה-starter הראשונית, מבצעים את הפעולות הבאות.
משתמשים ב-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: true
app.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
, צריך להשתמש ברכיב עצמאי כרכיב הבסיס באמצעות ה-API של bootstrapApplication
.
הסרת הפניות למודול האפליקציה
בעורך קוד, מבצעים את הפעולות הבאות.
- עוברים לספרייה
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 כדי להדר ולהפעיל את האפליקציה ולפתוח שרת אינטרנט. כדי להסיר שגיאות הידור, יכול להיות שיהיה צורך לסגור את סביבת הפיתוח המשולבת (IDE) לפני הרצת האפליקציה.
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
. - שומרים את הקוד ובודקים את הדפדפן. כששרת הפיתוח פועל, השינויים משתקפים בדפדפן כששומרים אותם.
- בשלב הבא, יוצרים רכיב עצמאי חדש כדי לשלוח משוב ולשוחח בצ'אט עם Jibo. בהמשך הקודלהב הזה תלמדו עוד על Jimbo.
5. הוספת רכיב עצמאי חדש
כפי שראיתם עד עכשיו, רכיבים עצמאיים מספקים דרך פשוטה יותר לפתח אפליקציות Angular על ידי צמצום הצורך ב-NgModules. בקטעים הבאים, תיצרו רכיב עצמאי חדש שמאפשר למשתמש לשלוח משוב ולשוחח בצ'אט עם נציג וירטואלי.
יצירת רכיב עצמאי חדש
כדי ליצור את הרכיב החדש הזה, משתמשים שוב ב-Angular CLI.
בחלון שורת הפקודה, מבצעים את הפעולות הבאות.
- עוברים לספריית הפרויקט החדשה
photo-gallery-app
. - מזינים את הפקודה הבאה ב-Angular כדי ליצור רכיב חדש בשם
feedback-and-chat
. בטבלה הבאה מתוארים החלקים של הפקודה.ng generate component feedback-and-chat --standalone
חלק
פרטים
ng
הגדרת כל פקודות ה-CLI של Angular למסגרת 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
ואת המודול 'מסלולים'. Angular v 14.2.0 כוללת שיטת ProvideRouter חדשה שמאפשרת לנו להגדיר קבוצת מסלולים לאפליקציה.import { provideRouter, Routes } from '@angular/router';
- מעתיקים ומדביקים את קטע הקוד הבא בין ה-import לבין משפט
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
מספק שיטות נוחות ליצירת רכיב UI.
בעורך הקוד, מבצעים את הפעולות הבאות.
- עוברים לקובץ
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 ובוחרים בכרטיסייה מסוף.
- מזינים ערכים בתיבות הטקסט שם מלא, כתובת אימייל והערות.
- לוחצים על הלחצן Submit (שליחה). הודעה על הצלחה אמורה להופיע בדף.
- מוודאים שהערכים מוצגים בכרטיסייה Console.המסך אמור להיראות כמו בצילום המסך הבא.הטמעתם בהצלחה את הקוד להוספת טופס send message לממשק המשתמש של הרכיב ולניתוח הקלט של המשתמש.
- בשלב הבא, מוטמעת שיחה בצ'אט כדי לאפשר למבקרים באפליקציה לדבר עם Jimbo. ג'ימבו הוא קואלה שמלמד עובדות מגניבות על חיות בר.
8. הוספת תיבת דו-שיח בצ'אט
כדאי להיעזר בניסיון עם ממשקי שיחה, כמו Dialogflow CX או פלטפורמות דומות. נציג של Dialogflow CX הוא סוכן וירטואלי שמטפל בשיחות בו-זמנית עם בני אדם. זהו מודול של הבנת שפה טבעית שמזהה את הניואנסים של השפה האנושית ומתרגם טקסט או אודיו של משתמשי קצה במהלך שיחה לנתונים מובְנים שאפליקציות ושירותים יכולים להבין.
כבר נוצר סוכן וירטואלי לדוגמה לשימוש שלכם. מה שצריך לעשות בשיעור ה-Lab הזה הוא להוסיף תיבת דו-שיח בצ'אט לרכיב העצמאי, כדי לאפשר למשתמשים באפליקציה ליצור אינטראקציה עם הבוט. כדי לעמוד בדרישות האלה, תצטרכו להשתמש ב-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.מאפיין
פרטים
מזהה נציג
השדה מאוכלס מראש. מזהה ייחודי של נציג 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 מוצגת המלצה להוסיף 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
- לוחצים על הסמל ומקיימים אינטראקציה עם Jimbo.Jimbo מספק עובדות מעניינות על בעלי חיים.
- האפליקציה פועלת באופן מלא.
9. פריסת האפליקציה ב-Google App Engine
האפליקציה פועלת באופן מקומי במחשב. בשלב הבא והאחרון של סדנת הקוד הזו, נעביר את הקוד ל-Google App Engine.
מידע נוסף על Google App Engine זמין במאמר App Engine.
הגדרת הסביבה של Google App Engine
אם כבר אתם עומדים בכל התנאים הבאים, אתם יכולים לדלג על השלבים הבאים ולהמשיך לפריסה של האפליקציה.
- יצרתם פרויקט בענן באמצעות App Engine
- הפעלת Cloud Build API
- התקנתם את Google Cloud CLI
מבצעים את הפעולות הבאות.
- נכנסים לחשבון Gmail או חשבון Google Workspace. אם אין לכם חשבון Google, יוצרים חשבון Google.
- מפעילים את החיוב במסוף Cloud כדי שתוכלו להשתמש במשאבים ובממשקי ה-API של Cloud. מידע נוסף זמין במאמר יצירה, שינוי וסגירה של חשבון לחיוב ב-Cloud בניהול עצמי.
- יוצרים פרויקט ב-Google Cloud שיכיל את משאבי האפליקציה של App Engine ומשאבים אחרים ב-Google Cloud. מידע נוסף זמין במאמר יצירה וניהול של פרויקטים.
- מפעילים את Cloud Build API במסוף Cloud. מידע נוסף זמין במאמר הפעלת הגישה ל-API.
- מתקינים את Google Cloud CLI ואת כלי שורת הפקודה gcloud. מידע נוסף זמין במאמר התקנת ה-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 הזה נעשה שימוש במסגרת Express.js כדי לטפל בבקשות HTTP. אפשר להשתמש בסביבת ה-Web המועדפת עליכם.
התקנת מסגרת 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: default
app.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 deployment תושלם, תוצג כתובת URL כדי לגשת לאפליקציה.
- מזינים את הפקודה הבאה כדי לפתוח כרטיסייה חדשה בדפדפן.
gcloud app browse
11. מזל טוב
מעולה. יצרתם גלריית תמונות לדוגמה באמצעות Angular v14 ופרסמתם אותה ב-App Engine.
נסו את התכונה 'רכיב עצמאי' ואת הטעינה האיטית. יצרתם תכונה מבוססת-טופס לשליחת הודעות כדי לספק משוב ותגובות. הוספת בהצלחה גם תיבת דו-שיח של צ'אט עם סוכן וירטואלי של Dialogflow CX באמצעות Dialogflow Messenger. כל הכבוד.
השלבים הבאים
עכשיו, אחרי שהשלמתם את הבקשה הבסיסית, אפשר לשפר אותה בעזרת הרעיונות הבאים.
- הטופס לא שולח משוב בפועל, צריך לבצע בו שינוי מבני כדי להוסיף את הלוגיקה העסקית לשליחת אימייל.
- בתרחיש בעולם האמיתי, עליך לאמת את הקלט של המשתמשים ולכלול captcha או מנגנון דומה כדי למנוע הפצת ספאם של בוטים
- יצירת נציג חדש ולימוד תכנון תהליכי שיחה ב-Dialogflow CX
כדאי להמשיך להתנסות במסגרת Angular וליהנות.
ניקוי ומחיקה של פרויקט ב-Cloud
אפשר לשמור את הפרויקט ב-Cloud או למחוק אותו כדי להפסיק את החיוב על כל המשאבים שנמצאים בשימוש בפרויקט.
בדפדפן, מבצעים את הפעולות הבאות.
- נכנסים לחשבון Gmail או לחשבון Google Workspace.
- במסוף Google Cloud, בוחרים בלחצן IAM & Admin Settings.
- בדף IAM ואדמין, בוחרים בכרטיסייה ניהול משאבים.
- בדף Manage resources.עוברים לפרויקט שרוצים למחוק ובוחרים בו.לוחצים על הלחצן Delete כדי לפתוח תיבת דו-שיח.
- בחלון הדו-שיח, מזינים את מזהה הפרויקט. לוחצים על הלחצן Shut down כדי למחוק את הפרויקט.