首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >角-总是显示自动完成面板

角-总是显示自动完成面板
EN

Stack Overflow用户
提问于 2022-08-30 01:16:22
回答 1查看 31关注 0票数 0

如何使自动完成面板始终处于启用状态,而不必关注输入?我试图激活输入上的自动焦点,但是它并不干净,例如,当我按转义键时,面板就会消失。我还试图调用openPanel()函数,但它并不是在所有情况下都能工作,而且它仍然不是最优化的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-30 01:16:22

在这种情况下,不建议使用自动完成材料。我建议您使用一个表,在该表中,我们可以使用箭头导航,单击结果等。

创建这样的表和搜索输入,并设置列名和数据

代码语言:javascript
复制
<input #searchbar 
    (keydown.arrowDown)="arrowDownEvent(row, selectedRowIndex)" 
    (keydown.arrowUp)="arrowUpEvent(row, selectedRowIndex)"
    (keydown.enter)="submitSearch(searchbar.value)"
    (focus)="selectedRowIndex=0" (focusout)="selectedRowIndex=undefined"
    id="search-bar" placeholder="Search..."
    required type="search">

<table mat-table [dataSource]="results" style="background-color: rgba(32, 32, 32); width: 100%">

  <ng-container matColumnDef="name">
    <th mat-header-cell *matHeaderCellDef> Name </th>
    <td mat-cell *matCellDef="let result"><span>{{result.name}}<span></td>
  </ng-container>

  <!--You can add as many ng-containers as there are columns in your autocompletion results -->

  <tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: true"></tr>
  <tr mat-row *matRowDef="let row; columns: displayedColumns"
      id="result.{{row.index}}"
      [ngClass]="{'result': true, 'highlight': selectedRowIndex == row.index}"
      (click)="submitSearch(row.name)">
  </tr>

</table>

然后将其添加到您的类型记录中,以便您可以控制表。

代码语言:javascript
复制
displayedColumns: string[] = ['name'];
selectedRowIndex: any = 0;

highlight(row: any){
    (<HTMLInputElement>document.getElementById("search-bar")).value = row.name;
    this.selectedRowIndex = row.index;
    (<HTMLInputElement>document.getElementById("result."+this.selectedRowIndex)).scrollIntoView({block: 'end'});
  }

arrowUpEvent(row: object, index: number){
  if (index > 0) {
    let nextRow = this.results[index - 1];
    this.highlight(nextRow);
  }
  else {
    let nextRow = this.results[this.results.length - 1];
    this.highlight(nextRow)
  }
}

arrowDownEvent(row: object, index: number){
  if (index < this.results.length - 1) {
    let nextRow = this.results[index + 1];
    this.highlight(nextRow);
  }
  else {
    let nextRow = this.results[0];
    this.highlight(nextRow)
  }
}

最后,您可以将其添加到css中以修改所选元素的样式。

代码语言:javascript
复制
.result {
  background-color: rgba(32, 32, 32);
  cursor: pointer;
}

.result.highlight {
  background: rgb(25, 25, 25);
}

.result:hover {
  background: rgb(42, 42, 42);
}

您的数据应该包含一个名为index的列,以便能够识别类型记录中的结果。

最后,您必须创建一个以用户的搜索项作为参数的submitSearch函数,该函数将定义搜索完成后执行的操作。

这里概述了您可以使用此方法做什么。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73536179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档