AngularJS オートコンプリート

Oluwafisayo Oluwatayo 2024年2月15日
  1. REST API と Bootstrap を使用して AngularJS Autocomplete を実装する
  2. ng-autocomplete モジュールを使用して AngularJS Autocomplete を実装する
  3. Angular Material を使用して AngularJS Autocomplete を実装する
  4. まとめ
AngularJS オートコンプリート

オートコンプリート機能は、いくつかの理由で生活を楽にする 1つの機能です。 入力バーに文字を入力すると、作成しようとしている単語の提案と予測が表示されるため、テキストを簡単かつ迅速に書き出すことができます。

また、特定の名前が名前のリストに含まれていることを確認したい場合、入力時にオートコンプリート機能が名前を提案してくれるので、疑似 Ctrl+F.

Angular フレームワークでは、オートコンプリート機能を使用するさまざまな方法があります。

REST API と Bootstrap を使用して AngularJS Autocomplete を実装する

このメソッドでオートコンプリート関数を作成するには、Bootstrap から構造とスタイルを取得します。 次に、REST API を使用して検索するデータを取得します。

まず、ng new autocomplete を使用して新しいファイルを作成します。次に、サービス ファイルを作成する必要があります。 これは、REST API を使用してデータをフェッチするコードを配置するファイルです。

次に、getbootstrap.com に移動し、Get Started をクリックします。次に、CSS 見出しの下でリンクをコピーし、以下に示すように、index.html ファイルの head タグ内に貼り付けます。

コード スニペット - index.html:

<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <title>NgAutoComplete</title>
  <base href="/">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"
    integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">

</head>

<body>
  <app-root></app-root>
</body>

</html>

次に、app.component.html ファイルに移動して、Bootstrap でページ構造を作成します。 Bootstrap ページで autocomplete を検索し、Datalists の下にあるコード スニペットをコピーして貼り付けます。

次に、以下のように、検索するデータに対応するようにコード スニペットを調整します。

コード スニペット - app.component.html:

<div class="container">
  <div class="row">
    <div class="col-md-12">
      <form class="form mt-5">
        <label for="exampleDataList" class="form-label">Datalist example</label>
        <input class="form-control" list="datalistOptions" id="exampleDataList" placeholder="Type to search..."
          (change)="nameValue($any($event.target).value)">
        <datalist id="datalistOptions">
          <option *ngFor="let post of posts" [value]="post.name">
        </datalist>
      </form>
    </div>
  </div>
  <div class="row mt-5" *ngIf="username">
    <div class="col-sm-4">
      <div class="card purple">
        <h3 class="title">{{username}}</h3>
      </div>
    </div>
  </div>
</div>

ngFor 関数を使用して、リストから選択したさまざまな名前で Web ページをレンダリングします。 次に、app.component.ts でコードをビルドして、auto.service.ts ファイルから生成したデータを取得します。 最後に、次のようになります。

コード スニペット - app.component.ts:

import { Component, OnInit } from '@angular/core';
import { AutoService } from './auto.service';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
})
export class AppComponent implements OnInit {
  title = 'autocomthree';
  posts!: any;
  username: any;
  constructor(private service: AutoService) { }
  ngOnInit() {
    this.getAllData();
  }
  getAllData() {
    this.service.getData().subscribe((res: any) => {
      this.posts = res;
      console.log(this.posts);
    });
  }
  nameValue(name: any) {
    this.username = name;
    console.log(this.username);
  }
}

app.module.ts は、アプリを動作させるために必要な依存関係/モジュールをインポートする場所なので、app.module.ts は次のようになります。

コード スニペット - app.module.ts:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { HttpClientModule } from '@angular/common/http';
import { AppComponent } from './app.component';

@NgModule({
  declarations: [AppComponent],
  imports: [BrowserModule, HttpClientModule, ReactiveFormsModule, FormsModule],
  providers: [],
  bootstrap: [AppComponent],
})
export class AppModule {}

次に、オートコンプリート アプリで使用するデータを生成する必要があります。 ターミナルから、project フォルダー内に service ファイルを ng g s auto でインストールします。

このファイルは、src » app フォルダー内のコンポーネント ファイルの中にある必要があります。 ファイルに移動して、次のコードを入力します。

コード スニペット - auto.service.ts:

import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root',
})
export class AutoService {
  private baseURL = 'https://jsonplaceholder.typicode.com/users';

  constructor(private http: HttpClient) { }

  getData() {
    return this.http.get(this.baseURL);
  }
}

service ファイル内で、データを取得する URL を宣言し、getData() 関数を使用してデータをフェッチします。

Web ページを美しくするために、次のように app.component.ts ファイルに次のスタイルを追加できます。

