如何在 Angular 4/2 选择中显示对象的某个字段?

Posted

技术标签:

【中文标题】如何在 Angular 4/2 选择中显示对象的某个字段?【英文标题】:how to display an object certain field in Angular 4/2 selection? 【发布时间】:2018-05-15 13:01:34 【问题描述】:

我有一个联系人类,其中包含一个公司字段(公司数据类型)。我有一个公司班。我有公司,它们是公司对象。我有一个联系人编辑组件,您可以在其中编辑联系人。它有一个 mat-select 字段,如下所示:

<mat-form-field class="matffield">
    <mat-select [(ngModel)]="contact.company" name="contactCompany" placeholder="Company" multiple>
        <mat-option *ngFor="let company of companies" [value]="company">company.name</mat-option>
    </mat-select>
</mat-form-field>

所以您可以从我拥有的公司中进行选择,并将其保存到contact.company 字段中。有用。但是,如果您保存联系人并想再次对其进行编辑,则 mat-select 将不会显示位于 contact.company 字段中的公司。另一个输入字段是这样的:

<mat-form-field class="matffield">
    <input matInput [(ngModel)]="contact.full_name" name="contactFullName" placeholder="Teljes név">
</mat-form-field>

是显示当前的contact.surname。所以我想显示公司名称,目前在contact.company中。

当我这样做时它会起作用:

<mat-form-field class="matffield">
    <mat-select [(ngModel)]="contact.company" name="contactCompany" placeholder="Company" multiple>
        <mat-option *ngFor="let company of companies" [value]="company.id">company.name</mat-option>
    </mat-select>
</mat-form-field>

,但这是不正确的,因为contact.company 将只包含公司的ID。

求助,我的联系班:

import  Company  from './company';

export class Contact
    id: number;
    company: Company[];
    full_name: string;
    surname: string;
    middle_name: string;
    forename: string;
    nickname: string;
    phone: string;
    email: string;
    primary_communication_chanel: string;
    rank: string;
    greeting: string;
    selected: boolean;

还有我的公司班:

export class Company
    id: number;
    logo: string;
    name: string;
    phone: string;
    email: string;
    website: string;
    facebook: string;
    country_code: string;
    hq_country: string;
    hq_zipcode: number;
    hq_settlement: string;
    hq_address: string;
    bi_name: string;
    bi_country: string;
    bi_zipcode: number;
    bi_settlement: string;
    bi_address: string;
    taxnumber: number;
    mail_name: string;
    mail_country: string;
    mail_zipcode: number;
    mail_settlement: string;
    mail_address: string;
    industry_id: number;
    employeesnum_id: number;
    yearlyincome_id: number;
    founded: number;
    selected: boolean;
    project: number[];

已编辑

我有一个解决方案。我不认为这很好... 我有一个联系人路由模块,我有这条路由: path: 'people/edit/:id', component:ContactEditComponent 所以在 ContactEditComponent 中有一个 ngOnInit void。 我修改了:

this.route.paramMap
    .switchMap((params: ParamMap) => this.contactsService.getContact(+params.get('id')))
    .subscribe(contact => this.contact = contact;
      contact.company.forEach(company => this.selectedCompanies.push(company.id)));

我还更改了 html 代码:

<mat-select [(ngModel)]="selectedCompanies" name="contactCompany" placeholder="Cég" multiple>
    <mat-option *ngFor="let company of companies" [value]="company.id">company.name</mat-option>
</mat-select>

但是现在,我必须在保存功能中编写以下代码:

for(let i = 0; i < this.selectedCompanies.length; i++)

    this.contact.company[i] = this.companies.find(x => x.id == this.selectedCompanies[i]);

有没有更好的解决方案?

【问题讨论】:

【参考方案1】:

你能做的就是把选定的公司做成这样。

在html中:

<mat-option (onSelectionChange)="setCompanies(company)" />

在组件中:

private selectedCompanies: any[] = [];

private setCompanies(_company: any)
  this.selectedCompanies.push(_company);
  // lastSelected = this.selectedCompanies[this.selectedCompanies.length -1]

【讨论】:

这将只保存一个,我选择的最后一个公司到 selectedCompany。然后?当我保存并再次编辑时,如何显示选定的公司? 啊,让我改一下吧。 哦,当我选择 2 家公司时,这会将 10 家公司推送到 selectedCompanies 数组。为什么?我做错了什么?以及当我再次编辑联系人时如何显示选择的公司? 好吧,这就是 mat-options 正在做的事情 ;) 抱歉,帮不上忙。也许检查 $event.isUserInput === true 事情是当我选择一些公司时,保存contact.company 是包含选择的公司。因此,当我再次编辑它并且不更改公司时,contact.company 具有相同的公司。我想知道当我编辑联系人时,contact.company 中已经有哪些公司。

以上是关于如何在 Angular 4/2 选择中显示对象的某个字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何发送在 Angular Material Autocomplete 中选择的属性的父对象?

Angular 6 无法从提供的对象中自动选择/绑定下拉列表值

Angular2,Typescript:如何在每页显示一个元素的数组中检查单选按钮?

Angular 2 - 日期选择器显示 mm/dd/yyyy 而不是对象日期

从以前的组件 Angular 中选择列表中的对象

(IONIC - Angular)我如何在 html 卡片中仅显示符合特定条件的 JSON 中的某些对象?