Ionic 离子离子选择选项不工作时,使用的服务作为提供的值直接在模板中

vcudknz3  于 2023-05-05  发布在  Ionic
关注(0)|答案(2)|浏览(195)

奇怪的事情发生在我身上,我想分享,可能是一些人知道为什么会这样。
所以模板:

<ion-select>
  <ion-select-option
    *ngFor="let transportMode of transportService.getTransportModes()"
    [value]="transportMode.id"
  >
    {{ transportMode.name }}
  </ion-select-option>
</ion-select>

.ts文件中,服务被注入:

constructor(
    protected transportService: TransportService,
  ) {}

服务只返回id/name对值的数组。就像这样:

getTransportModes(): TransportMode[] {
    return [
      {
        id: TransportModeTypes.VAN,
        name: 'Van',
      },
      {
        id: TransportModeTypes.TRACTOR,
        name: 'Tractor',
      },
      {
        id: TransportModeTypes.TRAILER,
        name: 'Trailer',
      },
      {
        id: TransportModeTypes.SHIP,
        name: 'Ship',
      },
    ];
  }
export enum TransportModeTypes {
  VAN = 1,
  TRACTOR = 2,
  TRAILER = 3,
  SHIP = 4,
}
export interface TransportMode {
  id: TransportModeTypes;
  name: string;
}

这个Ionic完美地构建了选择字段,但是当我点击下拉列表显示时,它会显示一个带有值和单选按钮的弹出窗口,而单选按钮是不可点击的,所以我不能选择一个值。这是非常奇怪的行为。
如果我在模板中进行更改并将值存储在单独的属性中-那么select就可以正常工作。
工作示例:
模板:

<ion-select>
  <ion-select-option
    *ngFor="let transportMode of transportModes"
    [value]="transportMode.id"
  >
    {{ transportMode.name }}
  </ion-select-option>
</ion-select>

.ts文件:

protected transportModes!: TransportMode[];

  constructor(
    private transportService: TransportService,
  ) {}

  ngOnInit(): void {
    this.transportModes = this.transportService.getTransportModes();
  }

我无法解释和猜测,为什么这是有效的,而上面的变体不起作用。有什么想法吗
我附上版本,只是为了更多的信息:

"@angular/core": "^15.2.7",
 "@ionic/angular": "7.0.3",
q35jwt9p

q35jwt9p1#

检查一下你的选择选项在一段时间后是否真的变成可点击的(以及有多快),这将是很有用的。
然而,在我看来,这似乎是在ngFor指令下调用方法的问题,因为每次检查DOM中的更改时都会检查/重新呈现。即使getTransportModes()所依赖的值没有改变,该方法也会在每次检查时执行。现在,即使这绝对是重新考虑逻辑并可能使用将在ts中设置值的var的原因(正如您在工作正常的情况下提到的那样),了解DOM检查更改的频率也很重要。
是否有一些鼠标事件触发得太频繁?模板中的其他方法调用?如果您的模板在每次DOM检查时都会触发许多方法,那么它可能会阻塞您的流程。

3z6pesqy

3z6pesqy2#

看来这里一定有什么麻烦。
下面是一个barebones test使用您提供的代码。正如您所期望的,数据是通过ngOnInit从服务中获取并存储在属性中,还是直接从组件模板中获取,这没有什么区别。
请参阅“Transport One”以从组件模板获取它。
请参阅“Transport Two”,了解通过ngOnInit获取它并将其存储在属性中。

相关问题