Không thể tiếp cận enum Typescript trong HTML


86

Tôi đã tạo một enum với Typescript để sử dụng trong MyService.service.ts MyComponent.component.ts và MyComponent.component.html.

export enum ConnectionResult {
    Success,
    Failed     
}

Tôi có thể dễ dàng lấy và so sánh một biến enum được xác định từ MyService.service.ts:

this.result = this.myService.getConnectionResult();

switch(this.result)  
{
    case ConnectionResult.Failed:
         doSomething();
         break;
    case ConnectionResult.Success:
         doSomething();
         break;
}

Tôi cũng muốn sử dụng enum để so sánh trong HTML của mình bằng cách sử dụng câu lệnh * ngIf:

<div *ngIf="result == ConnectionResult.Success; else failed">
            <img src="../../assets/connection-success.png" height="300px" class="image-sign-style" />
</div>
<ng-template #failed>
       <img src="../../assets/connection-failed.png" height="300px" class="image-sign-style" />
</ng-template>

Mã biên dịch nhưng trình duyệt báo cho tôi lỗi:

Không thể đọc thuộc tính của undefined

nhập mô tả hình ảnh ở đây

Với dòng lỗi chỉ báo html sau:

nhập mô tả hình ảnh ở đây

Có ai biết tại sao enum không thể được tiếp cận như thế này?

Câu trả lời:


152

Phạm vi của mẫu được giới hạn cho các thành viên cá thể thành phần. Nếu bạn muốn tham khảo một cái gì đó thì nó cần phải có sẵn ở đó

class MyComponent {
  public get connectionResult(): typeof ConnectionResult {
    return ConnectionResult; 
  }
}

Trong HTML bây giờ bạn có thể sử dụng

*ngIf="connectionResult.Success"

Xem thêm Angular2 truy cập các biến toàn cục từ mẫu HTML


1
Kể từ khi tôi đang nghiêm túc theo các tiêu chuẩn mã hóa, loại dữ liệu, tôi phải từ bỏ cho connectionResult
Nasrul Bharathi

Tôi không biết. Tôi chỉ sử dụng TypeScript trong Plunker và không có kiểm tra loại nào. Tôi mong rằng thông báo lỗi cho bạn biết loại mong đợi khi bạn sử dụng loại không tương thích, phải không?
Günter Zöchbauer

Cảm ơn, hãy để tôi bắt đầu một cuộc trò chuyện mới trong stack overflow
Nasrul Bharathi

1
Vâng, chỉ một thành viên sở hữu đơn thuần không phù hợp với tôi, nhưng việc đặt nó như một getter hoạt động.
Kon

1
Không phải như trong câu trả lời khác mà bạn có thể giữ tên. (Tuy nhiên, có thể tạo ra các vấn đề khác, những vấn đề mà tôi chưa phát hiện ra)
LosManos

51

Bạn sẽ phải viết nó theo cách sau trong .tstệp.

enum Tenure { day, week, all }

export class AppComponent {
    tenure = Tenure.day
    TenureType = Tenure
}

Và bây giờ trong html, bạn có thể sử dụng như thế này

*ngIf = "tenure == TenureType.day ? selectedStyle : unSelectedStyle"

Tôi hy vọng nó rõ ràng hơn bây giờ. :)


3
Đừng quên sử dụng '=' và không phải ':', giữa TenureType và Tenure, tức là gán kiểu không xác định nó. Tôi chỉ mắc sai lầm đó khi bỏ qua những gì @Nikhil đã viết. +1
Jacques

26

Bạn chỉ có thể thêm enum vào thành phần của mình dưới dạng thuộc tính và sử dụng cùng tên của enum (Quarters) trong các mẫu của mình:

enum Quarters{ Q1, Q2, Q3, Q4}

export class AppComponent {
   quarter = Quarters.Q1
   Quarters = Quarters
}

Trong mẫu của bạn

<div *ngIf="quarter == Quarters.Q1">I=am only visible for Q1</div> 

Lý do tại sao điều này hoạt động là vì porperty mới về cơ bản thuộc loại này:

TileType: typeof TileType

Nếu bạn muốn xuất ra tên của enum, như trong a divhoặc mat-iconbạn phải tham chiếu đến enum, chứ không phải trực tiếp mục. Dễ hiển thị hơn là giải thích:<mat-icon svgIcon="{{Quarters[Quarters.Q1]}}"></mat-icon>
LosManos

đây chắc chắn là cách sạch sẽ nhất
d3vtoolsmith

0

Bạn có thể liên kết dưới dạng văn bản nếu enum được xác định như bên dưới (những giá trị đó sẽ không thực thi giá trị chuỗi json đến từ API)

  export enum SomeEnum {
      Failure,
      Success,
  }

Trong tệp .ts

public status: SomeEnum;

Trong .html

<div *ngIf="status == 'Success'">

Một cách khác, đã được thử nghiệm trong Angular 8+ là có enums với các số

  export enum SomeEnum {
      Failure = 0,
      Success = 1,
  }

Trong tệp .ts

public status: SomeEnum;

Trong .html

<div *ngIf="status == 1">


Tôi tin rằng tất cả các enums đều tự động đi kèm với các con số
siêu IT guy

Bạn có thể tin những gì bạn muốn nhưng tôi đã thử nghiệm nó và do đó cung cấp 2 cách tiếp cận. Vì vậy, không, nếu bạn không chỉ định một số, nó không đi kèm với một số như trong C #. Hành vi này có thể tùy thuộc vào phiên bản TypeScript (+ có thể là phiên bản Angular frx)
Pawel Cioch vào
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.