Angular 9 Невозможно найти отличающийся вспомогательный объект '[object Object]' типа 'object'. NgFor поддерживает только привязку к итерациям, таким как массивы - PullRequest
0 голосов
/ 26 апреля 2020

Я использую asyn c pipe в своем шаблоне для Observable:

applicants$: Observable<UserProfile[]>;
  ngOnInit() {
    this.applicants$ = this.store.pipe(
      select(fromRootUserProfileState.getUserProfiles)
    ) as Observable<UserProfile[]>;
}

Вот интерфейс UserProfile.ts:

import { Role } from './role/role';
import { Country } from './Country';

export interface UserProfile {
  id?: number;
  fullName?: string;
  roles?: Role[];
  windowsAccount?: string;
  firstName?: string;
  lastName?: string;
  email?: string;
  managerName?: string;
  managerId?: number;
  managerEmail?: string;
  companyId?: number;
  companyName?: string;
  countryId?: number;
  country?: Country;
  countryName?: string;
}

А вот userProfile.service

  getUserProfiles(): Observable<UserProfile[]> {
    return this.http.get<UserProfile[]>(
      this.baseUrl + 'userprofiles/getuserprofiles'
    );
  }

В шаблоне, который я использовал ngFor для итерации по Observable с помощью asyn c pipe:

<mat-form-field
  fxFlex="22"
  appearance="outline"
  *ngIf="applicants$ | async as applicants"
>
  <mat-label>Applicant</mat-label>
  <mat-icon matPrefix>person</mat-icon>
  <mat-select
    placeholder="Applicant"
    name="applicant"
    [(ngModel)]="this.searchPurchaseOrder.applicantId"
  >
    <mat-option *ngFor="let ap of applicants" [value]="ap.id">
      ap.fullName
    </mat-option>
  </mat-select>
</mat-form-field>

Однако, вот ошибка, которую я получаю: enter image description here

Вот форма данных из магазина. Он населен, поэтому там нет проблем: enter image description here

Ответы [ 4 ]

1 голос
/ 26 апреля 2020

Вам нужно будет использовать канал значения ключа для l oop через ваш объект, как если бы это был массив.

https://angular.io/api/common/KeyValuePipe

<div *ngFor="let applicant of applicants | keyvalue">
  {{applicant.key}}:{{applicant.value}}
</div>

Это также может работать с асин * трубой c, например:

<div *ngFor="let item of (object$ | async) | keyvalue">
0 голосов
/ 26 апреля 2020

Благодаря Мэтту Сондерсу 'ответьте, что изменение в шаблоне сработало для моего случая:

<mat-form-field
  fxFlex="22"
  appearance="outline"
  *ngIf="this.applicants$ | async | keyvalue as applicants">
  <mat-label>Applicant</mat-label>
  <mat-icon matPrefix>person</mat-icon>
  <mat-select
    placeholder="Applicant"
    name="applicant"
    [(ngModel)]="this.searchPurchaseOrder.applicantId">
    <mat-option
      *ngFor="let applicant of applicants"
      [value]="applicant.value.id">
      {{ applicant.value.fullName }}
    </mat-option>
  </mat-select>
</mat-form-field>
0 голосов
/ 26 апреля 2020

Проблема здесь в том, что вы пытаетесь использовать ngFor для l oop через объект (что невозможно). Если вы можете опубликовать предварительный просмотр ответа на вкладке «Сеть», было бы полезно получить лучшее представление по этому вопросу.

0 голосов
/ 26 апреля 2020

Попробуйте использовать канал с псевдонимом также: let ap of applicants | async.

...