กล่องโต้ตอบไม่เคยทำให้ฉันสนใจโปรเจ็กต์ด้านการพัฒนาเว็บไซต์ที่มีข้อจำกัดก่อนหน้านี้ ความจริงที่ว่าฉันไม่เคยเห็นการใช้งานมันเป็นเหตุผลหนึ่งและมีการเรียกแจ้งเตือนที่เชื่อถือได้เสมอ ซึ่งทำงานที่ฉันต้องการ กล่องโมดอลของ Bootstrap นั้นน่าสนใจแต่ไม่มีเวลาที่จะดำดิ่งลงไปจริงๆ จากนั้นก็ได้มีโอกาสเรียนรู้เชิงมุม
ฉันเล่นกับ Angular และ Angular Material มาเกือบ 2 เดือนแล้ว เมื่อเดือนที่แล้ว พวกเขาทำให้ฉันพังจริงๆ ด้วยการทำลายโค้ดบางส่วนของฉันในเวอร์ชันล่าสุด อย่าเริ่มพูดถึงดิ้น ดูเหมือนจะไม่สามารถพันหัวฉันได้ แต่มีเพียงสิ่งนี้เกี่ยวกับกรอบงานนี้ที่คุณรักและเกลียด ประการแรก การใช้กล่องโต้ตอบวัสดุเชิงมุมนั้นง่ายต่อการเข้าใจ
ฉันทำงานมาหลายปีโดยอาศัยกล่องข้อความของ Windows เพื่อแจ้งเตือนอะไรก็ได้ โทรง่ายและได้ผลลัพธ์ง่าย นี่คือรหัส C# เพื่อแสดงกล่องข้อความ
string message = "Do you want to abort this operation?"; string title = "Close Window"; MessageBoxButtons buttons = MessageBoxButtons.AbortRetryIgnore; DialogResult result = MessageBox.Show(message, title, buttons, MessageBoxIcon.Warning);
โอ้ ฉันคิดถึงวัน WinForms แต่สิ่งต่างๆ ก็ต้องดำเนินต่อไป ดังนั้นฉันจึงพยายามเลียนแบบสไตล์การโทรใน Angular เพื่อแสดงกล่องการแจ้งเตือนที่กำหนดเอง นี่คือตัวอย่างการโทรของฉันเพื่อแสดงกล่องการแจ้งเตือน
MessageBox.show(this.dialog, this.message, this.title, this.information, this.button, this.allow_outside_click, this.style, this.width) .subscribe( result => { console.log(result); }); MessageBox.show(this.dialog, `The result is : ${response}`); MessageBox.show(this.dialog, `Hello, World!`);
นี่คือการดำเนินการของฉัน อาจไม่ใช่แนวทางที่หรูหราหรือมีประสิทธิภาพมากที่สุด แต่ให้สิ่งที่ฉันต้องการ อย่างไรก็ตาม ซอร์สโค้ดมีอยู่ที่ GitHub
ส่วนประกอบ
ฉันสร้างองค์ประกอบหนึ่งสำหรับ MessageBox UI มีสองสไตล์ให้เลือก: เต็มและเรียบง่าย องค์ประกอบ UI แสดงไว้ด้านล่าง
ตัวเลือกการกำหนดค่า:
- ชื่อเรื่อง — ข้อความที่แสดงในแถบหัวเรื่องของกล่องโต้ตอบ โดยค่าเริ่มต้นจะเป็น "การแจ้งเตือน" หากไม่ได้ระบุไว้ แถบหัวเรื่องจะแสดงเฉพาะเมื่อตั้งค่าสไตล์เป็น "เต็ม" เท่านั้น
- ข้อความ — ข้อความหลักที่จะแสดงต่อผู้ใช้
- ข้อมูล — ข้อมูลเพิ่มเติมที่จะแสดง
- ปุ่ม — ประเภทของปุ่มที่จะแสดง ในปัจจุบัน รองรับเฉพาะรายการต่อไปนี้: OK, OK/CANCEL, YES/NO, ACCEPT/REJECT
- อนุญาตให้คลิกด้านนอกเพื่อปิด — อนุญาตให้ผู้ใช้เพียงคลิกที่ภูมิภาคใดก็ได้ในหน้าจอนอกกล่องโต้ตอบเพื่อปิด ตามค่าเริ่มต้น ผู้ใช้จะต้องคลิกที่ปุ่มเพื่อเริ่มการปิด
- สไตล์ — กำหนดสไตล์สำหรับกล่องโต้ตอบ รองรับสองสไตล์: เต็มและเรียบง่าย
- ความกว้าง — ความกว้างของกล่องโต้ตอบ
ส่วนประกอบ DialogBox ไม่มีตรรกะที่ซับซ้อนอยู่เบื้องหลัง ได้รับการออกแบบมาเพื่อแสดงข้อความและตอบกลับผู้ใช้ เมื่อผู้ใช้คลิกปุ่ม ให้ปิด UI และส่งคืนผลลัพธ์
onOk() { this.dialogRef.close({result: "ok"}); } onCancel() { this.dialogRef.close({result: "cancel"}); }
คลาสแบบคงที่ของ MessageBox
ฉันใช้คลาสคงที่เพื่อเลียนแบบการโทร C# บริการจะต้องมีการใช้งานที่ดีกว่า แต่ฉันเลือกใช้บริการที่ง่ายกว่า ปัญหาเดียวที่ฉันมีในแนวทางนี้คือคลาสแบบคงที่ไม่สามารถใช้ประโยชน์จาก Dependency Injection ได้ ดังนั้น คุณจะสังเกตเห็นว่าฉันต้องส่งวัตถุ MatDialog เป็นพารามิเตอร์
export class MessageBox { static show(dialog: MatDialog, message, title = "Alert", information = "", button = 0, allow_outside_click = false, style = 0, width = "200px") { const dialogRef = dialog.open( SimpleDialogComponent, { data: { title: title || "Alert", message: message, information: information, button: button || 0, style: style || 0, allow_outside_click: allow_outside_click || false }, width: width }); return dialogRef.afterClosed(); } }
โปรดสังเกตว่าการตอบสนองจะถูกส่งกลับเป็นแบบสังเกตได้ ผู้บริโภคในคลาสนี้จำเป็นต้องสมัครสมาชิกเพื่อรับการตอบกลับที่แท้จริง
บริการข้อความ
ในบางกรณี แอปพลิเคชันของฉันต้องการบริการข้อความเพื่อเริ่มกล่องโต้ตอบของฉัน โดยทั่วไปจะใช้เพื่อแสดงข้อความอันเป็นผลมาจากกระบวนการจากบริการอื่นเสร็จสมบูรณ์ นี่คือบริการข้อความง่ายๆ ในการทำงาน
@Injectable() export class MessageService { private message = new Subject<any>(); constructor() { } // the type can be used in case you want to classify the alert sendMessage(message: string, type = 1) { this.message.next({text: message, type: type}); } getMessage(): Observable<any> { return this.message.asObservable(); } clearMessage() { this.message.next(); } }
วิธีใช้กล่องข้อความ
เราสามารถเรียกเมธอด MessageBox.show() ได้โดยตรงบนโค้ดของคุณ
MessageBox.show(this.dialog, this.message, this.title, this.information, this.button, this.allow_outside_click, this.style, this.width) .subscribe( result => { console.log(result); });
หรือหากต้องการใช้บริการส่งข้อความ
onSendService() { this.messageService.sendMessage(this.message); }
เพียงให้แน่ใจว่าคุณได้สมัครใช้บริการ
this.subscriber = this.messageService.getMessage() .subscribe(message => { MessageBox.show(this.dialog, message.text); });
หากคุณอาจมีความคิดเห็นหรือข้อเสนอแนะเกี่ยวกับวิธีแก้ปัญหา โปรดกดที่ช่องแสดงความคิดเห็น ขอให้มีความสุขในการเขียนโค้ด!
โพสต์นี้ได้รับการอัปเดตเมื่อวันที่ 11 ธันวาคม 2017 เพื่อเพิ่มการใช้งานบริการข้อความ
บทความนี้ถูกโพสต์บน บล็อกส่วนตัว ของฉันด้วย
หากโพสต์นี้ช่วยคุณได้ โปรดคลิกปุ่มตบมือ 👏 ด้านล่างสองสามครั้งเพื่อแสดงการสนับสนุนของคุณ!