gpt4 book ai didi

angular-material - 将动态生成的输入字段连接到 mat-autocomplete

转载 作者:行者123 更新时间:2023-12-04 08:31:20 26 4
gpt4 key购买 nike

我允许用户动态创建输入字段。对于这些输入字段中的每一个,我想将其连接到不同的 mat-autocomplete,以便它们彼此独立工作。我在这里遇到了砖墙,因为我无法动态创建将自动完成连接到输入的元素引用(此处为#auto)。我如何实现这一目标?

<div
class="row"
*ngFor="let field of getControls('requestFields'); let i = index"
formArrayName="requestFields"
>
<ng-container [formGroupName]="i">
<div class="col-md-4">
<mat-form-field class="example-full-width">
<input
type="text"
placeholder="Name"
matInput
formControlName="reqName"
matAutocomplete="auto"
/>
<mat-autocomplete #auto="matAutocomplete">
<mat-option
*ngFor="let option of (filteredColumns | async)"
[value]="option"
>
{{ option }}
</mat-option>
</mat-autocomplete>
</mat-form-field>
</div>
<div class="col-md-2">
<div class="togglebutton">
<label>
<span>Optional</span>
<input type="checkbox" formControlName="reqOption" />
<span class="toggle"></span>
</label>
</div>
</div>
<div class="col-md-4">
<mat-form-field>
<input
matInput
formControlName="reqValidations"
placeholder="Validation"
type="text"
/>
</mat-form-field>
</div>
</ng-container>
</div>

最佳答案

关于 mat-autocomplete 的一件好事是它与mat-form-field完全解耦了因此,您可以将其放在动态生成的行范围之外的任何位置。以您为例 - 解决方案可能如下所示:

<div
class="row"
*ngFor="let field of getControls('requestFields'); let i = index"
formArrayName="requestFields"
>
<ng-container [formGroupName]="i">
<div class="col-md-4">
<mat-form-field class="example-full-width">
<input
type="text"
placeholder="Name"
matInput
formControlName="reqName"
matAutocomplete="auto"
/>
</mat-form-field>
</div>
<!-- other dynamic content -->
</ng-container>
</div>
<mat-autocomplete #auto="matAutocomplete">
<mat-option *ngFor="let option of filteredColumns | async" [value]="option">
{{ option }}
</mat-option>
</mat-autocomplete>

然后你可以有一个事件处理程序 keyup在触发 filteredColumns 更新的输入上
<mat-form-field class="example-full-width">
<input
type="text"
placeholder="Name"
matInput
formControlName="reqName"
matAutocomplete="auto"
(keyup)="reqNameChanged(field.get('reqName')?.value)"
/>
</mat-form-field>

在你的组件中你可以设置一个 filteredColumnskeyup 中的主题触发的可观察对象事件处理程序:
import { Component, OnInit } from '@angular/core';
import { Observable, Subject } from 'rxjs';
import {
debounceTime,
distinctUntilChanged,
filter,
switchMap
} from 'rxjs/operators';

@Component({
selector: 'example',
templateUrl: './example.html',
styleUrls: ['./example.scss']
})
export class ExampleComponent implements OnInit {
filteredColumns: Observable<string[]>;

reqNameSubject: Subject<string> = new Subject<string>();

constructor(private lookup: ILookupService) {}

ngOnInit() {
this.filteredColumns = this.reqNameSubject.pipe(
filter(v => !!v),
debounceTime(300),
distinctUntilChanged(),
switchMap(value =>
/* call for the autocomplete data */
this.lookup.search(value)
)
);
}

reqNameChanged(value: string) {
this.reqNameSubject.next(value);
}
}

我希望它有帮助。

关于angular-material - 将动态生成的输入字段连接到 mat-autocomplete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51649331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com