【问题标题】:How to slice a part of string using typescript?如何使用打字稿对字符串的一部分进行切片?
【发布时间】:2018-08-23 19:28:30
【问题描述】:

我正在构建一个带有多选功能的自定义选择框,就像角材料芯片一样..

HTML

<div class="autocomplete">
    <div class="chips-input-container">
        <div class="col-md-4">
            <div class="user-chip" *ngFor="let user of userSelects">
                {{user.name}}
                <span (click)="deleteSelects(user)" class="delete-icon-chip">&#10006;</span>
            </div>
        </div>

        <div class="col-md-4 form-label-group">
            <input name="suggestion" type="text" id="autocomplete-input" class="form-control" placeholder="User" (click)="suggest()"
             [(ngModel)]="userSelectsString" (keyup)="onKey($event)" id="autocomplete-input">
            <label for="autocomplete-input" class="emailBox"></label>
            <label class="fa fa-caret-down input-icon"></label>
        </div>
    </div>

    <ul id="autocomplete-results" class="autocomplete-items" *ngIf="show">
        <li *ngFor="let s of suggestions" [ngClass]="isSelected(s) ? 'selected-suggestion' : ''" (click)="selectSuggestion(s)">{{ s.name }}</li>
    </ul>
</div>

TS:

import { Component } from '@angular/core';
import { FormControl } from '@angular/forms';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
   suggestion: string = '';
  typeahead: FormControl = new FormControl();
  openSelectBox: boolean = false;

  fieldHistory: string[] = [];

  inputValue: string;
  autocomplete_results: any;
  input = document.querySelector('#autocomplete-input');
  userSelectsString = '';
  name = 'Angular';
  userSelects = [];
  suggestions = [{"id":"001","name":"mango"},{"id":"002","name":"apple"},{"id":"003","name":"banana"},{"id":"004","name":"pine"},{"id":"005","name":"orange"},{"id":"006","name":"chery"},{"id":"007","name":"watermelon"},{"id":"008","name":"grapes"},{"id":"009","name":"lemon"}];

  show: boolean = false;

  suggest() {
    this.show = true;
  }

  isSelected(s:any) {
   return this.userSelects.findIndex((item) => item.id === s.id) > -1 ? true : false;
  }

  selectSuggestion(s) {
    this.userSelects.find((item) => item.id === s.id) ? 
    this.userSelects = this.userSelects.filter((item) => item.id !== s.id) :
    this.userSelects.push(s);
    this.show = false;
  }

  deleteSelects(s) {
    this.userSelects = this.userSelects.filter((item) => item.id !== s.id);
  }

  assignToNgModel() {
    this.userSelectsString = '';
    this.userSelects.map((item) => this.userSelectsString += item.name + ' ');
  }

  onKey(e) {
    this.inputValue = e.target.value;

    if (this.inputValue.length > 0) {
      var people_to_show = [];

      this.autocomplete_results = document.getElementById("autocomplete-results");
      this.autocomplete_results.innerHTML = '';
      people_to_show = this.autocomplete(this.inputValue);

      for (let i = 0; i < people_to_show.length; i++) {
        this.autocomplete_results.innerHTML += '<li>' + people_to_show[i] + '</li>';
      }
      this.autocomplete_results.style.display = 'block';
    } else {
      people_to_show = [];
      this.autocomplete_results.innerHTML = '';
    }
  }

  autocomplete(val) {
    var people_return = [];
    for (let i = 0; i < this.suggestions.length; i++) {
      if (val === this.suggestions[i].slice(0, val.length)) {
        people_return.push(this.suggestions[i]);
      }
    }
    return people_return;
  }
}

在选择和删除部分,一切正常,但是当我实现自动完成时,我无法获得结果,因为我正在对对象数组使用切片。

我的数据是:

  suggestions = [{"id":"001","name":"mango"},{"id":"002","name":"apple"},{"id":"003","name":"banana"},{"id":"004","name":"pine"},{"id":"005","name":"orange"},{"id":"006","name":"chery"},{"id":"007","name":"watermelon"},{"id":"008","name":"grapes"},{"id":"009","name":"lemon"}];

在 for 循环中,我收到错误,因为 类型 '{ "id": string; 上不存在属性 'slice' “名称”:字符串; }'。this.suggestions[i].slice(0, val.length)行中,

  for (let i = 0; i < this.suggestions.length; i++) {
      if (val === this.suggestions[i].slice(0, val.length)) {
        people_return.push(this.suggestions[i]);
      }
    }

如果我在suggestions: any = [{"id":"001","name":"mango"},...}] 中给出任何内容,则表明切片不是函数。

请帮助我实现自动完成的结果。

Stackblitz: https://stackblitz.com/edit/angular-euuvxw

【问题讨论】:

  • 当您执行this.suggestions[i].slice 时,您试图切片一个对象,而不是一个数组
  • slice() 用于数组类型而不是对象。
  • 这与问题无关,但我希望您知道,将字符串添加到 innerHTML 而不转义可能会导致安全问题,如果它们来自您无法控制和包含的来源HTML 代码。你可以escape the HTML

标签: javascript angular typescript autocomplete


【解决方案1】:

您可能想要切片名称,而不是整个建议对象。看看您是如何使用结果的,您可能也只想将名称推送到people_return

for (let i = 0; i < this.suggestions.length; i++) {
  if (val === this.suggestions[i].name.slice(0, val.length)) {
  //                              ^^^^
    people_return.push(this.suggestions[i].name);
  }
}

【讨论】:

  • 结果列表显示为[object Object],如果我在输入框中输入man for mango..
  • 但是我无法获得我在 stackblitz 中显示的列表视图。是因为我使用 javascript 我无法获得像 onclick 这样的结果吗?
  • 如果你帮我修复那部分会更有帮助,因为我是初学者,我无法继续前进。我很抱歉。如果你也更新它这对我来说会是更好的解决方案..
  • 我去了 stackblitz,刚刚看到一个页面,上面写着“你好 Angular!开始编辑,看看发生了什么奇迹 :)”。您是否在最新更改后保存了堆栈闪电战?
  • 看起来列表样式是由您的 Angular 模板生成的,当您覆盖 HTML 时,您会丢失样式。我试图让自动完成显示通过 Angular 模板并得到一些工作:stackblitz.com/edit/angular-7jepkn。警告:我根本不了解 Angular,所以我的解决方案可能会违反 Angular 的期望并在未来引起问题。
【解决方案2】:

您需要在数组类型值中使用slice()。在你的情况下是this.suggestions 所以使用this.suggestions.slice(0, val.length)

【讨论】:

  • 如果我使用上述内容,下拉列表将变为空。
猜你喜欢
  • 2012-12-25
  • 2021-03-12
  • 2012-07-13
  • 2021-06-10
  • 2022-11-19
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
  • 2012-11-20
相关资源
最近更新 更多