Angular Material 自动完成:onfocus 保持建议面板关闭
Angular Material Autocomplete: onfocus keep suggestion panel closed
我正在使用 Angular Material 7.3.7,我有一个简单的自动完成功能,类似于 documentation:
<form class="example-form">
<mat-form-field class="example-full-width">
<input type="text" placeholder="Pick one" aria-label="Number" matInput [formControl]="myControl" [matAutocomplete]="auto">
<mat-autocomplete #auto="matAutocomplete">
<mat-option *ngFor="let option of options" [value]="option">
{{option}}
</mat-option>
</mat-autocomplete>
</mat-form-field>
</form>
有什么方法可以在输入焦点集中时让建议面板保持关闭状态?
我已经搜索过 API,但没有找到有用的信息。
提前致谢!
这是一个有点 hacky 的解决方案,但您可以使用 MatAutocompleteTrigger 的 closePanel 方法,如下所示
<form class="example-form">
<mat-form-field class="example-full-width">
<input #inp="matAutocompleteTrigger"
(focus)="inputFocused(inp)"
type="text"
placeholder="Pick one"
aria-label="Number"
matInput [formControl]="myControl"
[matAutocomplete]="auto"
/>
<mat-autocomplete #auto="matAutocomplete">
<mat-option *ngFor="let option of options" [value]="option">
{{option}}
</mat-option>
</mat-autocomplete>
</mat-form-field>
</form>
然后将以下方法添加到您的 ts 文件
focused(trg: MatAutocompleteTrigger) {
setTimeout(() => {
trg.closePanel();
});
}
通过使用 settimeout,我们正在等待下一个变化检测周期,以便面板打开,然后我们关闭它。结果面板在几毫秒内打开和关闭。
希望对您有所帮助:)
=== 非 hacky 解决方案 ====
我检查了我的自动完成实现,在其中一个有大量选项的地方,我们使用了两个选项数组,一个是 allOptions
,另一个是 filteredOptions
。 filteredOptions 最初是空的,我在模板中只显示 filteredOptions。因此,除非用户键入要输入的内容,否则不会显示任何内容(实际上我强制至少两个字符开始过滤,因为 allOptions 有几千个选项)。
<form class="example-form">
<mat-form-field class="example-full-width">
<input type="text"
placeholder="Pick one"
aria-label="Number"
matInput
[formControl]="myControl"
[matAutocomplete]="auto"
/>
<mat-autocomplete #auto="matAutocomplete">
<mat-option *ngFor="let option of filteredOptions" [value]="option">
{{option}}
</mat-option>
</mat-autocomplete>
</mat-form-field>
</form>
在我的 ts 文件中;
allOptions: string[] = this.dataService.userOptions; // there are thousands of options
filteredOptions: string[] = [];
ngOnInit() {
this.myControl.valueChanges.subscribe(z => {
if (!z || z.length < 2) {
this.filteredOptions = [];
} else {
this.filteredOptions = this.allOptions.filter(el => el.toLowerCase().indexOf(z.toLowerCase()) >= 0);
}
}
我希望这对您有所帮助 :)
使用 matAutocompleteDisabled。我将它设置为禁用,然后捕获 的 keyup 事件并切换该禁用标志。因此,当他们输入时,我会检测到 keyup,切换 disableAutocomplete,如果他们没有按 tab 或 escape,则打开面板。
[matAutocompleteDisabled]="禁用自动完成"
我正在使用 Angular Material 7.3.7,我有一个简单的自动完成功能,类似于 documentation:
<form class="example-form">
<mat-form-field class="example-full-width">
<input type="text" placeholder="Pick one" aria-label="Number" matInput [formControl]="myControl" [matAutocomplete]="auto">
<mat-autocomplete #auto="matAutocomplete">
<mat-option *ngFor="let option of options" [value]="option">
{{option}}
</mat-option>
</mat-autocomplete>
</mat-form-field>
</form>
有什么方法可以在输入焦点集中时让建议面板保持关闭状态?
我已经搜索过 API,但没有找到有用的信息。
提前致谢!
这是一个有点 hacky 的解决方案,但您可以使用 MatAutocompleteTrigger 的 closePanel 方法,如下所示
<form class="example-form">
<mat-form-field class="example-full-width">
<input #inp="matAutocompleteTrigger"
(focus)="inputFocused(inp)"
type="text"
placeholder="Pick one"
aria-label="Number"
matInput [formControl]="myControl"
[matAutocomplete]="auto"
/>
<mat-autocomplete #auto="matAutocomplete">
<mat-option *ngFor="let option of options" [value]="option">
{{option}}
</mat-option>
</mat-autocomplete>
</mat-form-field>
</form>
然后将以下方法添加到您的 ts 文件
focused(trg: MatAutocompleteTrigger) {
setTimeout(() => {
trg.closePanel();
});
}
通过使用 settimeout,我们正在等待下一个变化检测周期,以便面板打开,然后我们关闭它。结果面板在几毫秒内打开和关闭。
希望对您有所帮助:)
=== 非 hacky 解决方案 ====
我检查了我的自动完成实现,在其中一个有大量选项的地方,我们使用了两个选项数组,一个是 allOptions
,另一个是 filteredOptions
。 filteredOptions 最初是空的,我在模板中只显示 filteredOptions。因此,除非用户键入要输入的内容,否则不会显示任何内容(实际上我强制至少两个字符开始过滤,因为 allOptions 有几千个选项)。
<form class="example-form">
<mat-form-field class="example-full-width">
<input type="text"
placeholder="Pick one"
aria-label="Number"
matInput
[formControl]="myControl"
[matAutocomplete]="auto"
/>
<mat-autocomplete #auto="matAutocomplete">
<mat-option *ngFor="let option of filteredOptions" [value]="option">
{{option}}
</mat-option>
</mat-autocomplete>
</mat-form-field>
</form>
在我的 ts 文件中;
allOptions: string[] = this.dataService.userOptions; // there are thousands of options
filteredOptions: string[] = [];
ngOnInit() {
this.myControl.valueChanges.subscribe(z => {
if (!z || z.length < 2) {
this.filteredOptions = [];
} else {
this.filteredOptions = this.allOptions.filter(el => el.toLowerCase().indexOf(z.toLowerCase()) >= 0);
}
}
我希望这对您有所帮助 :)
使用 matAutocompleteDisabled。我将它设置为禁用,然后捕获 的 keyup 事件并切换该禁用标志。因此,当他们输入时,我会检测到 keyup,切换 disableAutocomplete,如果他们没有按 tab 或 escape,则打开面板。
[matAutocompleteDisabled]="禁用自动完成"