我在Angular 循环方面做了很多工作,但在这种情况下,我甚至无法在循环中正确呈现简单的UI元素. Select 元素确定在下面的循环中呈现的内容.在下面的示例中,循环似乎在没有用户输入的情况下一次又一次地计算函数:

  achievementTypes = [
    { value: 'photos_containing_all_of', label: 'Photos Containing All Of' },
    { value: 'photos_containing_only_category', label: 'Photos Containing Only Category' },
    { value: 'photos_of_distinct_groceries', label: 'Global: Different Categories across all images' },
    { value: 'photos_contains_at_least', label: 'Photos Containing At least x groceries' },
  ];
    <select [(ngModel)]="selectedType" name="selectedType" [ngModelOptions]="{ standalone: true }" class="custom-select">
        <option *ngFor="let type of achievementTypes" [value]="type.value">{{ type.label }}</option>
    </select>

    <div *ngIf="selectedType">
      <div *ngFor="let param of getRequiredParams(selectedType)">
          <span>{{ param.label }}</span>
          <!-- Uncommenting this will freeze the UI upon select -->
          <!-- <input [(ngModel)]="achievementParams[param.key]" /> -->
      </div>
    </div>

这是我在循环中调用的函数.我打算为动态呈现的UI组件使用它的值:

  getRequiredParams(type: string): any[] {
    let result = [{key: 'missing',  label: 'mssing label'}];
    switch (type) {
      case 'photos_containing_all_of':
        result = [
          { key: 'setOfGroceries', label: 'Set of Groceries' },
          { key: 'requiredPhotoCount', label: 'Required Photo Count' }
        ];
        break;
      case 'photos_containing_only_category':
        result = [
          { key: 'category', label: 'Category' },
          { key: 'requiredPhotoCount', label: 'Required Photo Count' }
        ];
        break;
      case 'photos_of_distinct_groceries':
        result =  [
          { key: 'requiredDistinctGroceries', label: 'Required Distinct Groceries' }
        ];
        break;
      case 'photos_contains_at_least':
        result = [
          { key: 'groceryCount', label: 'Grocery Count' },
          { key: 'requiredPhotoCount', label: 'Required Photo Count' }
        ];
        break;
      // Add more cases for other types
      default:
        result = [{key: 'missing',  label: 'mssing label'}];
    }
    console.log(result);
    return result;
  }

一旦我 Select 了一个值并设置了seltedType,就会不断地调用getRequiredParams函数,我可以在控制台中看到这一点.因此,一旦我在输入元素中进行注释,用户界面就会冻结.我不明白问题出在哪里.到目前为止还没有抛出任何错误.

也许这并不重要,但组件是一个对话框组件. 另外,我用的是12号角.

如何才能以正确的方式做到这一点?

推荐答案

问题在于您在模板中调用了getRequiredParams().默认情况下,对于更改检测树中所做的每一项更改,组件都会疯狂地重新呈现.

也许可以试试这样的...

<select ... (ngModelChange)="updateRequiredParams($event)">...</select>
@Component({...}) {
  ...
  updateRequiredParams(achievmentType: string) {
    this.requiredParams = this.getRequiredParams(achievmentType)
  }
}

...和*NG用于所需的参数

Typescript相关问答推荐

脉轮ui打字脚本强制执行图标按钮的咏叹调标签-如何关闭

如何将绑定到实例的类方法复制到类型脚本中的普通对象?

数组文字中对象的从键开始枚举

如何在TypeScrip中使用嵌套对象中的类型映射?

如何在Typescript 中输入两个相互关联的变量?

Next.js错误:不变:页面未生成

TypeScrip-将<;A、B、C和>之一转换为联合A|B|C

如何解决类型T不能用于索引类型{ A:typeof A; B:typeof B;. }'

表单嵌套太深

转换器不需要的类型交集

缩小对象具有某一类型的任意字段的范围

如何使用泛型函数参数定义类型脚本函数

为什么在泛型方法中解析此promise 时会出现类型错误?

作为函数参数的联合类型的键

Typescript,如何在通过属性存在过滤后重新分配类型?

如何键入并类型的函数&S各属性

为什么`map()`返回类型不能维护与输入相同数量的值?

Typescript 从泛型推断类型

TS2532:对象可能未定义

使用 TypeScript 在 SolidJS 中绘制 D3 力图