Передати перерахунки в шаблонах перегляду angular2


123

Чи можемо ми використовувати перерахунки в шаблоні перегляду angular2?

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

передає рядок як вхід:

enum DropdownType {
    instrument,
    account,
    currency
}

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

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

        console.log(value);
    };
}

Але як пройти конфігурацію перерахунку? Я хочу щось подібне в шаблоні:

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

Яка найкраща практика?

Відредаговано: Створено приклад:

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
Краще , ніж обидва наведених нижче відповідей, хоча аналогічні , але простіше , ніж загальноприйнятому один, це: stackoverflow.com/a/42464835/358578
pbarranis

Відповіді:


132

Створіть властивість для enum на батьківському компоненті до класу компонентів та призначте йому enum, а потім посилайтеся на це властивість у вашому шаблоні.

export class Parent {
    public dropdownTypes = DropdownType;        
}

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

Це дозволяє перерахувати перерахунок, як очікувалося у вашому шаблоні.

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

2
На основі оновлення перенесіть декларацію про властивості enum на батьківський компонент.
Девід Л

О, звичайно, виходить із її контексту.
Маклак

8
Знову ж таки, нижче, будь ласка, надайте відгуки про те, як цю відповідь можна покращити, якщо ви не погоджуєтесь з нею.
Девід Л

1
Якщо хтось бореться за те, щоб це працювало, зауважте, що це "set dropdownType ()", а не "setDropDownType ()" у наведеному вище коді. На це мені знадобився певний час. Він також працює зі змінною члена.
murrayc

2
Досить впевнений, що dropdownTypeв шаблоні повинні бути квадратні дужки з обох кінців (наприклад, так [dropdownType]:), оскільки він має вар, а не текст.
Том

170

Створіть перерахунок

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

Створити свій компонент, переконайтеся , що ваш список перерахування матиме TYPEOF

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

Створіть свій погляд

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

4
Краще рішення, ніж прийняте. Я думаю, він використовує якусь нову функцію TS.
Грег Дан

2
Я сам не фахівець, тому мені справді доводиться сумніватися: чи завжди це рішення краще, ніж Девід Л.? Цей має менше рядків коду, але з точки зору використання пам’яті це може бути створення одного списку на екземпляр класу компонентів хоста ... І якщо це правда (не кажучи про це!), Проблем не буде, коли мати справу з AppComponent, але рішення може виявитися не найкращим у випадку CustomerComponent або чогось більш періодичного. Маю рацію?
Руй Піментел

2
Ви можете оновити html як: [class.active] = "active === ACTIVE_OPTIONS.HOME"
Ніл

6
як і чому це краще, ніж прийняте рішення @GregDan?
Aditya Vikas Devarapalli

1
Aditya, краще з тієї простої причини, що вона включає один клас, а не 2. У мене немає батьківського класу, і не збираюся його створювати з цієї причини :)
Юрій Гридін

13

Якщо ви хочете отримати ім'я Enum:

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

потім у компонентному файлі

public gender: typeof Gender = Gender;

в шаблон

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

2

Можливо, вам не потрібно цього робити.

Наприклад, в числовому Enum:

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

У шаблоні HTML:

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

результат: dropdownType == DropdownType.account

або String Enum:

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

результат: dropdownType == DropdownType.currency


Якщо ви хочете отримати ім'я Enum:

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

1
Скажімо, я не даю enum будь-якого значення, якщо я зміню замовлення перерахувань, HTML буде помилковим. Я думаю, що це не гарний підхід
Андре Роджері Кампос
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.