コード スニペット - app.component.css:

.card {
    width: 100%;
    display: inline-block;
  box-sizing: border-box;
  background: #fff;
  padding: 20px;
  margin-bottom: 30px;
  }
  .title {
      margin-top: 0px;
  }
  .purple, .blue, .red, .orange, .green {
    color: #fff;
  }
  .purple {
    background: #5133AB;
  }

出力:

REST API と Bootstrap を使用した AngularJS のオートコンプリート

ng-autocomplete モジュールを使用して AngularJS Autocomplete を実装する

この方法を使用して、Angular autocomplete モジュールをインストールします。 新しいプロジェクト フォルダーを作成したら、npm install angular-ng-autocomplete で新しい Angular モジュールをインストールします。

次に、npmjs.com/package/angular-ng-autocomplete に移動し、以下のように使用例を app.component.html ファイルにコピーします。

コード スニペット - app.component.html:

<h1>{{title}}</h1>
<div class="ng-autocomplete">
  <ng-autocomplete
    [data]="data"
    [searchKeyword]="keyword"
    (selected)='selectEvent($event)'
    (inputChanged)='onChangeSearch($event)'
    (inputFocused)='onFocused($event)'
    [itemTemplate]="itemTemplate"
    [notFoundTemplate]="notFoundTemplate">
  </ng-autocomplete>
  <ng-template #itemTemplate let-item>
  <a [innerHTML]="item.name"></a>
  </ng-template>
  <ng-template #notFoundTemplate let-notFound>
  <div [innerHTML]="notFound"></div>
  </ng-template>
  </div>

次に、app.component.ts ファイル内で、以下に示すように、オートコンプリート Web アプリ内で使用する名前のリストを配列の形式で作成します。

コード スニペット - app.component.ts:

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

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styles: [
    '.ng-autocomplete {position: fixed; /* or absolute */ top: 50%; left: 20%;}'
  ]
})
export class AppComponent {
  title = 'Angular Autocomplete';
  keyword = 'name';
  data = [
     {
       id: 1,
       name: 'Usa'
     },
     {
       id: 2,
       name: 'England'
     },
     {
       id: 3,
       name: 'India'
     },
     {
       id: 4,
       name: 'africa'
     },
     {
       id: 5,
       name: 'nigeria'
     },
     {
       id: 6,
       name: 'albania'
     },
     {
       id: 7,
       name: 'madagascar'
     }
  ];
  selectEvent(item: any) {
    console.log('selected item '+item.name);
  }
  onChangeSearch(val: string) {
    console.log('selected val '+val);
  }
  onFocused(e: any){
  }
}

検索バーをクリックすると onFocused イベント ハンドラーがアクティブになり、selectEvent 関数がリストから選択した項目を表示します。

次に、app.module.ts 内で、以下に示すように、以前にインストールしたモジュールをインポートします。

コード スニペット - app.module.ts:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import {AutocompleteLibModule} from 'angular-ng-autocomplete';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    AutocompleteLibModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

出力:

ng-autocomplete モジュールを使用した AngularJS オートコンプリート

Angular Material を使用して AngularJS Autocomplete を実装する

Angular マテリアルは、Web アプリケーション用にすぐに使用できる Angular コンポーネントを提供します。この例では、autocomplete モジュールを使用します。

新しい project フォルダーを作成したら、project フォルダーに移動し、Angular マテリアルを ng add @angular/material でインストールします。 次に、material.angular.io にアクセスし、[開始]、[コンポーネント] の順にクリックし、Autocompleteを選択します。

例タブでは、States を使用しているため、以下のように HTML コード スニペットを app.component.html にコピーします。

コード スニペット - app.component.html:

<form [formGroup]="stateForm">
  <mat-form-field appearance="fill">
    <mat-label>States Group</mat-label>
    <input type="text"
           matInput
           formControlName="stateGroup"
           required
           [matAutocomplete]="autoGroup">
      <mat-autocomplete #autoGroup="matAutocomplete">
        <mat-optgroup *ngFor="let group of stateGroupOptions | async" [label]="group.letter">
          <mat-option *ngFor="let name of group.names" [value]="name">
            {{name}}
          </mat-option>
      </mat-optgroup>
    </mat-autocomplete>
  </mat-form-field>
</form>

これにより、ページの構造が、正確には States 検索バーになります。

次に、app.module.ts 内で、autocomplete コンポーネントのモジュール、状態のリストのフォーム フィールドを入力モジュールとしてインポートします。 ファイルは次のようになります。

