ส่ง enums ในเทมเพลตมุมมอง angular2


123

เราสามารถใช้ enums ในเทมเพลตมุมมอง 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);
    };
}

แต่จะผ่านการกำหนดค่า enum ได้อย่างไร? ฉันต้องการสิ่งนี้ในเทมเพลต:

<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);
    };
}

สิ่งนี้ช่วยให้คุณสามารถระบุ enum ตามที่คาดไว้ในเทมเพลตของคุณ

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

2
จากการอัปเดตของคุณให้ย้ายการประกาศคุณสมบัติ enum ไปยังองค์ประกอบหลัก
David L

โอ้ได้มาจากบริบทของมัน
McLac

8
อีกครั้งผู้ลงคะแนนโปรดให้ข้อเสนอแนะเกี่ยวกับวิธีการปรับปรุงคำตอบนี้หากคุณไม่เห็นด้วย
David L

1
ในกรณีที่ใครก็ตามกำลังดิ้นรนเพื่อให้ใช้งานได้โปรดทราบว่า "set dropdownType ()" ไม่ใช่ "setDropDownType ()" ในโค้ดด้านบน ฉันใช้เวลาสักพักเพื่อดูว่า นอกจากนี้ยังทำงานกับตัวแปรสมาชิกด้วย
murrayc

2
ค่อนข้างแน่ใจว่าdropdownTypeในเทมเพลตควรมีวงเล็บเหลี่ยมที่ปลายทั้งสองข้าง (เช่นนั้น[dropdownType]:) เนื่องจากต้องใช้ var ไม่ใช่ข้อความ
ทอม

170

สร้าง enum

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

สร้างส่วนประกอบของคุณตรวจสอบให้แน่ใจว่ารายการ enum ของคุณมี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 ใหม่ ๆ
Greg Dan

2
ไม่ใช่ผู้เชี่ยวชาญเองดังนั้นฉันจึงต้องตั้งคำถามจริงๆ: วิธีนี้ดีกว่าของ David L. หรือไม่? อันนี้ใช้โค้ดน้อยกว่า แต่ในแง่ของการใช้หน่วยความจำมันอาจจะสร้างหนึ่งรายการต่ออินสแตนซ์ของคลาสคอมโพเนนต์โฮสต์ ... และถ้าเป็นจริง (ไม่ได้บอกว่าเป็น!) ก็ไม่มีปัญหามากนักเมื่อ จัดการกับ AppComponent แต่วิธีแก้ปัญหาอาจไม่ดีที่สุดในกรณีของ CustomerComponent หรือสิ่งที่เกิดขึ้นซ้ำ ๆ ฉันถูกไหม?
Rui Pimentel

2
คุณสามารถอัปเดต html เป็น: [class.active] = "active === ACTIVE_OPTIONS.HOME"
นีล

6
อย่างไรและทำไมถึงดีกว่าโซลูชันที่ยอมรับ @GregDan?
Aditya Vikas Devarapalli

1
Aditya มันจะดีกว่าสำหรับเหตุผลง่ายๆว่ามันเกี่ยวข้องกับคลาสเดียวไม่ใช่ 2 ฉันไม่มีคลาสหลักและจะไม่สร้างมันด้วยเหตุผลนั้น :)
Yuri Gridin

13

หากคุณต้องการได้รับชื่อ Enum:

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

จากนั้นในไฟล์คอมโพเนนต์

public gender: typeof Gender = Gender;

ในเทมเพลต

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

2

บางทีคุณไม่จำเป็นต้องทำเช่นนี้

ตัวอย่างเช่นใน Numeric 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 ใด ๆ ถ้าฉันเปลี่ยนลำดับ enum HTML จะผิด ฉันคิดว่านี่ไม่ใช่แนวทางที่ดี
André Roggeri Campos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.