首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular Material、Mat Chips Bug、在optionSelected之前执行的matChipInputTokenEnd

Angular Material、Mat Chips Bug、在optionSelected之前执行的matChipInputTokenEnd
EN

Stack Overflow用户
提问于 2018-10-02 20:49:32
回答 5查看 5K关注 0票数 8

当在输入中键入一些文本并通过按enter从自动完成中选择一个选项时,它会将这两个字符串保存为芯片。Image here

但是,当用鼠标从自动完成中选择一个选项时,就不会发生这种情况。

Angular Material Autocomplete Chips上提供的示例中,在所描述的情况下,optionSelected首先触发,而在我的本地计算机上的相同代码中,它在matChipInputTokenEnd之后执行,因此导致了错误。

有没有人遇到过这个问题?

EN

回答 5

Stack Overflow用户

发布于 2018-10-15 18:21:51

关于选择事件,当您按ENTER时,来自输入的matChipInputTokenEnd和来自mat-autocomplete,的optionSelected都将触发。通常,这首先发生在optionSelected上,因此当输入事件触发时,芯片已经被添加,并且输入将没有要添加的值。这就是为什么您不能通过单击鼠标获得此问题的原因,因为只有optionSelected事件会被激发。

现在我说正常,因为我在一个模块导入的组件上也遇到了这个问题。如果这是您的情况,这可能是一个bug。

然而,我确实找到了一个快速的解决方案。我所做的是检查mat-autocomplete对话框是否打开,并阻止mat-chip-input添加新元素。检查选项列表中的选定项也是一种可能,但它的性能较差,并且不是我想要的行为。

希望这能有所帮助:

代码语言:javascript
复制
@ViewChild('chipAutocomplete') chipAutocomplete: MatAutocomplete;

addElement(event: MatChipInputEvent) {
  if ((event.value || '').trim() && !this.chipAutocomplete.isOpen) {
    this.value.push({
      name: event.value.trim()
    });
  }

  if (event.input) {
    event.input.value = '';
  }

  this.chipInputControl.setValue(null);
}

票数 5
EN

Stack Overflow用户

发布于 2020-07-15 13:34:56

虽然AndréDias提出的解决方案在你有一个严格的选择时有效,但如果你需要在选择中添加1的子字符串,它就不会起作用(当你的autocomplete中只有"javascript“时,想想"java”)。为了同样有效,你可以使用带有全局变量的optionActivated事件(这并不能完全解决问题,如果你用鼠标选择,你仍然会有这个问题)。下面是一个例子。html部分:

代码语言:javascript
复制
        <mat-autocomplete
          #auto="matAutocomplete"
          (optionActivated)="optionActivated($event)"
          (optionSelected)="selectedTag($event)">
          <mat-option *ngFor="let tag of filteredTags | async" [value]="tag">
            {{ tag }}
          </mat-option>
        </mat-autocomplete>

组件部分:

代码语言:javascript
复制
  autocompleteTagsOptionActivated = false;

  optionActivated($event: MatAutocompleteActivatedEvent) {
    if ($event.option) {
      this.autocompleteTagsOptionActivated = true;
    }
  }

然后检查布尔变量并将其设置为false,当实际从键盘选择添加时:

代码语言:javascript
复制
  addTag(event: MatChipInputEvent): void {
    const input = event.input;
    const value = event.value;

    if ((value || '').trim()  && !this.autocompleteTagsOptionActivated) {
      this.formArrayTags.push(this.formBuilder.control(value.trim().toLowerCase()));
    }

    // Reset the input value
    if (input) {
      input.value = '';
    }

    this.tagsControl.setValue(null);
    this.formArrayTags.markAsDirty();
  }
代码语言:javascript
复制
  selectedTag(event: MatAutocompleteSelectedEvent): void {
    this.formArrayTags.push(this.formBuilder.control(event.option.viewValue));
    this.tagInput.nativeElement.value = '';
    this.tagsControl.setValue(null);
    this.autocompleteTagsOptionActivated = false;
  }
票数 1
EN

Stack Overflow用户

发布于 2021-05-05 17:54:20

当我在导入模块时更改顺序时,它对我起作用。在MatChipsModule之前导入MatAutocompleteModule

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

https://stackoverflow.com/questions/52608700

复制
相关文章

相似问题

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