我已经成功实现了 mat-autocomplete,如果从自动完成下拉菜单中选择它,它工作正常。当我输入一些文本并导航到其他字段而不选择下面的自动完成字段时,我遇到了问题。它保留在自动完成字段中键入的值。
我已使用以下方法来解决此问题-
MatAutocompleteTrigger - 下面的代码我在 ts 文件中使用过 -
@ViewChild('autoCompleteInput', { static: false,read: MatAutocompleteTrigger }) trigger: MatAutocompleteTrigger; . . . this.trigger.panelClosingActions .subscribe(e => { if (!(e && e.source)) { this.accountForm.get('accountId').setValue=""; this.account.accountId = null; } })
首先,我无法将它保存在任何角度的生命周期钩子中。此触发器在角度生命周期挂钩期间不会被初始化,但稍后它会从 mat-autocomplete 接收任何值。因此,只要我在字段中输入文本,它就会清除值(保留下面的自动完成列表;看起来不太好)
2.在filterOptions上使用了observalble(在我的自动完成字段上可以观察)-我使用了下面的代码-
this.filteredOptions = this.accountForm.get('accountId').valueChanges.pipe( debounceTime(250), distinctUntilChanged(), filter(searchString => typeof searchString === 'string'), filter(searchString => searchString.length > 0), switchMap(searchString => { return this.accountService.autoCompleteBrokerSearch(searchString); }) ); this.filteredOptions.takeUntil(this.ngUnsubscribe).subscribe((lookups: accountEntityModel[]) => { if (lookups.length === 0) { this.account.accountId = null; this.accountForm.get('accountId').patchValue(''); } if(lookups.find(value => value.id !== this.account.id)){ this.account.accountId = null; this.accountForm.get('accountId').patchValue(''); } });
使用模板代码 -
<mat-form-field appearance="standard" >
<mat-label>{{ 'account.enterAccount' | translate }}</mat-label>
<input
matInput
formControlName="accountId"
class="search-select"
[matAutocomplete] = "accountAutocomplete"
#autoCompleteInput="matAutocompleteTrigger">
<mat-autocomplete #accountAutocomplete = "matAutocomplete" [displayWith]="displayFn.bind(this)" >
<mat-option [value]="accountOption" *ngFor="let accountOption of filteredOptions | async" (onSelectionChange)="onEnteredAccount(accountOption)" >{{
accountOption.description
}}</mat-option>
</mat-autocomplete>
</mat-form-field>
如果我们没有从自动完成中选择任何内容,我只需要清除该字段,它也应该从表单中清除字段值。