Vượt qua enums trong các mẫu chế độ xem angle2


122

Chúng ta có thể sử dụng enum trong mẫu khung nhìn angle2 không?

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

chuyển chuỗi làm đầu vào:

enum DropdownType {
    instrument,
    account,
    currency
}

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

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

        console.log(value);
    };
}

Nhưng làm thế nào để vượt qua một cấu hình enum? Tôi muốn một cái gì đó như thế này trong mẫu:

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

Thực hành tốt nhất sẽ là gì?

Đã chỉnh sửa: Đã tạo một ví dụ:

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
Tốt hơn cả các câu trả lời dưới đây, mặc dù tương tự nhưng đơn giản hơn so với cái được chấp nhận, đó là: stackoverflow.com/a/42464835/358578
pbarranis

Câu trả lời:


131

Tạo một thuộc tính cho enum của bạn trên thành phần mẹ cho lớp thành phần của bạn và gán enum cho nó, sau đó tham chiếu thuộc tính đó trong mẫu của bạn.

export class Parent {
    public dropdownTypes = DropdownType;        
}

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

Điều này cho phép bạn liệt kê enum như mong đợi trong mẫu của bạn.

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

2
Dựa trên bản cập nhật của bạn, hãy di chuyển khai báo thuộc tính enum của bạn sang thành phần mẹ.
David L

Ồ, chắc chắn, lấy từ ngữ cảnh của nó.
McLac

8
Xin nhắc lại, xin hãy cung cấp phản hồi về cách cải thiện câu trả lời này nếu bạn không đồng ý với nó.
David L

1
Trong trường hợp bất kỳ ai đang gặp khó khăn để làm cho điều đó hoạt động, hãy lưu ý rằng đó là "set dropdownType ()", không phải "setDropDownType ()" trong đoạn mã trên. Tôi đã mất một lúc để thấy điều đó. Nó cũng hoạt động với một biến thành viên.
murrayc

2
Khá chắc chắn dropdownTypetrong mẫu phải có dấu ngoặc vuông ở cả hai đầu (như sau [dropdownType]:) vì nó sử dụng var chứ không phải văn bản.
Tom

169

Tạo một enum

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

Tạo thành phần của bạn, hãy chắc chắn rằng danh sách enum của bạn sẽ có typeof

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

Tạo chế độ xem của bạn

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

4
Giải pháp tốt hơn giải pháp được chấp nhận. Tôi đoán nó sử dụng một số tính năng TS mới.
Greg Dan

2
Bản thân không phải là một chuyên gia, vì vậy tôi thực sự phải đặt câu hỏi: giải pháp này luôn tốt hơn giải pháp của David L. Cái này tốn ít dòng mã hơn, nhưng về mặt sử dụng bộ nhớ, nó có thể đang tạo một danh sách cho mỗi trường hợp của lớp thành phần máy chủ ... Và nếu điều này là đúng (không nói là có!), Không có nhiều vấn đề khi giao dịch với AppComponent, nhưng giải pháp có thể không phải là tốt nhất trong trường hợp CustomerComponent hoặc thứ gì đó lặp lại nhiều hơn. Tôi nói đúng chứ?
Rui Pimentel

2
Bạn có thể cập nhật html dưới dạng: [class.active] = "active === ACTIVE_OPTIONS.HOME"
Neil

6
làm thế nào và tại sao điều này tốt hơn giải pháp được chấp nhận @GregDan?
Aditya Vikas Devarapalli

1
Aditya, tốt hơn là vì lý do đơn giản, nó liên quan đến một lớp chứ không phải 2. Tôi không có lớp cha và sẽ không tạo ra nó vì lý do đó :)
Yuri Gridin

13

Nếu bạn muốn lấy tên Enum:

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

sau đó trong tệp thành phần

public gender: typeof Gender = Gender;

trong mẫu

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

2

Có lẽ bạn không cần phải làm điều này.

Ví dụ, trong Numeric Enum:

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

Trong Mẫu HTML:

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

kết quả: dropdownType == DropdownType.account

hoặc Chuỗi Enum:

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

kết quả: dropdownType == DropdownType.currency


Nếu bạn muốn lấy tên Enum:

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

1
Hãy nói rằng tôi không cung cấp bất kỳ giá trị nào cho enum, nếu tôi thay đổi thứ tự enum thì HTML sẽ sai. Tôi nghĩ đây không phải là một cách tiếp cận tốt
André Roggeri Campos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.