みなさんこんにちは、現役エンジニアのサメハックです
未経験からWebエンジニアに転職し、
正社員として5年働いたのちフリーランスとして独立しました。
Angularの解説シリーズです。
今回はユーザ割当処理の作成方法について学んでいきましょう!
駆け出しエンジニアや未経験の方、
また新入社員を指導する先輩社員にとっても
わかりやすいように解説していきます!
この記事を読むと・・・
- 実際のシステムでよくあるユーザ割当処理が実装できる
※PCにnpm、nodeがインストールされている前提で記述します。
yarn等をお使いの方は読み替えてください。
環境がない人はcodesansbox等を使ってね!
作りたいもの
これが今回の完成形だよ!
他のファイルは左上のハンバーガーメニューをクリックして確認してね!
他のファイルは左上のハンバーガーメニューをクリックして確認してね!
todoList = [
{ title: '事務所の片付け', userId: 1 },
{ title: '荷物の発送', userId: 2 },
{ title: '料金支払い', userId: 3 },
{ title: '経費精算', userId: '' },
];
ちょっと説明がし辛いですが、上記のようなユーザIDをもつオブジェクトと
ユーザ情報を持つ配列があったとします。
userList = [
{ id: 1, name: 'サメハック' },
{ id: 2, name: 'ねこハック' },
{ id: 3, name: 'いぬハック' },
];
これらを結合して、ユーザを割り当てる処理を作成します。
userIdはuserListのidと一致させるよ!
実行環境
Angularのバージョンが古いと動かないことがあるよ!
うまく動かなければアップデートしてね!
うまく動かなければアップデートしてね!
実際に作ってみよう!
初期設定
ng new my-app
cd my-app
ng serve -o
ng add @angular/material
AngularMaterialのインストール時に聞かれる質問はすべてYesで大丈夫だよ!
app.component.html
<h2>ToDoリスト</h2>
<table border="1">
<thead>
<th>No</th>
<th>タイトル</th>
<th>担当者</th>
</thead>
<tbody>
<!-- todoリスト分繰り返す -->
<tr *ngFor="let todo of todoList; let index = index">
<td>{{ index + 1 }}</td>
<td>{{ todo.title }}</td>
<td>
<!-- userIdとリンクする ※双方向データバインディングである[(ngModel)]とするとエラーになるので注意 -->
<mat-select [ngModel]="todo.userId" (ngModelChange)="myFunc($event)">
<!-- 未選択時の設定 -->
<mat-option value=""> 担当者なし </mat-option>
<!-- 選択肢はユーザーの中から選択 valueはuserのID -->
<mat-option *ngFor="let user of userList" [value]="user.id">
{{ user.name }}
</mat-option>
</mat-select>
</td>
</tr>
</tbody>
</table>
最大のポイントは
mat-selectの値をデータ→画面の単方向データバインディング
とすることだよ!
mat-selectの値をデータ→画面の単方向データバインディング
とすることだよ!
app.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent {
userList = [
{ id: 1, name: 'サメハック' },
{ id: 2, name: 'ねこハック' },
{ id: 3, name: 'いぬハック' },
];
todoList = [
{ title: '事務所の片付け', userId: 1 },
{ title: '荷物の発送', userId: 2 },
{ title: '料金支払い', userId: 3 },
{ title: '経費精算', userId: '' },
];
// ユーザIDを取得
myFunc(event: any) {
console.log('event', event);
}
}
app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { FormsModule } from '@angular/forms';
import { MatSelectModule } from '@angular/material/select';
@NgModule({
declarations: [AppComponent],
imports: [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
MatSelectModule,
],
providers: [],
bootstrap: [AppComponent],
})
export class AppModule {}
GitHubのサンプルコード
今回作ったものはGitHubにあげているので
うまく動作しなかった方は是非ダウンロードしてみてください。
GitHub - same-hack/Angular-user-assignment
Contribute to same-hack/Angular-user-assignment development by creating an account on GitHub.
- ユーザ割当処理を作成できてえらい!
満足いただけたら、1クリックなのでSNSフォローしてもらえると嬉しいです🦈