
ในบทความก่อนหน้านี้ เราได้กล่าวถึงว่า
บริการไม่เพียงแต่สามารถใช้เพื่อประมวลผลคำขอ API เท่านั้น แต่ยังมีประโยชน์อื่นๆ ด้วย
เช่น การใช้งาน notification ที่เราจะพูดถึงในบทความนี้ [บทช่วยสอนที่เกี่ยวข้องที่แนะนำ: "บทช่วยสอนเชิงมุม"]
การเรนเดอร์มีดังนี้:

UI สามารถปรับเปลี่ยนได้ในภายหลัง
ดังนั้นเรามาดูรายละเอียดทีละขั้นตอนกัน
ในการเพิ่มบริการ
เราจะเพิ่มไฟล์บริการ notification.service.ts ใน app/services (โปรดใช้บรรทัดคำสั่งเพื่อสร้าง) และเพิ่มเนื้อหาที่เกี่ยวข้อง:
// alert.service.ts
นำเข้า { ฉีดได้ } จาก '@ เชิงมุม/แกน';
นำเข้า { สังเกตได้ หัวเรื่อง } จาก 'rxjs';
// การแจงนับสถานะการแจ้งเตือน ส่งออก enum สถานะการแจ้งเตือน {
กระบวนการ = "ความคืบหน้า"
ความสำเร็จ = "ความสำเร็จ",
ความล้มเหลว = "ความล้มเหลว",
สิ้นสุดแล้ว = "สิ้นสุดแล้ว"
-
@ฉีด({
ให้ไว้ใน: 'ราก'
-
บริการแจ้งเตือนคลาสส่งออก {
แจ้งส่วนตัว: เรื่อง <NotificationStatus> = เรื่องใหม่ ();
ข้อความสาธารณะObj: any = {
หลัก: '',
รอง: ''
-
// แปลงเป็น getNotification สาธารณะที่สังเกตได้ (): Observable<NotificationStatus> {
กลับ this.notify.asObservable();
-
// อยู่ระหว่างดำเนินการแจ้งเตือน public showProcessNotification() {
this.notify.next (สถานะการแจ้งเตือน กระบวนการ)
-
// การแจ้งเตือนความสำเร็จสาธารณะ showSuccessNotification() {
this.notify.next (สถานะการแจ้งเตือนความสำเร็จ)
-
//สิ้นสุดการแจ้งเตือนสาธารณะ showEndedNotification() {
this.notify.next (สถานะการแจ้งเตือนสิ้นสุด)
-
// เปลี่ยนข้อมูล public changePrimarySecondary(primary?: string, Secondary?: string) {
this.messageObj.primary = หลัก;
this.messageObj.secondary = รอง
-
ตัวสร้าง () { }
} เข้าใจง่ายไหม...
เราเปลี่ยน notify ให้เป็นวัตถุที่สังเกตได้ แล้วเผยแพร่ข้อมูลสถานะต่างๆ
ในการสร้างส่วนประกอบ
เราจะสร้างส่วนประกอบ notification ใหม่ใน app/components ซึ่งเป็นที่จัดเก็บส่วนประกอบสาธารณะ ดังนั้นคุณจะได้รับโครงสร้างดังต่อไปนี้:
การแจ้งเตือน ├── alert.component.html // โครงกระดูกของหน้า ├── alert.component.scss // สไตล์ที่ไม่ซ้ำของหน้า ├── alert.component.spec.ts // ไฟล์ทดสอบ └── alert.component.ts // ใน ไฟล์จาวาสคริปต์
ที่เรากำหนดโครงกระดูกของ notification :
<!-- alert.component.html -->
<!--รองรับการปิดการแจ้งเตือนด้วยตนเอง-->
<button (click)="closeNotification()">ปิด</button>
<h1>เนื้อหาเตือนความจำ: {{ ข้อความ }}</h1>
<!-- ปรับแต่งข้อมูลการแจ้งเตือนที่สำคัญ-->
<p>{{ ข้อความหลัก }}</p>
<!-- ปรับแต่งข้อมูลการแจ้งเตือนรอง-->
<p>{{ SecondaryMessage }}</p> ต่อไป เราเพียงแก้ไขโครงกระดูกและเพิ่มสไตล์ต่อไปนี้:
// alert.component.scss
:เจ้าภาพ {
ตำแหน่ง: คงที่;
ด้านบน: -100%;
ขวา: 20px;
สีพื้นหลัง: #999;
เส้นขอบ: 1px ทึบ #333;
รัศมีเส้นขอบ: 10px;
ความกว้าง: 400px;
ความสูง: 180px;
ช่องว่างภายใน: 10px;
// ให้ความสนใจกับเนื้อหาที่ใช้งานที่นี่ จะปรากฏเฉพาะเมื่อมีการแจ้งเตือนปรากฏขึ้น
ด้านบน: 10px;
-
&.ความสำเร็จ{}
&.ความคืบหน้า {}
&.ความล้มเหลว {}
&.สิ้นสุด {}
} ชื่อสี่คลาสของ success, progress, failure, ended สอดคล้องกับการแจงนับที่กำหนดโดยบริการการแจ้งเตือน คุณสามารถเพิ่มสไตล์ที่เกี่ยวข้องได้ตามความต้องการของคุณเอง
ในที่สุด เราก็เพิ่มโค้ด javascript สคริปต์เชิงพฤติกรรม
// การแจ้งเตือนส่วนประกอบ.ts
นำเข้า { ส่วนประกอบ, OnInit, HostBinding, OnDestroy } จาก '@ เชิงมุม/core';
// จุดความรู้ใหม่ rxjs
นำเข้า { การสมัครสมาชิก } จาก 'rxjs';
นำเข้า {debounceTime} จาก 'rxjs/ตัวดำเนินการ';
// แนะนำบริการที่เกี่ยวข้องนำเข้า { NotificationStatus, NotificationService } จาก 'src/app/services/notification.service';
@ส่วนประกอบ({
ตัวเลือก: 'การแจ้งเตือนแอป',
templateUrl: './notification.component.html',
styleUrls: ['./notification.component.scss']
-
ส่งออกคลาส NotificationComponent ใช้ OnInit, OnDestroy {
// เวลาป้องกันการสั่นไหว, อ่านอย่างเดียวส่วนตัวแบบอ่านอย่างเดียว NOTIFICATION_DEBOUNCE_TIME_MS = 200;
การแจ้งเตือนที่ได้รับการป้องกันการสมัครสมาชิก!: การสมัครสมาชิก;
ตัวจับเวลาส่วนตัว: ใด ๆ = null;
ข้อความสาธารณะ: string = ''
// การแมปบริการแจ้งเตือนของข้อมูลการแจงนับ privateflectObj: any = {
ความคืบหน้า: "อยู่ระหว่างดำเนินการ",
ความสำเร็จ: "ความสำเร็จ"
ความล้มเหลว: "ความล้มเหลว",
สิ้นสุด: "สิ้นสุด"
-
@HostBinding('class') การแจ้งเตือน CssClass = '';
ข้อความหลักสาธารณะ!: สตริง;
ข้อความรองสาธารณะ!: สตริง;
ตัวสร้าง (
บริการแจ้งเตือนส่วนตัว: บริการแจ้งเตือน
-
ngOnInit(): เป็นโมฆะ {
นี้.init()
-
สาธารณะ init() {
//เพิ่มข้อมูลการสมัครสมาชิกที่เกี่ยวข้อง this.notificationSubscription = this.notificationService.getNotification()
.ท่อ(
debounceTime (นี้.NOTIFICATION_DEBOUNCE_TIME_MS)
-
.subscribe((notificationStatus: สถานะการแจ้งเตือน) => {
ถ้า (สถานะการแจ้งเตือน) {
นี้.resetTimeout();
//เพิ่มรูปแบบที่เกี่ยวข้อง this.notificationCssClass = `active ${ alertStatus }`
this.message = this.reflectObj [สถานะการแจ้งเตือน]
// รับข้อความหลักที่กำหนดเอง this.primaryMessage = this.notificationService.messageObj.primary;
// รับข้อมูลรองที่กำหนดเอง this.secondaryMessage = this.notificationService.messageObj.secondary;
ถ้า (notificationStatus === สถานะการแจ้งเตือน กระบวนการ) {
นี้.resetTimeout()
this.timer = setTimeout(() => {
นี้.resetView()
}, 1,000)
} อื่น {
นี้.resetTimeout();
this.timer = setTimeout(() => {
this.notificationCssClass = ''
นี้.resetView()
}, 2000)
-
-
-
-
รีเซ็ตส่วนตัว (): เป็นโมฆะ {
นี้.ข้อความ = ''
-
// ปิดตัวจับเวลาส่วนตัวรีเซ็ตหมดเวลา (): เป็นโมฆะ {
ถ้า (this.timer) {
clearTimeout (this.timer)
-
-
// ปิดการแจ้งเตือน public closeNotification() {
this.notificationCssClass = ''
นี้.resetTimeout()
-
// ส่วนประกอบถูกทำลาย ngOnDestroy(): เป็นโมฆะ {
นี้.resetTimeout();
//ยกเลิกข้อความการสมัครสมาชิกทั้งหมด this.notificationSubscription.unsubscribe()
-
} ที่นี่ เราจะแนะนำจุดความรู้ของ rxjs RxJS คือไลบรารีการเขียนโปรแกรมแบบโต้ตอบโดยใช้ Observables ซึ่งช่วยให้เขียนโค้ดแบบอะซิงโครนัสหรือแบบเรียกกลับได้ง่ายขึ้น นี่เป็นห้องสมุดที่ยอดเยี่ยม และคุณจะได้เรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้ในบทความสองสามบทความถัดไป
ที่นี่เราใช้ฟังก์ชัน debounce anti -shake ฟังก์ชัน anti-shake หมายความว่าหลังจากเหตุการณ์ถูกทริกเกอร์ จะสามารถดำเนินการได้เพียงครั้งเดียวหลังจาก n วินาที หากเหตุการณ์ถูกทริกเกอร์อีกครั้งภายใน n วินาที เวลาดำเนินการของฟังก์ชันจะเป็น คำนวณใหม่ พูดง่ายๆ ก็คือ เมื่อมีการกระตุ้นการกระทำอย่างต่อเนื่อง จะมีการดำเนินการเฉพาะครั้งสุดท้ายเท่านั้น
PS:
throttleฟังก์ชันควบคุมปริมาณ: จำกัดฟังก์ชันที่จะดำเนินการเพียงครั้งเดียวภายในระยะเวลาหนึ่ง
ระหว่างการสัมภาษณ์ ผู้สัมภาษณ์ชอบถาม...
การโทร
เนื่องจากเป็นบริการระดับโลก เราจึงเรียก Component นี้ใน app.component.html :
// app.component.html <เราเตอร์-เต้าเสียบ></เราเตอร์-เต้าเสียบ> <app-notification></app-notification>
เพื่ออำนวยความสะดวกในการสาธิต เราได้เพิ่มปุ่มใน user-list.component.html เพื่อให้ทริกเกอร์การสาธิตได้อย่างง่ายดาย:
// user-list.component.html <button (click)="showNotification()">คลิกแสดงการแจ้งเตือน</button>
ทริกเกอร์รหัสที่เกี่ยวข้อง:
// user-list.component.ts
นำเข้า { NotificationService } จาก 'src/app/services/notification.service';
-
ตัวสร้าง (
บริการแจ้งเตือนส่วนตัว: บริการแจ้งเตือน
-
//แสดงการแจ้งเตือน showNotification(): เป็นโมฆะ {
this.notificationService.changePrimarySecondary('ข้อมูลหลัก 1');
this.notificationService.showProcessNotification();
setTimeout(() => {
this.notificationService.changePrimarySecondary('ข้อมูลหลัก 2', 'ข้อมูลรอง 2');
this.notificationService.showSuccessNotification();
}, 1,000)
} ณ จุดนี้ เราทำเสร็จแล้ว เราได้จำลองฟังก์ชัน notification สำเร็จแล้ว เราสามารถปรับเปลี่ยนส่วนประกอบบริการที่เกี่ยวข้องได้ตามความต้องการที่แท้จริงและปรับแต่งให้ตรงตามความต้องการทางธุรกิจ หากเรากำลังพัฒนาระบบสำหรับการใช้งานภายใน ขอแนะนำให้ใช้ไลบรารี UI ที่ครบถ้วน ซึ่งช่วยให้เราสรุปส่วนประกอบและบริการต่างๆ ได้มาก ซึ่งช่วยประหยัดเวลาในการพัฒนาได้มาก