Angular2 görünüm şablonlarında numaralandırmaları geçirme


123

Bir angular2 görünüm şablonunda numaralandırmaları kullanabilir miyiz?

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

dizeyi girdi olarak geçirir:

enum DropdownType {
    instrument,
    account,
    currency
}

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

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

        console.log(value);
    };
}

Ancak bir enum yapılandırması nasıl geçilir? Şablonda buna benzer bir şey istiyorum:

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

En iyi uygulama ne olabilir?

Düzenlendi: Bir örnek oluşturuldu:

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
Aşağıdaki yanıtların her ikisinden de daha iyi, ancak benzer ancak kabul edilen
yanıttan

Yanıtlar:


132

Bileşen sınıfınıza üst bileşendeki numaralandırmanız için bir özellik oluşturun ve numaralandırmayı buna atayın, ardından şablonunuzda bu özelliğe başvurun.

export class Parent {
    public dropdownTypes = DropdownType;        
}

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

Bu, numaralandırmayı şablonunuzda beklendiği gibi numaralandırmanıza olanak tanır.

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

2
Güncellemenize bağlı olarak, enum özellik bildiriminizi üst bileşene taşıyın.
David L

Oh, tabii, bağlamından anlaşılıyor.
McLac

8
Yine, olumsuz oy veren, lütfen katılmıyorsanız bu cevabın nasıl iyileştirilebileceği konusunda geri bildirim sağlayın.
David L

1
Herhangi birinin bunu çalıştırmakta zorlanması durumunda, yukarıdaki kodda "setDropDownType ()" değil, "set dropdownType ()" olduğuna dikkat edin. Bunu görmem biraz zaman aldı. Aynı zamanda bir üye değişkeni ile de çalışır.
murrayc

2
Metin yerine bir değişken aldığından dropdownType, şablonda her iki ucunda da köşeli parantezlerin olması gerektiğinden oldukça emin olabilirsiniz (böyle [dropdownType]:).
Tom

170

Enum oluştur

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

Bileşeninizi oluşturun, sıralama listenizin typeof

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

Görünümünüzü oluşturun

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

4
Kabul edilenden daha iyi bir çözüm. Sanırım bazı yeni TS özelliği kullanıyor.
Greg Dan

2
Ben bir uzman değilim, bu yüzden gerçekten sorgulamalıyım: Bu çözüm her zaman David L.'ninkinden daha mı iyi? Bu, daha az kod satırı alır, ancak bellek kullanımı açısından, ana bilgisayar bileşen sınıfının her bir örneği için bir liste oluşturuyor olabilir ... Ve eğer bu doğruysa (öyle dememek!), AppComponent ile uğraşmak, ancak bir CustomerComponent veya daha tekrarlayan bir şey durumunda çözüm en iyisi olmayabilir. Haklı mıyım
Rui Pimentel

2
Html'yi şu şekilde güncelleyebilirsiniz: [class.active] = "active === ACTIVE_OPTIONS.HOME"
Neil

6
bu nasıl ve neden kabul edilen çözüm @GregDan'dan daha iyidir?
Aditya Vikas Devarapalli

1
Aditya, basit nedenden ötürü daha iyi, bir sınıf içermesi, 2 değil. Bir ebeveyn sınıfım yok ve bu nedenle onu yaratmayacağım :)
Yuri Gridin

13

Enum adını almak istiyorsanız:

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

sonra bileşen dosyasında

public gender: typeof Gender = Gender;

şablonda

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

2

Belki bunu yapmak zorunda değilsin.

Örneğin, Sayısal Enum'da:

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

HTML Şablonunda:

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

sonuç: dropdownType == DropdownType.account

veya String Enum:

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

sonuç: dropdownType == DropdownType.currency


Enum adını almak istiyorsanız:

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

1
Diyelim ki numaralandırmaya herhangi bir değer vermedim, eğer enum sırasını değiştirirsem HTML yanlış olur. Bunun iyi bir yaklaşım olmadığını düşünüyorum
André Roggeri Campos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.