【问题标题】:PrimeNG dropdown showing empty optionsPrimeNG 下拉菜单显示空选项
【发布时间】:2020-11-04 23:13:32
【问题描述】:

我的应用程序 UI 基于 PrimeNG,我正在处理动态表单并通过 API 获取表单字段配置。我的 PrimeNG 下拉菜单显示空选项。这是供参考的图像:

这是 PrimeNG 下拉菜单的代码:

 <p-dropdown *ngIf="field.IsLookup == 'Y'" [options]="field.LookupVal.split('|')" 
        [id]="field?.ColumnName"
        [formControlName]="field?.ColumnName"
      [showClear]="true">
</p-dropdown>

使用 Bootstrap 选择它工作正常,但我想通过 PrimeNG 实现这一点,这里是 Bootstrap 选择的代码:

 <select
      *ngIf="field.IsLookup == 'Y'"
        class="form-control"
        [id]="field?.ColumnName"
        [formControlName]="field?.ColumnName"
      >
        <option *ngFor="let opt of field.LookupVal.split('|')" [value]="opt">{{
          opt
        }}</option>
 </select>

这是我从 API 获得的下拉列表数据: LookupVal: "KK-ID-IDEAS - KARACHI|00001-Karachi|KHI-KARACHI NEW |14121-BDJJSJBSJ"

请帮我找到出路?

【问题讨论】:

  • 尝试在标签和值中添加下拉值。访问此link

标签: angular primeng primeng-dropdowns


【解决方案1】:

您可以像这样在构造函数中使用它,如@JeremyLucas 所述。只需使用 settimeout 和 if 条件

 setTimeout(() => {
                 if(this.field.IsLookup == 'Y'){

        this.array = this.field.LookupVal.split('|').map((o) => ({
          label: o,
          value: o,
        }))
        console.log(this.array, "array");
        
        }
      
    
    }, 1000);
    

【讨论】:

    【解决方案2】:

    这些下拉列表为空白的原因是 PrimeNg 需要所有下拉列表的模型。在您的组件中,模型如下所示,例如:

    this.dropdownContent = [
      { label: 'label1', value: 'content1' },
      { label: 'label2', value: 'content2' },
      ...
    ];
    

    由于是这种情况,您的[options]="field.LookupVal.split('|')" 很可能不满足下拉组件的模型要求。

    首先,如果您可以手动使用数据并将其放入模型中,我会检查您的组件内部,以便每个值都有一个标签和值。如果这不起作用,那么我建议使用其他 2 种方法来解决此问题。

    1 地图(最简单的方法)

    通过在组件中映射模型。

    当数据从 api 进来时,你应该把它映射成下拉列表。像这样的东西,基于您提供的下拉样本中的数据。请注意,这可能在您的订阅、可观察、ngOnInit 或其他地方。就在您获取和处理数据的任何地方...:

    this.options = this.apiData.LookupVal.split('|')".map((o) => ({
      label: o,
      value: o,
    }));
    

    现在,在您的 html 中,将您的选项更改为 [options]="options",或者您在组件中命名的任何名称。这里发生了什么,您正在映射或更改数据以适应模型要求。因此,如果field.LookupVal.split('|') 或任何组件数据的值为foo,那么它现在的值为{ label: 'foo', value: 'foo' }

    2 管道(更复杂,仅在必要时或您经常这样做时)

    如果这不起作用,或者您无法实现,则下一个选项是创建管道。您可能希望管道将数组中的每个项目转换为具有标签和值,就像您对地图所做的那样。像这样的东西(可能需要根据您的具体情况进行更改):

    import { Pipe, PipeTransform } from '@angular/core';
    import { SelectItem } from 'primeng/api';
    
    @Pipe({ name: 'dropdownPipe' })
    export class DropdownPipe implements PipeTransform {
      @param array
      @param labelKey
    
    transform(array: any[], labelKey: string | string[]): SelectItem[] {
      if(!labelKey || !array) {
        return undefined;
      }
      
      let pipeArray;
      
      if (labelKey instanceof Array) {
        for (let o = 2; o < labelKey.length; o++) {
          pipeArray = array.map((val, i) => ({
            label: pipeArray[i].label + val[labelKey[o]],
            value: val
         }));
      }
      return pipeArray;
    }      
    

    然后,在您的 html 中,您可以添加以下内容(确保管道位于您的应用或组件模块中)

    <p-dropdown 
      *ngIf="field.IsLookup == 'Y'" 
      [options]="field.LookupVal.split('|') | dropdownPipe" 
      [id]="field?.ColumnName"
      [formControlName]="field?.ColumnName"
      [showClear]="true">
    </p-dropdown>
    

    【讨论】:

    • 感谢您的回答,实际上我使用 api 的地方是我的父组件,而我使用的下拉菜单是我的曾孙组件。正如我所说,我正在研究动态字段生成器。要更好地理解组件的层次结构,请参考此链接:stackblitz.com/edit/…
    • 我正在使用 @Input 装饰器从它的父组件中获取字段。但是当我在 ngOnInit() 生命周期挂钩中将其记录在控制台上时,它显示为空,即 {}。所以,这就是为什么我直接在我的模板中使用拆分器,因为我无法在打字稿中解决问题。
    • 感谢@JeremyLucas 的地图功能 :) 太棒了!
    • 抱歉没有看到剩下的问题。我很高兴你解决了!祝你的项目好运:)
    • 你真好:)
    猜你喜欢
    • 2020-10-02
    • 2016-11-24
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2014-09-28
    • 2019-04-30
    • 2021-03-07
    相关资源
    最近更新 更多