Angular material Chips Autocomplete

这篇具有很好参考价值的文章主要介绍了Angular material Chips Autocomplete。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Chips Autocomplete 官网的例子我没法正常使用,无法实现搜索

我的select是个通用组件,现在贴代码:
component.ts
 

import {
  Component,
  ElementRef,
  forwardRef,
  Input,
  OnChanges,
  OnDestroy,
  OnInit,
  SimpleChanges,
  ViewChild,
} from '@angular/core';
import { Tag } from '../../models/tag/tag';
import { map, startWith, takeUntil } from 'rxjs/operators';
import { ControlValueAccessor, UntypedFormControl, NG_VALUE_ACCESSOR } from '@angular/forms';
import { COMMA, ENTER } from '@angular/cdk/keycodes';
import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete';
// import { MatChipInputEvent } from '@angular/material/chips';
import { TagService } from '../../services/tag/tag.service';
import { TagType } from '../../enums/TagType';
import { ISearchOptions } from '../../interfaces/SearchOptions';
import { SubscriberWrapperComponent } from '../subscriber-wrapper/subscriber-wrapper.component';

@Component({
  selector: 'app-tags-select',
  templateUrl: './tags-select.component.html',
  styleUrls: ['./tags-select.component.scss'],
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => TagsSelectComponent),
      multi: true,
    },
  ],
})
export class TagsSelectComponent
  extends SubscriberWrapperComponent
  implements ControlValueAccessor, OnChanges, OnInit, OnDestroy
{
  @Input() title: string;
  @Input() disabled: boolean;
  @Input() color: 'primary' | 'accent' | 'warn';
  @Input() type: TagType;
  @Input() tags: Tag[];

  filteredTags: Tag[];
  selectedTags: Tag[] = [];
  separatorKeysCodes: number[] = [ENTER, COMMA];
  tagCtrl = new UntypedFormControl('');
  hideComponent: boolean;

  @ViewChild('tagInput') tagInput: ElementRef<HTMLInputElement>;
  @ViewChild('chipList') chipList: ElementRef;

  constructor(private tagService: TagService) {
    super();
  }

  onChange = (_: any) => {};
  onTouched = () => {};

  async ngOnInit() {
    this.initTags();
    const conditions = [];
    if (this.type) {
      conditions.push({
        key: 'type',
        value: this.type,
        operator: '=',
      });
    }
    this.tags = await this.listTags('', {
      conditions,
    });
    await this.updateFilterTags();
  }

  async listTags(query: string = '', options: ISearchOptions = {}) {
    if (!this.tags) {
      const response = await this.tagService.list(query, options);
      return response.entities;
    } else {
      return this.tags;
    }
  }

  // add(event: MatChipInputEvent): void {
  //   event.chipInput!.clear();

  //   this.tagCtrl.setValue(null);
  // }

  remove(tag: Tag): void {
    const index = this.selectedTags.indexOf(tag);
    if (index >= 0) {
      this.selectedTags.splice(index, 1);
    }
    this.filteredTags.push(tag);
    // this.onChange(this.selectedTags);  
  }

  selected(event: MatAutocompleteSelectedEvent): void {
    this.selectedTags.push(event.option.value);
    this.tagInput.nativeElement.value = '';
    this.tagCtrl.setValue(null);
    // this.onChange(this.selectedTags);
  }

  registerOnChange(fn: any): void {
    this.onChange = fn;
  }

  registerOnTouched(fn: any): void {
    this.onTouched = fn;
  }

  writeValue(selectedTags: Tag[] = []): void {
    this.selectedTags = selectedTags ?? [];
    this.updateFilterTags();
  }

  ngOnChanges(changes: SimpleChanges): void {
    if (changes.disabled?.currentValue) {
      this.tagCtrl.disable();
    }

    if (changes.tags?.currentValue) {
      this.updateFilterTags();
    }
  }

  initTags() {
    this.tagCtrl.valueChanges
      .pipe(
        takeUntil(this.unsubscribeAll),
        startWith(null),
        map(async (value?: string) => {
          await this.updateFilterTags(value);
        })
      )
      .subscribe();
  }

  async updateFilterTags(value?: string) {
    const conditions = [];
    if (this.type) {
      conditions.push({
        key: 'type',
        value: this.type,
        operator: '=',
      });
    }
    const response = value
    ? this.tags?.filter((tag: Tag) => {
        const regex = new RegExp(`^${value}`, 'i'); 
        return regex.test(tag.title?tag.title:'');
      }) || []
    : this.tags?.slice() || [];
    
    const selectedTagIds = this.selectedTags.map((tag: Tag) => tag.id);
    this.filteredTags = response.filter((tag: Tag) => !selectedTagIds.includes(tag.id));
  }
}

页面.html
 文章来源地址https://www.toymoban.com/news/detail-757807.html

