Angular 自动完成无法 select 不存在的值

Angular autocomplete unable to select unexisting values

我开发了一个管理“任务”的网络应用程序(Angular,Typescript)。对于每个任务,我想用一个表格为其添加标签。我创建了一个 angular 表单来向任务添加标签,这表明我已经存在标签,以避免用户通过多次输入相同的标签而在数据库中创建冗余,只是语法略有不同。 它工作得很好:当我写一个已经存在的标签的开头时,它会向我提示,我可以 select 它并且确定!但问题是当我写 then select 一个不存在的标签时,不建议。 returns 形式是一个未定义的值,而我想获得我的新标签名称作为响应(然后我将其添加到 TagModel)。 这是我的代码:

对话框-添加-tag.component.ts

export class DialogAddTagComponent implements OnInit {
    formGroup: FormGroup;

    tagFormControl: FormControl;

    tagOptions: Observable <TagGetAllResponseInterface>;

    displayFunction (key: {name: string}): string {
        if (key === null) {
            return null;
        }
        return `${key.name}`;
    }

    constructor (
        public tagService: TagService,
        public formBuilder: FormBuilder,
        private readonly dialogRef: MatDialogRef<DialogAddTagComponent>
    ) { }

    ngOnInit (): void {
        this.formGroup = this.formBuilder.group({
            tag: this.tagFormControl
        });
        this.tagFormControl = new FormControl(
            null,
            [Validators.required.bind(this)]);
        this.tagOptions = this.tagFormControl.valueChanges.pipe(
            debounceTime(100),
            switchMap(value => from(this.tagService.getAll(25, 0, value)))
        );
    }

    onSelect (): void {
        this.dialogRef.close({name: this.tagFormControl.value.name});
    }
}

对话框-添加-tag.component.html

<h2 mat-dialog-title>Add a tag</h2>

<form id="form-container" class="mat-typography container" [formGroup]="formGroup">
    <mat-form-field>
        <input type="text" placeholder="Pick one" aria-label="Number" matInput [matAutocomplete]="auto" [formControl]="tagFormControl">
        <mat-autocomplete #auto="matAutocomplete" [displayWith]="displayFunction">
            <mat-option *ngFor="let tag of (tagOptions | async)?.tags" [value]="tag">
                {{tag.name}}
            </mat-option>
        </mat-autocomplete>
    </mat-form-field>

    <button mat-raised-button
            color="primary"
            class="full-width-button margin-top-button"
            [disabled]="tagFormControl.invalid"
            (click)="onSelect()"
    >Select</button>
</form>

Tag.interface.ts

export interface TagGetAllResponseInterface {
    tags: {
        name: string;
    }[];
}

export interface TagGetAllRequestInterface {
    limit: string;
    page: string;
    search?: string;
}

我认为问题出在:

switchMap(value => from(this.tagService.getAll(25, 0, value))

which returns 当标签不存在时为 null。那么,当我点击 Select 时,我必须添加什么才能使它 select 是表单中写入的标签,即使它不存在于数据库中?

提前致谢!

我认为最好的选择是如果列表中没有任何匹配项,则使 tagService.getAll() 函数 return 为给定值。

因此,如果该函数在其列表中搜索但未找到任何匹配项,则它应该 return 原始值(写在表格中的值)