Effective Angular: Develop applications of any size by effectively using Angular with Nx, RxJS, NgRx, and Cypress
を購入したマスタカ
2章のPowerful Angular FeaturesのRoute Configuration options
まで読んだのでその感想
Angular
・main.ts
standaloneだと、bootstrapApplication
standaloneでないと、platformbrowserdynamic
・signal
computedを使うと計算した結果を流せる
https://angular.jp/guide/
画面遷移
・component側からの遷移
https://www.digitalocean.com/community/tutorials/angular-query-parameters-ja
import {Router } from '@angular/router';
private router: Router
goOverview() {
this.router.navigate(['expenses-overview'])
}
goApproval(){
this.router.navigateByUrl('/expenses-approval')
}
//view
<button (click)="goOverview()">goOverview</button>
<button (click)="goApproval()">goApproval</button>
・viewからの遷移
RouterModule, RouterOutletをcomponent側でimportしないとリンクされないので注意
https://github.com/stackblitz/core/issues/2844
<a routerLink="/expenses-overview">ovewrview</a> <a routerLink="/expenses-overview" routerLinkActive="active">ovewrview</a> <a [routerLink]="[routerLinkVariable]">overview2</a>
Routing
・router-outlet
routingで指定されたコンポーネントが表示される
・titleの設定方法
{ path: 'expenses-approval', component:ExpensesApprovalPageComponent, title: "test"}
・resolverを入れる
export const titleResolver: ResolveFn<string>
= (route: ActivatedRouteSnapshot) => route.routeConfig?.path?.replace('-', '') ?? '';
{ path: 'expenses-overview', component:ExpensesOverviewPageComponent, title: titleResolver},
・Lazy Load
{ path: 'lazy', loadComponent: () => import('./pages/expenses-approval-page.component').then(mod => mod.ExpensesApprovalPageComponent)}
・名前付きのoutlet
以下でアクセスできる
http://localhost:4200/a(sidebar:list)
https://stackoverflow.com/questions/71035688/angular-router-named-router-outlets-under-children-routes
urlが格好悪いなら変更できる
https://stackoverflow.com/questions/49515140/angular-router-outlet-name-popup-change-url-path-structure
{ path: 'list', component: ExpensesApprovalPageComponent, outlet: 'sidebar'}
<router-outlet name="sidebar"></router-outlet>
・child route
以下でアクセスできる
http://localhost:4200/a/overview
{ path: 'a', component:ExpensesComponent,
children: [{path: "overview", component:ExpensesOverviewPageComponent}]
},
・404
{ path: '**', component: ExpensesApprovalPageComponent}
・redirectTo
{ path: '', pathMatch: 'full', redirectTo: '/a'},
・画面表示前にresolverとしてロジックを入れる
export const snapShotResolver: ResolveFn<string>
= (route: ActivatedRouteSnapshot) => of("1")
{ path: 'a', component:ExpensesComponent, resolve: {a:snapShotResolver},
//データは以下で取得できる
constructor(private route2: ActivatedRoute) {
}
ngOnInit(): void {
console.log(this.route2.snapshot.data )
}
View
・angular17での書き方
@if (a >b){
<div>{{a}} is greater than {{b}}</div>
} @else {
<div>{{a}}is less than {{b}}</div>
}
@for (item of items; track [item.id](http://item.id/)) {
<li> {{[item.name](http://item.name/)}}</li>
} @empty {
<li> There are no items.</li>
}
・defer
遅延読み込みもできる
https://angular.dev/guide/defer
関連記事:
- Angular Projectsの2章のConfiguring routingを読んだ
- Angular Projectsの2章のBasic Layoutを読んだ
- Effective Angularの第2章の後半のまとめ