コード スニペット - app.module.ts:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { MatAutocompleteModule } from '@angular/material/autocomplete';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { MatInputModule } from '@angular/material/input';
import { MatFormFieldModule } from '@angular/material/form-field';
import { ReactiveFormsModule } from '@angular/forms';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    MatAutocompleteModule,
    BrowserAnimationsModule,
    MatInputModule,
    MatFormFieldModule,
    ReactiveFormsModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

app.component.ts ファイルは、アプリケーションのメイン コードを保持します。 それでも、Angular の Web サイトでは、States の例の TS コード スニペットをコピーし、それらを AppComponentexport クラス内に配置しています。

その前に、インポートの直後に、TS コード スニペットの最初の部分である export interface StateGroup をコピーします。 以下に示すように、app.component.ts ファイルにはコードが必要です。

コード スニペット - app.component.ts:

import { Component, OnInit } from '@angular/core';
import { FormControl } from '@angular/forms';
import { Observable } from 'rxjs';
import { map, startWith } from 'rxjs/operators';
import {FormBuilder} from '@angular/forms';

export interface StateGroup {
  letter: string;
  names: string[];
}
export const _filter = (opt: string[], value: string): string[] => {
  const filterValue = value.toLowerCase();

  return opt.filter(item => item.toLowerCase().includes(filterValue));
};

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  title = 'autocomnine';
  stateForm = this._formBuilder.group({
    stateGroup: '',
  });

  stateGroups: StateGroup[] = [
    {
      letter: 'A',
      names: ['Alabama', 'Alaska', 'Arizona', 'Arkansas'],
    },
    {
      letter: 'C',
      names: ['California', 'Colorado', 'Connecticut'],
    },
    {
      letter: 'D',
      names: ['Delaware'],
    },
    {
      letter: 'F',
      names: ['Florida'],
    },
    {
      letter: 'G',
      names: ['Georgia'],
    },
    {
      letter: 'H',
      names: ['Hawaii'],
    },
    {
      letter: 'I',
      names: ['Idaho', 'Illinois', 'Indiana', 'Iowa'],
    },
    {
      letter: 'K',
      names: ['Kansas', 'Kentucky'],
    },
    {
      letter: 'L',
      names: ['Louisiana'],
    },
    {
      letter: 'M',
      names: [
        'Maine',
        'Maryland',
        'Massachusetts',
        'Michigan',
        'Minnesota',
        'Mississippi',
        'Missouri',
        'Montana',
      ],
    },
    {
      letter: 'N',
      names: [
        'Nebraska',
        'Nevada',
        'New Hampshire',
        'New Jersey',
        'New Mexico',
        'New York',
        'North Carolina',
        'North Dakota',
      ],
    },
    {
      letter: 'O',
      names: ['Ohio', 'Oklahoma', 'Oregon'],
    },
    {
      letter: 'P',
      names: ['Pennsylvania'],
    },
    {
      letter: 'R',
      names: ['Rhode Island'],
    },
    {
      letter: 'S',
      names: ['South Carolina', 'South Dakota'],
    },
    {
      letter: 'T',
      names: ['Tennessee', 'Texas'],
    },
    {
      letter: 'U',
      names: ['Utah'],
    },
    {
      letter: 'V',
      names: ['Vermont', 'Virginia'],
    },
    {
      letter: 'W',
      names: ['Washington', 'West Virginia', 'Wisconsin', 'Wyoming'],
    },
  ];
  stateGroupOptions: Observable<StateGroup[]>;
  constructor(private _formBuilder: FormBuilder) {}

  ngOnInit() {
    this.stateGroupOptions = this.stateForm.get('stateGroup')!.valueChanges.pipe(
      startWith(''),
      map(value => this._filterGroup(value || '')),
    );
  }
  private _filterGroup(value: string): StateGroup[] {
    if (value) {
      return this.stateGroups
        .map(group => ({letter: group.letter, names: _filter(group.names, value)}))
        .filter(group => group.names.length > 0);
    }
    return this.stateGroups;
  }
}

出力:

Angular Material を使用した AngularJS Autocomplete

ここでは、状態の名前をリストし、検索バーに焦点を合わせたら、ngOnInit() を使用してリストを有効にします。 次に、_filterGroup 関数は、検索バーに入力した文字ごとに最も近い州を提案します。

まとめ

説明した方法を使用して、オートコンプリート機能を別の方法で適用できます。 さらに、オートコンプリート機能は多くの状況、特に大きなデータを扱う場合に適用できます。

Oluwafisayo Oluwatayo avatar Oluwafisayo Oluwatayo avatar

Fisayo is a tech expert and enthusiast who loves to solve problems, seek new challenges and aim to spread the knowledge of what she has learned across the globe.

LinkedIn

関連記事 - Angular Bootstrap