Я использую модуль Angular Material AutoComplete
и заставил его работать при использовании простого ввода.Но я действительно хочу использовать его внутри ngFor
внутри модуля.
Мне удалось заставить его почти работать, но я не могу заставить его фильтровать опции.Это мой HTML:
<form novalidate [formGroup]="productForm" (ngSubmit)="onSubmit()">
<mat-card>
<mat-card-content>
<mat-form-field>
<input type="text" matInput [matDatepicker]="picker" formControlName="data" required>
<mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
<mat-datepicker #picker></mat-datepicker>
</mat-form-field>
<mat-divider></mat-divider>
<!-- Product -->
<div formArrayName="products">
<div *ngFor="let item of productForm.get('products').controls; let i = index">
<div [formGroupName]="i">
<mat-form-field>
<input type="text" placeholder="product" matInput formControlName="product" [matAutocomplete]="product" required>
<mat-autocomplete #product="matAutocomplete" [displayWith]="displayFn">
<mat-option *ngFor="let option of filterProduct | async" [value]="option">
{{option.nome}}
</mat-option>
</mat-autocomplete>
</mat-form-field>
<mat-divider></mat-divider>
</div>
</div>
</div>
<button mat-raised-button color="primary" [disabled]="productForm.disabled" type="button" (click)="newProduct()">New Product</button>
</mat-card-content>
<mat-card-actions>
<button mat-raised-button color="primary" [disabled]="productForm.disabled">Add</button>
</mat-card-actions>
</mat-card>
</form>
И компонент:
public products: any;
public productForm: FormGroup;
public filterProduct: Observable<any>;
constructor(
private _store: StoreService,
) {
this.products = this._store.insumo;
}
ngOnInit() {
this.productForm = new FormGroup({
data: new FormControl(new Date(), Validators.required),
products: new FormArray([]),
});
this.newProduct();
this.filterProduct= this.productForm.get('product').valueChanges
.pipe(
startWith(''),
map(value => typeof value === 'string' ? value : value.nome),
map(nome => nome ? this._filterProduct(nome) : this.insumos.slice())
);
}
private _filterProduct(nome: string) {
const _filterValue = nome.toLowerCase();
return this.products.filter(option => option.nome.toLowerCase().includes(_filterValue));
}
public displayFn(object): string | undefined {
return object ? object.nome : undefined;
}
public newProduct():void {
const control = <FormArray>this.productForm.get('products');
control.push(new FormGroup({
product: new FormControl(null, Validators.required),
}));
}
public onSubmit() {
console.log(this.productForm);
}
Я считаю, что проблема с функцией filterProduct
, потому что мне нужно получить входное значение, так как этовнутри ngFor
Я не знаю, как это сделать.