значение перечисления неправильно оценивается в шаблоне Angular 9

App .component.html

<div *ngFor="let file of files">
 <p>value : {{file.type}}</p>
 <p>bool : {{file.type === FileAccessType.ENTRY_CREATE}}
</div>

app.component.ts

export class AppComponent{
 files : FileAccess[];
 FileAccessType : FileAccessType;
}

file-access.ts

export interface FileAccess {
   path: string;
   type: FileAccessType;
   timestamp: number;
}

файл-доступ-type.ts

export enum FileAccessType{
   ENTRY_CREATE,
   ENTRY_DELETE,
   ENTRY_MODIFY
}

логическое сравнение в шаблоне работает не так, как ожидалось

{{file.type === FileAccessType.ENTRY_CREATE}} //always gives false

ссылка: stackblitz

2 ответа

В app.component вы должны объявить свою переменную enum следующим образом readonly FileAccessType = FileAccessType;

Компоненты Angular не могут выводить типы как перечисления для уценки HTML.
Итак, как упоминал @Oleksii, вы должны объявить внутреннюю переменную для хранения типа, тогда Angular сможет выполнять оценку из HTML и получать доступ к значениям перечисления.

*.html

<div *ngFor="let file of files">
    <p> Value : {{ file.type }} </p>
    <p> Bool : {{ file.type === fileType.ENTRY_CREATE }}
</div>

*.ts

export class FilesComponent {

  fileType = FileAccessType; // Type assign
  files = [...files]; // This is just mocked data

  constructor() {}

}

В качестве альтернативы вы можете делегировать ответственность за условие компоненту, например

export class FilesComponent {

  files = [...files]; // This is just mocked data

  constructor() {}

  isCreateType = (file: FileAccess) => file.type === FileAccessType.ENTRY_CREATE;
}

Теперь вам не нужно открывать перечисление в HTML.

<div *ngFor="let file of files">
    <p>value : {{ file.type }}</p>
    <p>bool : {{ isCreateType(file) }}
</div>
Другие вопросы по тегам