ERROR TypeError: Cannot read properties of undefined (reading 'phones')
ERROR TypeError: Cannot read properties of undefined (reading 'phones')
我有一个问题,我收到错误“core.js:4196 错误类型错误:无法读取未定义的属性(读取 'phones')”
问题是它告诉我我正在检查的对象数组是空的,当我稍微检查并进行调试时,我意识到它不是。这实际上不会无限期地到来,数据很大,是的,在 2800 条数据中,它带给你将近 5 或 6 phones(因为这些是注册的)
无论如何,我真正想做的是从一个对象中获取 phone 个“x”个用户,然后对数据进行自动完成过滤。
我把代码留给你,也许你看到了我没有看到的东西:
.TS
contactos: AddContacto[] = [];
filteredContacts: Observable<AddContacto[]>;
phoneControl: FormControl = new FormControl();
this.filteredContactos = this.phoneControl.valueChanges.pipe(
startWith(null),
map((search: string | null) => (search ? this._filterContactos(search) : this.contactos.slice())),
);
private _filterContactos(search: string) {
const filterValue = search.toLowerCase();
return this.contact.filter(
(contact) =>
!!contact.phones.find((email) => contact.includes(search)) ||
contact.fullName.toLowerCase().includes(filterValue),
);
}
.HTML
<div class="containerTitle p-16">
<mat-form-field fxFlex="100" class="mr-12" appearance="outline" fxFlex="100">
<mat-label>Search Client</mat-label>
<input type="text" placeholder="Add email..." matInput [formControl]="phoneControl" [matAutocomplete]="auto">
<mat-autocomplete #auto="matAutocomplete" >
<mat-option *ngFor="contact of filteredContacts | async" [value]="contact.phones[0]">
{{contact?.phones[0]}} {{contact?.fullName ? '('+ contacto?.nombre_completo +')' : ''}}
</mat-option>
</mat-autocomplete>
</mat-form-field>
<small-loading class="loadingProgressBar" [loading]="loading"></small-loading>
</div>
对象
0: {
"state": true,
"coments": null,
"phones": ["22222222"],
"emails": [
"email@gmail.com"
],
"fullName": "",
"_id": "",
"bitacora": {},
"__v": 0
}
谢谢!!
该错误是因为您使用的是旧版本的打字稿,需要检查数组是否存在以及长度是否大于 0 才能使用任何数组方法,如 filter、find、foreach 等
在您的 _filterContactos 方法中更改它。
private _filterContactos(search: string) {
const filterValue = search.toLowerCase();
return this.contact.filter(
(contact) => {
if (contact.phones && contact.phones.length > 0) {
!!contact.phones.find((email) => contact.includes(search)) ||
contact.fullName.toLowerCase().includes(filterValue)
}
}
);
}
让我知道它是否适合你。
我有一个问题,我收到错误“core.js:4196 错误类型错误:无法读取未定义的属性(读取 'phones')”
问题是它告诉我我正在检查的对象数组是空的,当我稍微检查并进行调试时,我意识到它不是。这实际上不会无限期地到来,数据很大,是的,在 2800 条数据中,它带给你将近 5 或 6 phones(因为这些是注册的)
无论如何,我真正想做的是从一个对象中获取 phone 个“x”个用户,然后对数据进行自动完成过滤。
我把代码留给你,也许你看到了我没有看到的东西:
.TS
contactos: AddContacto[] = [];
filteredContacts: Observable<AddContacto[]>;
phoneControl: FormControl = new FormControl();
this.filteredContactos = this.phoneControl.valueChanges.pipe(
startWith(null),
map((search: string | null) => (search ? this._filterContactos(search) : this.contactos.slice())),
);
private _filterContactos(search: string) {
const filterValue = search.toLowerCase();
return this.contact.filter(
(contact) =>
!!contact.phones.find((email) => contact.includes(search)) ||
contact.fullName.toLowerCase().includes(filterValue),
);
}
.HTML
<div class="containerTitle p-16">
<mat-form-field fxFlex="100" class="mr-12" appearance="outline" fxFlex="100">
<mat-label>Search Client</mat-label>
<input type="text" placeholder="Add email..." matInput [formControl]="phoneControl" [matAutocomplete]="auto">
<mat-autocomplete #auto="matAutocomplete" >
<mat-option *ngFor="contact of filteredContacts | async" [value]="contact.phones[0]">
{{contact?.phones[0]}} {{contact?.fullName ? '('+ contacto?.nombre_completo +')' : ''}}
</mat-option>
</mat-autocomplete>
</mat-form-field>
<small-loading class="loadingProgressBar" [loading]="loading"></small-loading>
</div>
对象
0: {
"state": true,
"coments": null,
"phones": ["22222222"],
"emails": [
"email@gmail.com"
],
"fullName": "",
"_id": "",
"bitacora": {},
"__v": 0
}
谢谢!!
该错误是因为您使用的是旧版本的打字稿,需要检查数组是否存在以及长度是否大于 0 才能使用任何数组方法,如 filter、find、foreach 等
在您的 _filterContactos 方法中更改它。
private _filterContactos(search: string) {
const filterValue = search.toLowerCase();
return this.contact.filter(
(contact) => {
if (contact.phones && contact.phones.length > 0) {
!!contact.phones.find((email) => contact.includes(search)) ||
contact.fullName.toLowerCase().includes(filterValue)
}
}
);
}
让我知道它是否适合你。