【问题标题】:how to filter data from backend in angular如何以角度过滤来自后端的数据
【发布时间】:2020-10-01 20:41:33
【问题描述】:

我输入了用户可以搜索/键入数据的位置,我想知道如何让用户只能搜索后端已经提供的内容并禁止他们创建新数据。

所以在我的后端我有“图表”和“地图”字样,我想办法让用户只能搜索这个。如果我输入除此之外的其他内容并按 Enter,则不会发生任何事情。

现在,如果用户输入了这两个以外的其他文本并回车,它会创建一个新数据并将其推送到后端。

我不想像这样 (input == "Chart" || input == "Map") 那样硬编码,因为我们稍后会在后端添加更多数据。

超级

<div>
<input matInput #input [formControl]="tagCtrl" [matAutocomplete]="auto" [matChipInputFor]="chipList"
[matChipInputSeparatorKeyCodes]="separatorKeysCodes" (matChipInputTokenEnd)="add($event,null)">
</div>
  add(event: MatChipInputEvent, event1: MatAutocompleteSelectedEvent): void {
    if (event1 == null) {
      const input = event.input;
      const value = event.value;

      this.tagService.addTag(this._workspace.guid, 'workspace', value).subscribe((tag) => console.log("added", tag));
      // Add Tag
      if ((value || '').trim()) {
        this.superTags.push({ tag: value.trim(), type: TagType.super });
      }
      // Reset the input value
      if (input) {
        input.value = '';
      }
      this.tagCtrl.setValue(null);
    }
    else {
      const input = event1.option;
      const value = event1.option.value;
      this.tagService.addTag(this._workspace.guid, 'workspace', value).subscribe((tag) => console.log("added", tag));
      if (input) {
        input.value = '';
      }
      this.tagCtrl.setValue(null);
    }

  }

我们将不胜感激任何建议或帮助。

【问题讨论】:

  • 只需在 add 函数中添加一个条件,检查输入值是否存在于建议拾取中,不要创建新的。并在选项选择防止重复。

标签: html angular typescript filter angular-material


【解决方案1】:

假设您有由用户搜索填充的 suggestions 数组。

监听autocomplete optionActivated事件,当trueonSelected事件将与Enter一起触发时,绕过添加事件。

 add(event: MatChipInputEvent, event1: MatAutocompleteSelectedEvent): void {
  const input = event.input;
  const value = event.value?.trim();
    if (!value || this._optionActivated) {
        return;
    }   


    // Check if value from create event (Enter, Comma) already exists on search result.
    const suggested = this.suggestions.find(item => item?.id && item.title === value);
    if (suggested) {
     console.log("Already exists on search result", suggested)
     // add to selection list.
    } else {
  this.tagService.addTag(this._workspace.guid, 'workspace', value).subscribe((tag) => {
  console.log("added", tag)
  // add to selection list.
  if (input) {
    input.value = '';
  }
  this.tagCtrl.setValue(null);
}

optionActivated(event: MatAutocompleteActivatedEvent) {
    this._optionActivated = !!event.option;
}

optionClosed() {
    this._optionActivated = false;
}

模板.html:

<mat-autocomplete
    #auto="matAutocomplete"
    (closed)="optionClosed()"
    (optionActivated)="optionActivated($event)"
    (optionSelected)="onSelected($event)"
>
    <mat-option *ngFor="let tag of suggestions" [value]="tag">
        {{ tag.title }}
    </mat-option>
</mat-autocomplete>

【讨论】:

  • 您好,谢谢您的帮助,但我不确定这如何阻止用户创建新数据,而不是只能搜索后端提供的内容。我也确实尝试过,但是由于某种原因,当我从下拉列表中键入或选择时,“单词”不再显示。
  • 这里的问题是当用户关注自动完成选项并按回车时。触发了两个事件,选择选项事件和添加事件。并且您需要防止添加事件并且只接受从自动完成选项中选择。
  • 如果选项打开但未聚焦并且用户按 Enter 仅添加事件调用您检查选项列表中是否存在项目仅选择并添加(不创建),如果不存在则创建它。跨度>
猜你喜欢
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 2020-09-07
  • 2021-07-28
  • 2020-07-06
  • 1970-01-01
相关资源
最近更新 更多