this.filteredContact = this.contactControl.valueChanges.pipe(
startWith(''),
debounceTime(200),
map(val => this.filterContact(val))
);
filterContact(val: string): any {
if (val.length > 2) {
return _.filter(
this.contacts,
item => item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1
);
}
}
this.filteredContact = this.contactControl.valueChanges.pipe(
startWith(''),
debounceTime(200),
switchMap(
val =>
val.length > 2 ?
_.filter(
this.contacts,
item => item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1
) :
Observable.of([])
),
map(result => result.contacts)
);
Я использую поле Angular materialAutoComplete, где вызов службы извлекает данные по мере того, как пользователь вводит их. Поскольку пользователь вводит данные быстрее, чем служба извлекает данные, синхронизация того, что фактически отображается на панели autocompleteSelection, отсутствует. Как добиться идеальных данных в materialAutoComplete. Как сопоставить/превзойти скорость привязки пользователя к полю и вывод, полученный из службы, для отображения в autocompletePanel?
public filteredCustomersByName: Observable<e.ICustomer[]>;
this.filteredCustomersByName = this.customerNameControl.valueChanges.pipe(
startWith(''),
debounceTime(200),
map(val => this.filterCustomersByName(val))
);
filterCustomersByName(val: string): any {
if (val.length > 2) {
this.appData.get(this.appData.url.getCustomerByName, [val]).subscribe(
result => {
this.customersByName = result.customers;
},
err => {
console.log('Error ' + err.message);
this.toastr.error(err.message);
}
);
return this.customersByName;
}
}
<div class="box-row">
<mat-form-field>
<input placeholder="Customer Name" type="text" #customerNameId matInput [formControl]="customerNameControl" [(ngModel)]='selectedCustomerName'
[matAutocomplete]="customerName" required>
<mat-autocomplete #customerName="matAutocomplete" class='customerDetails'>
<mat-option (click)="setCustomerDetails(customer)" *ngFor="let customer of filteredCustomersByName | async" [value]="customer.name">
{{ customer.name}}
</mat-option>
</mat-autocomplete>
</mat-form-field>
</div>
Заранее спасибо.
filterCustomerByCode(val: string): any {
if (val.length > 2) {
if (val.charAt(0).toLowerCase() !== 'b') {
val = ('000000000000' + val).substr(-10);
}
this.appData.get(this.appData.url.getCustomerByCode, [val]).subscribe(
result => {
this.customersByCode = result.customers;
},
err => {
console.log('Error ' + err.message);
this.toastr.error(err.message);
}
);
return this.customersByCode;
}
}
Я попытался изменить filteredContact с помощью switchMap, пожалуйста, проверьте и дайте мне знать, почему я получаю сообщение об ошибке в result.contacts в карте операторов (result => result.contacts)