Я использую ngx-bootstrap / typeahead для автозаполнения на моей странице. Это код, который я использую сейчас:
<input type="text" class="form-control" name="countryName" autocomplete="off" [(ngModel)]="asyncSelected" (blur)="typeaheadOnBlur()" [typeahead]="countryDataSource" (typeaheadOnSelect)="typeaheadOnSelect($event)" typeaheadWaitMs="300" typeaheadOptionField="name">
Составная часть:
asyncSelected: string;
constructor() {
this.countryDataSource = Observable.create((observer: any) => {
observer.next(this.asyncSelected);
}).mergeMap((input: string) => this.getAutoCompleteResults(input));
}
typeaheadOnSelect(event: TypeaheadMatch): void {
viewModel.nestedProperty.country = event.item.name;
viewModel.nestedProperty.countryCode = event.item.countryCode;
}
typeaheadOnBlur(): void {
viewModel.nestedProperty.country = asyncSelected;
}
getAutoCompleteResults()
возвращает массив объектов (наблюдаемых) в следующем формате:
[{id: 1, name: "Australia", code: "AU"}, {id: 2, name: "United States", code: "US"}, ...]
Теперь я думаю, что код в моем компоненте не принадлежит компоненту, который просто использует автозаполнение. Это также не делает его многоразовым. Я не хочу, чтобы все эти коды в компоненте и все эти (blur)="typeaheadOnBlur()"
, typeaheadWaitMs="300"
каждый раз, когда я хочу использовать автозаполнение, я думаю о создании директивы для его использования следующим образом:
<input [myAutoComplete] [ngModel]="viewModel.nestedProperty?.country" (NgModelChange)="viewModel.nestedProperty.country=$event" (select)="mySelectFunction(???)" />
Как вы могли заметить, я не мог использовать viewModel.nestedProperty.country
для привязки к ngx-bootstrap. Похоже, этот $event
имеет другую структуру, чем ngx-bootstrap $event
в typeaheadOnSelect($event)
.
Я тоже не знаю, как обращаться с (select)="mySelectFunction(???)"
. Как вы предлагаете сделать это автозаполнение более удобным для моего проекта?