У меня проблема, я получаю сообщение об ошибке "core.js:4196 ERROR TypeError: Cannot read properties of undefined (чтение "телефонов")"
Дело в том, что он мне говорит, что массив объектов, которые я просматриваю, пуст, при небольшой проверке и выполнении отладки я понимаю, что это не так. Это на самом деле не приходит бесконечно, данные - это что-то большое, да, среди 2800 данных это приносит вам почти 5 или 6 телефонов (так как они зарегистрированы)
В любом случае, что я действительно хочу сделать, так это получить номера телефонов пользователей «x» из объекта и выполнить автозаполнение, фильтрующее данные.
Я оставляю вам код, возможно, вы видите что-то, чего не вижу я:
.ТС
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 protected]"
],
"fullName": "",
"_id": "",
"bitacora": {},
"__v": 0
}
Спасибо!!
contact
может быть неопределенным, если он отображается до завершения загрузки данных. Не могу сказать от этого.
Эта ошибка связана с тем, что вы используете старую версию машинописного текста, и необходимо проверить, существует ли массив и его длина больше 0, чтобы использовать любой метод массива, такой как фильтр, поиск, 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)
}
}
);
}
Дайте мне знать, если это сработало для вас.
Привет! Вы спасаете мою жизнь! Это работает, большое спасибо за ваше время.
Наверное здесь, но я не очень понимаю, почему :
[value] = "contact.phones[0]"
. Позже я вижу в шаблоне, что вы обрабатываете случай, когдаcontact
являетсяundefined
, но не в этом атрибуте. Но учитывая ваши данные,contact
не должно бытьundefined
в любом случае