Angularでフォームに「ラジオボタン」のリストを設置するには?:Angular TIPS
選択肢の中から1つを選択する「ラジオボタンのリスト」を設置するための基本的な方法を解説する。
※現在では、Web標準技術を利用したアプリ開発が広く普及し、そのためのフレームワークも多数存在しています。その中でも主流のフレームワークの1つである「Angular」を活用し、そのための知識を備えることには大きな意味があります。本連載は、Angularユーザーに向けて、その使いこなしTIPSを紹介するものです。なお、本連載は「Build Insider」で公開していた連載「Angular Tips」を同サイトおよび筆者の了解を得たうえで、本フォーラムに移行したものです。記事はBuild Insiderで公開した状態のまま移行しているため、用語統一などの基準が@ITの通常の記事とは異なる場合があります。
【対応バージョン】
Angular 5以降。v5時点で執筆しました。
本稿では、Angularアプリでラジオボタンのリスト(単一選択リスト)を設置するためのポイントを解説します。以下は、あらかじめ用意されたオブジェクト配列booksを基に、ラジオボタンを生成する例です。また、ラジオボタンの選択を変更した場合、ログにも選択値を出力するものとします。
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
template: `
<form #myForm="ngForm">
<!-- [1]リストを生成 -->
<ng-container *ngFor="let b of books; index as i">
<label>
<!-- [2]ラジオボタンを生成 -->
<input type="radio" name="book"
id="book{{i}}"
[(ngModel)]="sbook"
[value]="b.isbn" [checked]="sbook == b.isbn"
(change)="show(i)">{{b.title}}
</label><br />
</ng-container>
</form>
`
})
export class AppComponent {
sbook = '978-4-7741-9130-0';
books = [
{ isbn: '978-4-8222-9894-4', title: '基礎からしっかり学ぶC#の教科書' },
{ isbn: '978-4-8222-5355-4', title: 'アプリを作ろう! Visual C#入門' },
{ isbn: '978-4-7741-9130-0', title: 'Angularアプリケーションプログラミング' },
{ isbn: '978-4-7741-9030-3', title: 'C#ポケットリファレンス' },
{ isbn: '978-4-7741-8994-9', title: 'HTML&CSS 超入門' }
];
show(i : number) {
console.log('ISBN:' + this.sbook);
console.log('書名:' + this.books[i].title);
}
}
以下に、ラジオボタンリスト生成のポイントをまとめていきます。
[1]リストを生成するのはngForディレクティブ
配列booksを基に、ラジオボタンを生成するには、ngForディレクティブを利用します。<label>/<br>のように複数の要素を繰り返し出力するには、ダミーのコンテナー要素として<ng-container>要素を設置し、これにngForディレクティブを適用します。
[2]ラジオボタンで指定する属性
ラジオボタンで指定すべき属性は以下の通りです。
まず、ラジオボタンが1つの固まりであることを表すために、name属性には同じ名前(ここではbook)を指定します。要素個々を識別するためのid属性とは別なので注意してください(こちらは「book」+インデックス番号とします*1)。
*1 インデックス番号はngForの予約変数index経由で取得できます。
ラジオボタンリスト全体として受け取るのは1つの値なので、ngModelディレクティブにも共通のプロパティ(ここではsbook)をひもづけておきます。
どのラジオボタンが選択されているかを表すのが、checked属性(正しくはプロパティ)です。ここでは、選択オプションの値(b.isbn)と現在値(sbook)とを比較した結果を渡します。等しい場合にはchecked属性を付与する、というわけです。
[3]ラジオボタンの値の変更を検知する
あとは、changeイベントハンドラーを設置し、ラジオボタンの選択が変更されたときに何らかの処理を行います。この際、イベントハンドラーにデータを識別するためのキーを渡している点に注目です(ここでは配列のインデックス番号)。
現在の選択値はsbookプロパティから取得できますが、このようにキー情報を渡しておくことで、オブジェクトの任意の情報にもアクセスできるので便利です。
処理対象:ディレクティブ(Directive) カテゴリ:基本
API:NgForOf(*ngFor) カテゴリ:@angular > common > DIRECTIVE(ディレクティブ)
Copyright© Digital Advantage Corp. All Rights Reserved.