最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - mat-autocomplete: Need to Reset the List of Options After a Selection is Made - Stack Overflow

programmeradmin6浏览0评论

I have a mat-autoplete ponent with the options wired up to be populated from a service call as the user types (partial search):

<mat-autoplete #auto="matAutoplete" (optionSelected)="areaSelected($event.option.value)">
      <mat-option *ngFor="let option of options" [value]="option">{{ option }}</mat-option>
</mat-autoplete>

I have a mat-autoplete ponent with the options wired up to be populated from a service call as the user types (partial search):

<mat-autoplete #auto="matAutoplete" (optionSelected)="areaSelected($event.option.value)">
      <mat-option *ngFor="let option of options" [value]="option">{{ option }}</mat-option>
</mat-autoplete>

In my TS code, I am setting the options array to be an empty array at the end of the processing I do when a user selects a value:

  resetFetchedOptions() {
    this.options = [];
}

This works in that the code is called, and that this.options is set to an empty array. The problem is that when the user tries to type another value in the field, the previous options are still there. If they type, the options get cleared out, and the new options based on the partial search are populated, so I think this is a rendering problem, but I'm a bit new to Angular Material, so I'm not sure if this is the wrong approach or I'm missing a step.

Thanks!

Share Improve this question asked Sep 4, 2019 at 10:25 James BenderJames Bender 1,2322 gold badges13 silver badges26 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 4

Are you using reactive forms? I made a similar thing like this (based on this article);

html

<mat-form-field class="width-filler">
    <input type="text" matInput placeholder="Search" [matAutoplete]="auto" [formControl]="formControl" autoplete="off" autofocus>
    <mat-autoplete #auto="matAutoplete" [displayWith]="displayFunc">
        <mat-option *ngIf="isSearching" class="is-loading"><mat-spinner diameter="20"></mat-spinner></mat-option>
        <mat-option *ngFor="let result of filteredResult" [value]="result">
            {{result.description}}
        </mat-option>
    </mat-autoplete>
    <mat-hint>{{searchHint()}}</mat-hint>
</mat-form-field>

Typescript

ngOnInit() {
    this.formControl
        .valueChanges
        .pipe(
            debounceTime(300),
            tap(() => this.isSearching = true),
            switchMap(value => this.someService.searchStuff<ResultType[]>(this.getSearchString(value as any))
                .pipe(
                    finalize(() => this.isSearching = false),
                )
            )
        )
        .subscribe(result => this.filteredResult = result);

    this.formControl.valueChanges.subscribe(value => this.setValue(value));
}

// Need to handle both the search string and a selected full type
private setValue(value: string | ResultType) : void {
    if (typeof value === "string")
        this.selectedValue = null;
    else
        this.selectedValue = value;
}

private getSearchString(value: string | ResultType) {
    if (typeof value === "string")
        return value;
    else
        return value.description;
}

I think it happens because you keep a reference to the original array, try this.options.length=0 instead of = []

发布评论

评论列表(0)

  1. 暂无评论