Ich benutze Angular2 und Typscript. Ich habe eine Aufzählung:
export enum Role {
ServiceAdmin, CompanyAdmin, Foreman, AgentForeman,
CrewMember, AgentCrewMember, Customer
}
Ich möchte * ngFor verwenden, um über die Aufzählung zu iterieren. Was ist der beste Weg, dies zu tun? Muss ich ein Rohr erstellen? Oder gibt es einen einfacheren Weg?
angular
angular2-template
Rob Gorman
quelle
quelle
Antworten:
Eine Aufzählung ist nur ein Objekt.
Ihre Aufzählung ist ungefähr so in JavaScript geschrieben:
{ 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 }
Sie können es also folgendermaßen iterieren ( 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); } }
Oder wäre besser, benutzerdefinierte Pipe zu erstellen :
@Pipe({ name: 'enumToArray' }) export class EnumToArrayPipe implements PipeTransform { transform(data: Object) { const keys = Object.keys(data); return keys.slice(keys.length / 2); } }
Beispiel
Aktualisieren
Mit Typescript 2.4 können Enum-Mitglieder Zeichenfolgeninitialisierer enthalten wie:
enum Colors { Red = "RED", Green = "GREEN", Blue = "BLUE", }
In diesem Fall können Sie einfach
Object.keys(data);
vom Rohr zurückkehren.quelle
return Object.keys(data);
role = Object.keys(Role)
in Ihrer Komponente.Sie können einfach die in Angular 6.1 eingeführte "keyvalue" -Pipe verwenden.
Ein vollständiges Beispiel finden Sie hier -> https://stackblitz.com/edit/angular-gujg2e
quelle
Der Bereich der Vorlage ist die Komponenteninstanz. Wenn Sie auf etwas außerhalb dieses Bereichs zugreifen möchten, müssen Sie es über Ihre Komponenteninstanz verfügbar machen:
Dies funktioniert auch, wenn die Aufzählungstasten nicht mit 0 beginnen
@Pipe({name: 'enumToArray'}) export class EnumToArrayPipe implements PipeTransform { transform(value) : Object { return Object.keys(value).filter(e => !isNaN(+e)).map(o => { return {index: +o, name: value[o]}}); } } @Component({ ... imports: [EnumsToArrayPipe], template: `<div *ngFor="let item of roles | enumToArray">{{item.index}}: {{item.name}}</div>` }) class MyComponent { roles = Role; }
Siehe auch https://stackoverflow.com/a/35750252/217408
quelle
Ich musste das Gleiche tun und vielleicht war es das, was du wolltest.
Mehr TROCKEN und es kann auch mit verwendet
module
werden.export enum Role { ServiceAdmin, CompanyAdmin, Foreman, AgentForeman, CrewMember, AgentCrewMember, Customer } export namespace Role { export function keys(): Array<string>{ var keys = Object.keys(Role); return keys.slice(keys.length / 2, keys.length-1); } }
das Objekt, das vor dem Slice ausgegeben wird
Typoskript führt die beiden Deklarationen zusammen, daher die
keys.lenght-1
und die
ngFor
:Weitere Informationen:
Zusammenführung der Typescript-Erklärung
basierend auf:
TypeScript: Hinzufügen von Funktionen zu einer Aufzählung https://basarat.gitbooks.io/typescript/content/docs/enums.html (am Ende des Aufzählungskapitels )
quelle
keys.lenght-1
Nach weiteren Recherchen und Überprüfungen der anderen Antworten kann ich nun eine Antwort auf meine Frage formulieren. Ich denke, es ist nicht möglich, einfach * ngFor zu verwenden, um über eine Aufzählung zu iterieren, ohne dass die Komponente Code unterstützt. Die Codeunterstützung kann aus Konstruktorcode bestehen, der die Aufzählung in eine Art Array verwandelt, oder wir können eine benutzerdefinierte Pipe erstellen, die etwas Ähnliches tut.
quelle
Ihre Winkelkomponente.ts:
quelle
Ich habe die Aufzählung:
In der Komponente ts-Datei:
Zeigen Sie in der HTML-Vorlage die Werte und Schlüssel dieser Aufzählung an:
quelle
mit Rohr:
und in der Vorlage:
quelle
Ich empfehle Ihnen, ein generisches Pipe zu verwenden. Es ist flexibler und weniger redundant in Ihrem Code. Das Problem bei einigen früheren Aussagen ist, dass das Typoskript es Ihnen ermöglicht, eine andere Art von Aufzählung zu haben, nicht nur Zahl / Zeichenfolge.
Zum Beispiel:
Hier ist meine Lösung:
und das HTML wird sein:
in ts:
Hinweis: Es ist immer noch interessant zu sehen, wie Leute ohne Erklärung ein Minus setzen ... Für andere, die an dieser Lösung interessiert sein könnten, kann ich bestätigen, dass sie korrekt funktioniert.
quelle
ES6 unterstützt
quelle
In Angular 7 wird bei Verwendung von keys () weiterhin eine Liste aller Schlüssel und Werte angezeigt.
Basierend auf den obigen Antworten verwende ich dies für eine einfache ENUM, scheint sauberer und OO:
dann in der Vorlage:
Die Funktion wird zu einem weiteren Eintrag in der Aufzählung, wird jedoch wie die anderen Nicht-Zahlen herausgefiltert.
quelle