gpt4 book ai didi

javascript - Angular Material Autocomplete - 如何允许用户添加不在建议列表中的项目?

转载 作者:行者123 更新时间:2023-11-30 09:20:41 27 4
gpt4 key购买 nike

我正在尝试从 Angular Material 实现自动完成组件:

https://material.angular.io/components/autocomplete/overview

它非常适合让用户从建议列表中选择特定项目,但我也希望允许用户添加不在列表中的项目。

假设建议列表包含以下项目:

Cats
Birds
Dogs

然后用户开始输入 "Do" 并且自动完成显示 "Dogs" 作为建议的选项(因为我也在根据他们输入的内容过滤列表).但是随后用户继续键入 “Dolls”,现在自动完成建议中没有显示任何内容。然后用户按下回车键,它就会被添加到列表中。

当前的行为是,如果列表中不存在用户键入的内容,则他们无法添加该项目。

最佳答案

如果在输入字段中添加回车键监听器,则可以处理输入的值,如果不存在则将其添加到选项中。您还可以将用户输入的任何内容作为“添加新项目”选项动态添加到过滤选项列表中,或者向字段添加“添加”图标(例如作为 matSuffix)。或者您可以同时执行这三个操作:

Stackblitz

HTML

<form class="example-form">
<mat-form-field class="example-full-width">
<input matInput placeholder="Item" aria-label="Item" [matAutocomplete]="auto" [formControl]="itemCtrl" (keyup.enter)="addOption()">
<mat-autocomplete #auto="matAutocomplete" (optionSelected)="optionSelected($event.option)">
<mat-option *ngFor="let item of filteredItems | async" [value]="item">
<span>{{ item }}</span>
</mat-option>
</mat-autocomplete>
<button *ngIf="showAddButton && itemCtrl.value" matSuffix mat-button mat-icon-button (click)="addOption()"><mat-icon matTooltip='Add "{{itemCtrl.value}}"'>add</mat-icon></button>
</mat-form-field>
</form>

TS

import { Component } from '@angular/core';
import { FormControl } from '@angular/forms';

import { Observable } from 'rxjs/Observable';
import { startWith } from 'rxjs/operators/startWith';
import { map } from 'rxjs/operators/map';

/**
* @title Autocomplete with add new item option
*/
@Component({
selector: 'autocomplete-overview-example',
templateUrl: 'autocomplete-overview-example.html',
styleUrls: ['autocomplete-overview-example.css']
})
export class AutocompleteOverviewExample {
itemCtrl: FormControl;
filteredItems: Observable<any[]>;
showAddButton: boolean = false;

prompt = 'Press <enter> to add "';

items: string[] = [
'Cats',
'Birds',
'Dogs'
];

constructor() {
this.itemCtrl = new FormControl();
this.filteredItems = this.itemCtrl.valueChanges
.pipe(
startWith(''),
map(item => item ? this.filterItems(item) : this.items.slice())
);
}

filterItems(name: string) {
let results = this.items.filter(item =>
item.toLowerCase().indexOf(name.toLowerCase()) === 0);

this.showAddButton = results.length === 0;
if (this.showAddButton) {
results = [this.prompt + name + '"'];
}

return results;
}

optionSelected(option) {
if (option.value.indexOf(this.prompt) === 0) {
this.addOption();
}
}

addOption() {
let option = this.removePromptFromOption(this.itemCtrl.value);
if (!this.items.some(entry => entry === option)) {
const index = this.items.push(option) - 1;
this.itemCtrl.setValue(this.items[index]);
}
}

removePromptFromOption(option) {
if (option.startsWith(this.prompt)) {
option = option.substring(this.prompt.length, option.length -1);
}
return option;
}
}

关于javascript - Angular Material Autocomplete - 如何允许用户添加不在建议列表中的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51935641/

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