使用带有<input />标签的Angular的多选下拉菜单

时间:2018-08-22 08:48:46

标签: javascript html angular typescript multi-select

我正在构建angular 6应用程序,其中需要使用<input>文本框而不使用<select>进行多选下拉列表。

HTML

<form>
  Select User: <input type="text" name="user" [value]="users"><br>
  <button type="submit"> Submit </button>
</form>

Ts

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

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
    users = ['First User', 'Second User', 'Third User', 'Fourth User'];
}

我还需要使用纯Javascript,Tpescript 没有第三方或jquery

还建议使用html 数据列表

我进行了很多搜索,但找不到合适的解决方案。 请帮助我达到目标。

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

2 个答案:

答案 0 :(得分:2)

检查此StackBlitz:Dropdown Example

HTML文件:

<button type="button" (click)="clear()">Clear</button>

<div class="autocomplete">
    <input name="suggestion" type="text" placeholder="User" (click)="suggest()" [formControl]="typeahead">

    <div class="autocomplete-items" *ngIf="show">
      <div *ngFor="let s of suggestions" (click)="selectSuggestion(s)">{{ s }}</div>
    </div>
</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  {
  name = 'Angular';

  suggestions: string [] = [];
  suggestion: string;
  show: boolean = false;
  typeahead: FormControl = new FormControl();

  fieldHistory: string [] = [];

  suggest() {
    this.suggestions = this.users;
    this.show = true;
  }

  selectSuggestion(s) {
      this.suggestion = "";

      var index = this.fieldHistory.findIndex(function(element) {
          return element === s;
      });

      if (index === -1) {
          this.fieldHistory.push(s);
      } else {
          var firstPart = this.fieldHistory.slice(0, index);
          var secondPart = this.fieldHistory.slice(++index);

          this.fieldHistory = firstPart.concat(secondPart);
      }

      for (let i = 0; i < this.fieldHistory.length; i++) 
           this.suggestion = this.suggestion + " " + this.fieldHistory[i];

      this.typeahead.patchValue(this.suggestion);
      this.show = false;
  }

  clear() {
      this.suggestion = "";
      this.fieldHistory.pop();

      for (let item of this.fieldHistory) 
          this.suggestion = this.suggestion + " " + item;

      this.typeahead.patchValue(this.suggestion);
  }

  users = ['First User', 'Second User', 'Third User', 'Fourth User'];
}

CSS文件:

.autocomplete {
    position: relative;
    width: 100%;
}

.autocomplete-items {
    position: absolute;
    border: 1px solid #d4d4d4;
    border-radius: 4px;
    margin-top: 15px;
    top: 100%;
    left: 0;
    right: 0;
}

.autocomplete-items div {
    padding: 10px;
    cursor: pointer;
    background-color: #fff;
    border-bottom: 1px solid #d4d4d4;
}

.autocomplete-items div:hover {
    background-color: #e9e9e9; 
}

也导入模块:import { ReactiveFormsModule } from '@angular/forms';

答案 1 :(得分:1)

这是工作代码,我用[[ngModel)]代替了formcontrols:

https://stackblitz.com/edit/angular-qjrhs5?file=src%2Fapp%2Fapp.component.css