Angularでルーティングパスを通じてデータを送信する方法
Angularでルーティングパスを通じてデータを送信する
ルーティングパラメータを使う
これは最も簡単な方法です。コンポーネントへのルーティングパスにパラメータを追加することで、データを渡すことができます。
例:
// app-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
const routes: Routes = [
{
path: 'user/:id',
component: UserComponent,
},
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
// user.component.ts
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'app-user',
templateUrl: './user.component.html',
styleUrls: ['./user.component.css']
})
export class UserComponent implements OnInit {
userId: number;
constructor(private route: ActivatedRoute) {}
ngOnInit() {
this.userId = this.route.snapshot.params['id'];
}
}
上記の例では、UserComponent
へのルーティングパスに/:id
というパラメータを追加しています。そして、UserComponent
ではActivatedRoute
サービスを使って、パラメータの値を取得しています。
クエリパラメータを使う方法もあります。これは、URLの末尾に?
記号を付けて、パラメータと値のペアを追加することで実現できます。
// app-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
const routes: Routes = [
{
path: 'users',
component: UsersComponent,
},
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
// users.component.ts
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'app-users',
templateUrl: './users.component.html',
styleUrls: ['./users.component.css']
})
export class UsersComponent implements OnInit {
users: any[];
constructor(private route: ActivatedRoute) {}
ngOnInit() {
this.users = this.route.snapshot.queryParams['users'];
}
}
NavigationExtrasを使う
より複雑なデータを渡す場合は、NavigationExtras
を使うことができます。
// app-component.ts
import { Component } from '@angular/core';
import { Router } from '@angular/router';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
constructor(private router: Router) {}
navigateToUser() {
const user = {
id: 1,
name: 'John Doe',
};
this.router.navigate(['user'], {
queryParams: {
user: JSON.stringify(user)
}
});
}
}
上記の例では、navigateToUser
というメソッドを使って、UserComponent
へナビゲートしています。そして、NavigationExtras
オブジェクトを使って、クエリパラメータにuser
というキーを追加し、その値にJSON.stringify
でシリアル化したユーザーオブジェクトを渡しています。
状態管理ライブラリを使う
NgRxなどの状態管理ライブラリを使うと、コンポーネント間でデータを共有することがより簡単にできます。
// app.module.ts
import { NgModule } from '@angular/core';
import { StoreModule } from '@ngrx/store';
import { AppComponent } from './app.component';
@NgModule({
imports: [
BrowserModule,
Store
ルーティングパラメータを使う
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
const routes: Routes = [
{
path: 'user/:id',
component: UserComponent,
},
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
user.component.ts:
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'app-user',
templateUrl: './user.component.html',
styleUrls: ['./user.component.css']
})
export class UserComponent implements OnInit {
userId: number;
constructor(private route: ActivatedRoute) {}
ngOnInit() {
this.userId = this.route.snapshot.params['id'];
}
}
<a routerLink="/user/1">ユーザー1へ</a>
<a routerLink="/user/2">ユーザー2へ</a>
クエリパラメータを使う
app-routing.module.ts:
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
const routes: Routes = [
{
path: 'users',
component: UsersComponent,
},
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'app-users',
templateUrl: './users.component.html',
styleUrls: ['./users.component.css']
})
export class UsersComponent implements OnInit {
users: any[];
constructor(private route: ActivatedRoute) {}
ngOnInit() {
this.users = this.route.snapshot.queryParams['users'].split(',');
}
}
<a routerLink="/users?users=1,2,3">ユーザー一覧へ</a>
NavigationExtrasを使う
import { Component } from '@angular/core';
import { Router } from '@angular/router';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
constructor(private router: Router) {}
navigateToUser() {
const user = {
id: 1,
name: 'John Doe',
};
this.router.navigate(['user'], {
queryParams: {
user: JSON.stringify(user)
}
});
}
}
<button (click)="navigateToUser()">ユーザー詳細へ</button>
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'app-user',
templateUrl: './user.component.html',
styleUrls: ['./user.component.css']
})
export class UserComponent implements OnInit {
user: any;
constructor(private route: ActivatedRoute) {}
ngOnInit() {
this.user = JSON.parse(this.route.snapshot.queryParams['user']);
}
}
状態管理ライブラリを使う
import { NgModule } from '@angular/core';
import { StoreModule } from '@ngrx/store';
import { AppComponent } from './app.component';
@NgModule({
imports: [
BrowserModule,
StoreModule.forRoot({
reducers: {
user: userReducer,
}
}),
],
declarations: [
AppComponent
],
bootstrap: [AppComponent]
})
export class AppModule { }
user.reducer.ts:
import { Action } from '@ngrx/store';
export
ルーティングパスを通じてデータを送信する他の方法
サービスを使って、コンポーネント間でデータを共有することができます。
// user.service.ts
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class UserService {
private user: any;
constructor() {}
setUser(user: any) {
this.user = user;
}
getUser() {
return this.user;
}
}
// user.component.ts
import { Component, OnInit } from '@angular/core';
import { UserService } from './user.service';
@Component({
selector: 'app-user',
templateUrl: './user.component.html',
styleUrls: ['./user.component.css']
})
export class UserComponent implements OnInit {
constructor(private userService: UserService) {}
ngOnInit() {
const user = this.userService.getUser();
// ...
}
}
// app.component.ts
import { Component } from '@angular/core';
import { UserService } from './user.service';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
constructor(private userService: UserService) {}
navigateToUser() {
const user = {
id: 1,
name: 'John Doe',
};
this.userService.setUser(user);
this.router.navigate(['user']);
}
}
上記の例では、UserService
というサービスを使って、UserComponent
とAppComponent
間でデータを共有しています。
Subjectを使うと、コンポーネント間でイベントを発行・購読することができます。
// user.service.ts
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class UserService {
private userSubject = new Subject<any>();
constructor() {}
setUser(user: any) {
this.userSubject.next(user);
}
getUser() {
return this.userSubject.asObservable();
}
}
// user.component.ts
import { Component, OnInit } from '@angular/core';
import { UserService } from './user.service';
@Component({
selector: 'app-user',
templateUrl: './user.component.html',
styleUrls: ['./user.component.css']
})
export class UserComponent implements OnInit {
constructor(private userService: UserService) {}
ngOnInit() {
this.userService.getUser().subscribe(user => {
// ...
});
}
}
// app.component.ts
import { Component } from '@angular/core';
import { UserService } from './user.service';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
constructor(private userService: UserService) {}
navigateToUser() {
const user = {
id: 1,
name: 'John Doe',
};
this.userService.setUser(user);
this.router.navigate(['user']);
}
}
NgRxを使う
// app.module.ts
import { NgModule } from '@angular/core';
import { StoreModule } from '@ngrx/store';
import { AppComponent } from './app.component';
@NgModule({
imports: [
BrowserModule,
StoreModule.forRoot({
reducers: {
user: userReducer,
}
}),
],
declarations: [
AppComponent
],
bootstrap: [AppComponent]
})
export class AppModule { }
import { Action } from '@ngrx/store';
export interface UserState {
user: any;
}
export
angular routes angular-router