Übergeben Sie Aufzählungen in Angular2-Ansichtsvorlagen


122

Können wir Enums in einer Angular2-Ansichtsvorlage verwenden?

<div class="Dropdown" dropdownType="instrument"></div>

Übergibt die Zeichenfolge als Eingabe:

enum DropdownType {
    instrument,
    account,
    currency
}

@Component({
    selector: '[.Dropdown]',
})
export class Dropdown {

    @Input() public set dropdownType(value: any) {

        console.log(value);
    };
}

Aber wie übergebe ich eine Enum-Konfiguration? Ich möchte so etwas in der Vorlage:

<div class="Dropdown" dropdownType="DropdownType.instrument"></div>

Was wäre die beste Vorgehensweise?

Bearbeitet: Beispiel erstellt:

import {bootstrap} from 'angular2/platform/browser';
import {Component, View, Input} from 'angular2/core';

export enum DropdownType {

    instrument = 0,
    account = 1,
    currency = 2
}

@Component({selector: '[.Dropdown]',})
@View({template: ''})
export class Dropdown {

    public dropdownTypes = DropdownType;

    @Input() public set dropdownType(value: any) {console.log(`-- dropdownType: ${value}`);};
    constructor() {console.log('-- Dropdown ready --');}
}

@Component({ selector: 'header' })
@View({ template: '<div class="Dropdown" dropdownType="dropdownTypes.instrument"> </div>', directives: [Dropdown] })
class Header {}

@Component({ selector: 'my-app' })
@View({ template: '<header></header>', directives: [Header] })
class Tester {}

bootstrap(Tester);

2
Besser als beide der folgenden Antworten, obwohl ähnlich, aber einfacher als die akzeptierte, ist: stackoverflow.com/a/42464835/358578
pbarranis

Antworten:


131

Erstellen Sie eine Eigenschaft für Ihre Aufzählung in der übergeordneten Komponente Ihrer Komponentenklasse, weisen Sie ihr die Aufzählung zu und verweisen Sie dann auf diese Eigenschaft in Ihrer Vorlage.

export class Parent {
    public dropdownTypes = DropdownType;        
}

export class Dropdown {       
    @Input() public set dropdownType(value: any) {
        console.log(value);
    };
}

Auf diese Weise können Sie die Aufzählung wie erwartet in Ihrer Vorlage auflisten.

<div class="Dropdown" [dropdownType]="dropdownTypes.instrument"></div>

2
Verschieben Sie basierend auf Ihrem Update Ihre enum-Eigenschaftsdeklaration in die übergeordnete Komponente.
David L

Oh, sicher, kommt aus seinem Kontext.
McLac

8
Auch hier, Downvoter, geben Sie bitte Feedback, wie diese Antwort verbessert werden kann, wenn Sie damit nicht einverstanden sind.
David L

1
Falls jemand Schwierigkeiten hat, dies zum Laufen zu bringen, beachten Sie, dass es im obigen Code "set dropdownType ()" und nicht "setDropDownType ()" ist. Ich habe eine Weile gebraucht, um das zu sehen. Es funktioniert jedoch auch mit einer Mitgliedsvariablen.
Murrayc

2
Ziemlich sicher, dass dropdownTypedie Vorlage an beiden Enden eckige Klammern haben sollte (wie so :), [dropdownType]da es sich um eine Variable und nicht um Text handelt.
Tom

169

Erstellen Sie eine Aufzählung

enum ACTIVE_OPTIONS {
    HOME = 0,
    USERS = 1,
    PLAYERS = 2
}

Erstellen Sie Ihre Komponente, und stellen Sie sicher, dass Ihre Aufzählungsliste den Typ enthält

export class AppComponent {
    ACTIVE_OPTIONS = ACTIVE_OPTIONS;
    active:ACTIVE_OPTIONS;
}

Erstellen Sie Ihre Ansicht

<li [ngClass]="{'active':active==ACTIVE_OPTIONS.HOME}">
    <a router-link="/in">
    <i class="fa fa-fw fa-dashboard"></i> Home
    </a>
</li>

4
Bessere Lösung als die akzeptierte. Ich denke, es verwendet eine neue TS-Funktion.
Greg Dan

2
Ich bin selbst kein Spezialist, also muss ich mich wirklich fragen: Ist diese Lösung immer besser als die von David L.? Dieser benötigt weniger Codezeilen, aber in Bezug auf die Speichernutzung wird möglicherweise eine Liste pro Instanz der Host-Komponentenklasse erstellt ... Und wenn dies zutrifft (ohne es zu sagen!), Gibt es kein großes Problem, wenn Umgang mit AppComponent, aber die Lösung ist möglicherweise nicht die beste im Fall einer CustomerComponent oder etwas wiederkehrenderem. Habe ich recht?
Rui Pimentel

2
Sie können das HTML wie folgt aktualisieren: [class.active] = "active === ACTIVE_OPTIONS.HOME"
Neil

6
Wie und warum ist das besser als die akzeptierte Lösung @GregDan?
Aditya Vikas Devarapalli

1
Aditya, es ist aus dem einfachen Grund besser, dass es sich um eine Klasse handelt, nicht um 2. Ich habe keine Elternklasse und werde sie aus diesem Grund nicht erstellen :)
Yuri Gridin

13

Wenn Sie den Namen Enum erhalten möchten:

export enum Gender {
       Man = 1,
       Woman = 2
   }

dann in der Komponentendatei

public gender: typeof Gender = Gender;

in Vorlage

<input [value]="gender.Man" />

2

Vielleicht musst du das nicht tun.

Zum Beispiel in Numeric Enum:

export enum DropdownType {
    instrument = 0,
    account = 1,
    currency = 2
}

In der HTML-Vorlage:

<div class="Dropdown" [dropdownType]="1"></div>

Ergebnis: dropdownType == DropdownType.account

oder String Enum:

export enum DropdownType {
    instrument = "instrument",
    account = "account",
    currency = "currency"
}
<div class="Dropdown" [dropdownType]="'currency'"></div>

Ergebnis: dropdownType == DropdownType.currency


Wenn Sie den Namen Enum erhalten möchten:

val enumValue = DropdownType.currency
DropdownType[enumValue] //  print "currency", Even the "numeric enum" is also. 

1
Nehmen wir an, ich gebe der Aufzählung keinen Wert. Wenn ich die Aufzählungsreihenfolge ändere, ist der HTML-Code falsch. Ich denke, das ist kein guter Ansatz
André Roggeri Campos
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.