<mat-label>{{title}}</mat-label>
<mat-form-field class="tag-chip-list" *ngIf="!hideComponent">
  <mat-chip-list #chipList aria-label="Tag selection" [disabled]="disabled">
    <mat-chip [color]="color" [class]="color"
              *ngFor="let tag of selectedTags; let i=index"
              (removed)="remove(tag)">
      <button matChipRemove>
        <mat-icon svgIcon="CloseBlue" class="close-icon"></mat-icon>
      </button>
      {{tag.name}}
    </mat-chip>
    <input
      placeholder="Add another tag..."
      #tagInput
      [formControl]="tagCtrl"
      [matAutocomplete]="auto"
      [matChipInputFor]="chipList"
      [matChipInputSeparatorKeyCodes]="separatorKeysCodes">
  </mat-chip-list>
  <mat-autocomplete #auto="matAutocomplete"
                    (optionSelected)="selected($event)">
    <mat-option *ngFor="let tag of filteredTags" [value]="tag"
                [innerHTML]="tag.name">

    </mat-option>
  </mat-autocomplete>
</mat-form-field>

到了这里,关于Angular material Chips Autocomplete的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一文了解Angular、React 和 Vue.js的区别

    前端开发人员在开始一个新项目时首先要回答的问题是:我应该选择哪个框架? 哪个框架更适合我的需求? 在本文中,我们将向您快速概述当前使用的最常见的前端框架,旨在帮助您选择最能满足您需求的框架。这些框架是 Angular、React和 Vue.js。   一、介绍 Angular是一个包

    2024年02月08日
    浏览(39)
  • 前端框架之争:Vue.js vs. React.js vs. Angular

    🎉欢迎来到Web前端专栏~前端框架之争:Vue.js vs. React.js vs. Angular ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:架构设计 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习 🍹文章作者技术和水平有限,如果

    2024年02月07日
    浏览(80)
  • 如何使用前端框架(React、Angular、Vue.js等)?该如何选择?

    聚沙成塔·每天进步一点点 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而

    2024年02月07日
    浏览(46)
  • 深入Angular:(转&翻)Do you still think that NgZone (zone.js) is required for change detection in Angular?

    原文链接:IndepthApp 前言概览:注意区分NgZone和zone.js, 更多细节在Angular跟新策略篇,尚未翻译完成。 本文主要解释了Angular是如何基于zone.js实现NgZone。 同时阐述如何在不使用zone.js的情况下,实现手动更新。文章最后部分将描述自动跟新策略何时会失效。 我看过的大多数文章

    2024年01月16日
    浏览(41)
  • JavaScript框架 Angular、React、Vue.js 的全栈解决方案比较

    在 Web 开发领域,JavaScript 提供大量技术栈可供选择。其中最典型的三套组合,分别是 MERN、MEAN 和 MEVN。前端框架(React、Angular 和 Vue)进行简化比较。 MERN 技术栈包含四大具体组件: MongoDB:一款强大的 NoSQL 数据库,以灵活的 JSON 格式存储数据。 Express.js:一套极简但强大的

    2024年02月03日
    浏览(45)
  • 2023年最佳JavaScript框架:React、Vue、Angular和Node.js的比较

    🎉欢迎来到Java学习路线专栏~探索2023年最佳JavaScript框架:React、Vue、Angular和Node.js的比较 ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:Java学习路线 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 🍹文章作者技术和水

    2024年02月11日
    浏览(38)
  • 如何在 Angular 中使用 ng2-charts 来使用 Chart.js

    介绍 Chart.js 是一个流行的 JavaScript 图表库, ng2-charts 是 Angular 2+ 的一个包装器,用于在 Angular 中集成 Chart.js。 在本教程中,您将使用 Chart.js 和 ng2-charts 在 Angular 应用程序中创建示例图表。 要完成本教程,您需要: 本地安装了 Node.js,您可以按照《如何安装 Node.js 并创建本地

    2024年02月20日
    浏览(34)
  • angular前端环境搭建、安装angular

    1.下载node.js安装包(要求node版本大于12.20) Node.js官方网站 : https://nodejs.org/en/ 进入官网后,当前页面下载的是最新版本,如需要下载历史版本,点击红框标注的其他下载,在进入的新的页面底部,选择红框标准的先前版本,然后下载相应的版本,在跳转的页面下载win64的版

    2024年02月03日
    浏览(43)
  • 【Angular开发】Angular中的高级组件

    在这个博客中,我将解释Angular中的几个高级组件和机制,它们增强了灵活性、可重用性和性能。 通过熟悉这些高级组件和机制,您可以提高您的Angular开发技能,并在应用程序中利用灵活性、可重用性和性能优化的能力。让我们开始吧! NgContent NgContent,或Angular中的内容投影

    2024年02月04日
    浏览(40)
  • Angular 11到升级到 Angular 16

    日新月异,与时俱进… 随着Angular版本不断更新,再看所开发的项目版本仍然是Angular 11,于是准备升级 截止发博日最版本是 v17.1.0,考虑到稳定性因素决定升级到v16版本 执行命令行 但是发现直接报错了… 红色字体大概意思就是: 迁移失败:发现不兼容的对等依赖项 安装依

    2024年02月04日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包