Typescript枚举看起来和Angular2的ngSwitch指令很匹配。但是当我试图在我的组件的模板中使用枚举时,我得到“无法读取属性'xxx'的未定义在…”如何在组件模板中使用枚举值?
请注意,这与如何基于枚举(ngFor)的所有值创建html选择选项不同。这个问题是关于基于枚举的特定值的ngSwitch。尽管出现了创建枚举的类内部引用的相同方法。
Typescript枚举看起来和Angular2的ngSwitch指令很匹配。但是当我试图在我的组件的模板中使用枚举时,我得到“无法读取属性'xxx'的未定义在…”如何在组件模板中使用枚举值?
请注意,这与如何基于枚举(ngFor)的所有值创建html选择选项不同。这个问题是关于基于枚举的特定值的ngSwitch。尽管出现了创建枚举的类内部引用的相同方法。
当前回答
如果使用“typetable reference”方法(来自@Carl G),并且你正在使用多个类型表,你可能会考虑这样做:
export default class AppComponent {
// Store a reference to the enums (must be public for --AOT to work)
public TT = {
CellType: CellType,
CatType: CatType,
DogType: DogType
};
...
dog = DogType.GoldenRetriever;
然后在html文件中访问
{{ TT.DogType[dog] }} => "GoldenRetriever"
我喜欢这种方法,因为它清楚地表明您引用的是一个类型表,而且还避免了对组件文件的不必要污染。
你也可以在某个地方放置一个全局TT,并根据需要添加枚举(如果你想这样做,你也可以像@VincentSels answer所示的那样创建一个服务)。如果你有很多很多的类型,这可能会变得很麻烦。
此外,您总是在声明中重命名它们以获得更短的名称。
其他回答
Angular4 -在HTML模板中使用Enum
解决方案:https://stackoverflow.com/a/42464835/802196
信用:@snorkpete
在你的组件中,你有
enum MyEnum{
First,
Second
}
然后在你的组件中,你通过成员'MyEnum'引入Enum类型,并为你的枚举变量'myEnumVar'创建另一个成员:
export class MyComponent{
MyEnum = MyEnum;
myEnumVar:MyEnum = MyEnum.Second
...
}
你现在可以在你的。html模板中使用myEnumVar和MyEnum。例如,在ngSwitch中使用枚举:
<div [ngSwitch]="myEnumVar">
<div *ngSwitchCase="MyEnum.First"><app-first-component></app-first-component></div>
<div *ngSwitchCase="MyEnum.Second"><app-second-component></app-second-component></div>
<div *ngSwitchDefault>MyEnumVar {{myEnumVar}} is not handled.</div>
</div>
你可以在你的组件类中创建一个对枚举的引用(我只是将初始字符改为小写),然后从模板(plunker)中使用该引用:
import {Component} from 'angular2/core';
enum CellType {Text, Placeholder}
class Cell {
constructor(public text: string, public type: CellType) {}
}
@Component({
selector: 'my-app',
template: `
<div [ngSwitch]="cell.type">
<div *ngSwitchCase="cellType.Text">
{{cell.text}}
</div>
<div *ngSwitchCase="cellType.Placeholder">
Placeholder
</div>
</div>
<button (click)="setType(cellType.Text)">Text</button>
<button (click)="setType(cellType.Placeholder)">Placeholder</button>
`,
})
export default class AppComponent {
// Store a reference to the enum
cellType = CellType;
public cell: Cell;
constructor() {
this.cell = new Cell("Hello", CellType.Text)
}
setType(type: CellType) {
this.cell.type = type;
}
}
这很简单,而且很有魅力:) 只是像这样声明你的枚举,你可以在HTML模板上使用它
statusEnum: typeof StatusEnum = StatusEnum;
作为@Eric Lease的装饰器(不幸的是,它不能使用——aot(因此也不能使用——prod)构建)的替代方案,我求助于使用一个公开应用程序所有枚举的服务。只需要公开地将它注入到每个需要它的组件中,在一个简单的名称下,之后你可以在视图中访问枚举。例如:
服务
import { Injectable } from '@angular/core';
import { MyEnumType } from './app.enums';
@Injectable()
export class EnumsService {
MyEnumType = MyEnumType;
// ...
}
不要忘记将它包含在模块的提供者列表中。
组件类
export class MyComponent {
constructor(public enums: EnumsService) {}
@Input() public someProperty: MyEnumType;
// ...
}
html组件
<div *ngIf="someProperty === enums.MyEnumType.SomeValue">Match!</div>
从rc开始。6 / final
...
export enum AdnetNetworkPropSelector {
CONTENT,
PACKAGE,
RESOURCE
}
<div style="height: 100%">
<div [ngSwitch]="propSelector">
<div *ngSwitchCase="adnetNetworkPropSelector.CONTENT">
<AdnetNetworkPackageContentProps [setAdnetContentModels]="adnetNetworkPackageContent.selectedAdnetContentModel">
</AdnetNetworkPackageContentProps>
</div>
<div *ngSwitchCase="adnetNetworkPropSelector.PACKAGE">
</div>
</div>
</div>
export class AdnetNetwork {
private adnetNetworkPropSelector = AdnetNetworkPropSelector;
private propSelector = AdnetNetworkPropSelector.CONTENT;
}