เริ่มต้นด้วยการพิจารณา 'ฉันจริง ๆต้องการที่จะทำเช่นนี้?'
ฉันไม่มีปัญหาในการอ้างถึง enums โดยตรงใน HTML แต่ในบางกรณีมีทางเลือกที่สะอาดกว่าที่ไม่สูญเสียความปลอดภัยประเภท ตัวอย่างเช่นหากคุณเลือกวิธีที่แสดงในคำตอบอื่น ๆ ของฉันคุณอาจประกาศ TT ในองค์ประกอบของคุณดังนี้:
public TT =
{
// Enum defines (Horizontal | Vertical)
FeatureBoxResponsiveLayout: FeatureBoxResponsiveLayout
}
ในการแสดงเลย์เอาต์ที่แตกต่างใน HTML ของคุณคุณจะต้องมี*ngIf
เลย์เอาต์แต่ละประเภทและคุณสามารถอ้างอิงโดยตรงกับ enum ใน HTML ของส่วนประกอบของคุณ:
*ngIf="(featureBoxResponsiveService.layout | async) == TT.FeatureBoxResponsiveLayout.Horizontal"
ตัวอย่างนี้ใช้บริการเพื่อรับเค้าโครงปัจจุบันเรียกใช้ผ่านท่อ async แล้วเปรียบเทียบกับค่า enum ของเรา เป็นเรื่องที่ค่อนข้างละเอียดซับซ้อนและไม่ค่อยสนุกที่จะดู นอกจากนี้ยังเปิดเผยชื่อของ enum ซึ่งตัวเองอาจจะ verbose มากเกินไป
อีกทางเลือกหนึ่งที่รักษาความปลอดภัยประเภทจาก HTML
หรือคุณสามารถทำสิ่งต่อไปนี้และประกาศฟังก์ชั่นที่อ่านได้มากขึ้นในไฟล์. ts ของส่วนประกอบ:
*ngIf="isResponsiveLayout('Horizontal')"
ทำความสะอาดมาก! แต่ถ้ามีคนพิมพ์'Horziontal'
ผิดพลาดล่ะ? เหตุผลทั้งหมดที่คุณต้องการใช้ enum ใน HTML นั้นเพื่อความปลอดภัย
เรายังคงสามารถบรรลุได้ด้วยkeyofและเวทมนต์บทกลอนบางส่วน นี่คือนิยามของฟังก์ชัน:
isResponsiveLayout(value: keyof typeof FeatureBoxResponsiveLayout)
{
return FeatureBoxResponsiveLayout[value] == this.featureBoxResponsiveService.layout.value;
}
สังเกตการใช้งานFeatureBoxResponsiveLayout[string]
ที่แปลงค่าสตริงที่ส่งผ่านไปเป็นค่าตัวเลขของ enum
สิ่งนี้จะให้ข้อความแสดงข้อผิดพลาดพร้อมการรวบรวม AOT หากคุณใช้ค่าที่ไม่ถูกต้อง
อาร์กิวเมนต์ประเภท '"H4 แนวนอน"' ไม่สามารถกำหนดให้กับพารามิเตอร์ประเภท "" แนวตั้ง "| "แนวนอน"
ปัจจุบัน VSCode ยังไม่ฉลาดพอที่จะขีดเส้นใต้H4orizontal
ในตัวแก้ไข HTML แต่คุณจะได้รับคำเตือนในเวลารวบรวม (ด้วย --prod build หรือ --aot switch) สิ่งนี้อาจได้รับการปรับปรุงในการปรับปรุงในอนาคต