【问题标题】:Iterate Enum in ngFor, Angular5在 ngFor、Angular5 中迭代枚举
【发布时间】:2018-05-29 21:02:09
【问题描述】:

我正在尝试迭代 TypeScript 中的枚举以创建与它们对应的单选按钮。我知道如何使用数组来做到这一点,但我很难用枚举来做到这一点。

enum labelModes{
'MultiClass',
'MultiLabel'
}
@Component({
    selector: 'app-label-type',
    template: `
    
    <div class="text-center p-2">
    Type of labeling:<br> 
       <div *ngFor = "let labelMode of labelModes">
            <input
                type = "radio"
                name = "labelType"
                value = "{{labelMode}}"
                (change) = "radioChangeHandler($event)"> {{labelMode}}
    </div>
  `
})

什么都没有

【问题讨论】:

    标签: angular enums ngfor


    【解决方案1】:

    我的代码迭代枚举。我必须为元素设置值,然后使用键和对象访问它们。理想情况下,您应该能够使用object.keys(labelModes) 而不是keys(values)。但这是对我有用的唯一方法。

    枚举左侧的值被返回。

    export enum labelModes {
      multiclass = "multiclass",
      multilabel = "multilabel"
    }
    @Component({
      selector: "app-label-type",
      template: `
      
      <div class="text-center p-2">
        Type of labeling:<br> 
           <div *ngFor = "let labelMode of values">
                <input
                    type = "radio"
                    name = "labelType"
                    value = "{{labelMode}}"
                    (change) = "radioChangeHandler($event)"> {{labelMode}}
          </div>
        `
        })
    export class LabelType {
      ngOnInit() {}
      selectedLabelType: string = " ";
         
      values = Object.keys(labelModes);
    }
    

    【讨论】:

    • 这可以通过编写values = Object.keys(labelModes) 并删除keys 属性来简化。
    • 我也提到它可以简化为,但由于某种原因,当我尝试这样做时,它对我不起作用。 @DavidWalschots
    • 您可能尝试在视图中写入Object.keys(labelModes)?那是行不通的。
    • @DavidWalschots 是的,我试过了,但没有用。你知道为什么它不起作用吗?
    • Angular 视图不是完整的 JavaScript“上下文”。您只能使用组件的公共属性、您在视图中声明的变量、$event,可能还有其他一些特定变量。
    【解决方案2】:

    你有两个错误:

    • 枚举不是可迭代对象。您需要将其转换为数组(这取决于您使用的是字符串还是数字枚举)。
    • 您在组件模板中使用了局部变量。在模板中只能访问类字段。

    关键问题 - 你真的需要枚举吗?似乎非常适合数组:

    @Component({
        selector: 'app-label-type',
        template: `
    
        <div class="text-center p-2">
        Type of labeling:<br> 
           <div *ngFor = "let labelMode of labelModes">
                <input
                    type = "radio"
                    name = "labelType"
                    value = "{{labelMode}}"
                    (change) = "radioChangeHandler($event)"> {{labelMode}}
        </div>
      `
    })
    class Component {
         labelModes = ['MultiClass', 'MultiLabel']
    }
    

    实际上,枚举很容易被误解(尤其是数字枚举和字符串枚举之间的区别),如果我不使用它们,我通常更喜欢用普通对象或数组替换它们。

    【讨论】:

    • 我需要使用枚举,因为我希望以后能够做一些事情,比如 if labelMode == 'Multiclass' do something.
    • @inspired_learner 提问更多代码,你想如何使用它
    猜你喜欢
    • 2018-08-29
    • 2011-02-07
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 2017-05-12
    • 2014-06-09
    • 1970-01-01
    • 2011-10-06
    相关资源
    最近更新 更多