Bắt đầu bằng cách xem xét 'Tôi có thực sự muốn làm điều này không?'
Tôi không có vấn đề gì khi đề cập đến enum trực tiếp trong HTML, nhưng trong một số trường hợp, có những lựa chọn thay thế sạch hơn mà không mất tính an toàn kiểu. Chẳng hạn, nếu bạn chọn cách tiếp cận được hiển thị trong câu trả lời khác của tôi, bạn có thể đã khai báo TT trong thành phần của mình giống như thế này:
public TT =
{
// Enum defines (Horizontal | Vertical)
FeatureBoxResponsiveLayout: FeatureBoxResponsiveLayout
}
Để hiển thị bố cục khác nhau trong HTML của bạn, bạn có một *ngIf
loại bố cục và bạn có thể tham khảo trực tiếp đến enum trong HTML của thành phần:
*ngIf="(featureBoxResponsiveService.layout | async) == TT.FeatureBoxResponsiveLayout.Horizontal"
Ví dụ này sử dụng một dịch vụ để có được bố cục hiện tại, chạy nó qua ống async và sau đó so sánh nó với giá trị enum của chúng tôi. Nó khá dài dòng, phức tạp và không có nhiều niềm vui để xem xét. Nó cũng tiết lộ tên của enum, mà bản thân nó có thể quá dài dòng.
Thay thế, vẫn giữ an toàn loại từ HTML
Ngoài ra, bạn có thể thực hiện các thao tác sau và khai báo một hàm dễ đọc hơn trong tệp .ts của thành phần:
*ngIf="isResponsiveLayout('Horizontal')"
Sạch sẽ hơn nhiều! Nhưng nếu ai đó gõ 'Horziontal'
nhầm thì sao? Toàn bộ lý do bạn muốn sử dụng một enum trong HTML là để an toàn đúng không?
Chúng ta vẫn có thể đạt được điều đó với keyof và một số phép thuật bản thảo. Đây là định nghĩa của hàm:
isResponsiveLayout(value: keyof typeof FeatureBoxResponsiveLayout)
{
return FeatureBoxResponsiveLayout[value] == this.featureBoxResponsiveService.layout.value;
}
Lưu ý cách sử dụng FeatureBoxResponsiveLayout[string]
để chuyển đổi giá trị chuỗi được truyền vào giá trị số của enum.
Điều này sẽ đưa ra một thông báo lỗi với trình biên dịch AOT nếu bạn sử dụng giá trị không hợp lệ.
Đối số của loại '"H4THER"' không thể gán cho tham số của loại '"Dọc" | "Ngang"
Hiện tại VSCode không đủ thông minh để gạch chân H4orizontal
trong trình soạn thảo HTML, nhưng bạn sẽ nhận được cảnh báo vào thời gian biên dịch (với --prod build hoặc --aot switch). Điều này cũng có thể được cải thiện trong một bản cập nhật trong tương lai.