Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I use ngFor to iterate over Typescript Enum as an array of strings

I'm using Angular2 and TypeScript and I have an enum:

export enum Role {     ServiceAdmin, CompanyAdmin, Foreman, AgentForeman,      CrewMember, AgentCrewMember, Customer } 

I want to use *ngFor to iterate over the enum. What is the best way to do this? Must I create a Pipe? Or is there a simpler way?

like image 401
Rob Gorman Avatar asked Jul 24 '16 17:07

Rob Gorman


People also ask

Can you iterate over an enum?

Enums don't have methods for iteration, like forEach() or iterator(). Instead, we can use the array of the Enum values returned by the values() method.

Can you loop through enum Javascript?

Iterating over the keys Of course, it's also possible to loop over the keys of a string enum, using Object.

Are TypeScript enums strings?

Enums allow a developer to define a set of named constants. Using enums can make it easier to document intent, or create a set of distinct cases. TypeScript provides both numeric and string-based enums.


1 Answers

An enum is just an object.

Your enum is written something like this in JavaScript:

{     0: "ServiceAdmin",      1: "CompanyAdmin",      2: "Foreman",      3: "AgentForeman",      4: "CrewMember",      5: "AgentCrewMember",      6: "Customer",      ServiceAdmin: 0,      CompanyAdmin: 1,      Foreman: 2,      AgentForeman: 3,      CrewMember: 4,     AgentCrewMember: 5,     Customer: 6 } 

So you can iterate it this way (plnkr):

@Component({     ...     template: `     <div *ngFor="let item of keys()">       {{ item }}     </div>     ` }) export class YourComponent {     role = Role;     keys() : Array<string> {         var keys = Object.keys(this.role);         return keys.slice(keys.length / 2);     } } 

Or would be better to create custom pipe:

@Pipe({   name: 'enumToArray' }) export class EnumToArrayPipe implements PipeTransform {   transform(data: Object) {     const keys = Object.keys(data);     return keys.slice(keys.length / 2);   } } 

Example

Update

Typescript 2.4 allows enum members to contain string initializers like:

enum Colors {     Red = "RED",     Green = "GREEN",     Blue = "BLUE", } 

in this case you can just return Object.keys(data); from pipe.

like image 169
yurzui Avatar answered Sep 22 '22 12:09

yurzui