Nested Routes

Ye Min Ko
Learn Ng
Published in
3 min readJun 14, 2021
Photo by Simon Berger on Unsplash

Route တွေမှာ main route တွေရှိတဲ့အပြင် ဒီ route တွေကနေ ခွဲထွက်လာတဲ့ child route တွေရှိနိုင်ပါသေးတယ်။

AppModule ကိုကြည့်မယ်ဆိုရင် main route သုံးမျိုးကို တွေ့နိုင်ပါတယ်။ home, servers နဲ့ users တွေပါ။

AppModule

တခြား route တွေကို main route တွေရဲ့ child route အဖြစ် ပြောင်းလိုက်လို့ ရပါတယ်။ ဒါကြောင့် AppModule မှာ အခုလိုပြောင်းလိုက်ပါ။

const appRoutes: Routes = [
{
path: '',
component: HomeComponent,
},
{
path: 'users',
component: UsersComponent,
children: [
{
path: ':id/:name',
component: UserComponent,
},
],
},
{
path: 'servers',
component: ServersComponent,
children: [
{
path: ':id',
component: ServerComponent,
},
{
path: ':id/edit',
component: ServerEditComponent,
},
],
},
];

children ဆိုတဲ့ property အကူအညီနဲ့ child routes တွေ ခွဲချလိုက်တာပါ။ သတိထားရမှာက parent route ရဲ့ path ကို child မှာဖျက်လိုက်ပါ။ ဥပမာ — servers/:id ကို :id လို့ပဲရေးပါ။

ဒီလိုပြောင်းရုံနဲ့ မရသေးပါ။ child route တွေ render လုပ်ရမဲ့နေရာကို parent မှာ ပြောပေးဖို့လိုပါတယ်။

ဒါကြောင့် UsersComponent မှာအခုလိုရေးပါ။ app-user ကိုပိတ်ပြီး router-outlet ထည့်လိုက်တာပါ။

...
<div class="col-8">
<router-outlet></router-outlet>
<!-- <app-user></app-user> -->
</div>
...

ServersComponent မှာလည်းပြင်ပေးပါ။

...
<div class="col-8">
<router-outlet></router-outlet>
<!-- <app-server></app-server> -->
<!-- <app-server-edit></app-server-edit> -->
</div>
...

ပြီးရင်တော့ Servers နဲ့ Users tab က list တွေကိုနှိပ်ကြည့်ပါ။

Child routes

Upgrading Our App

ခုဆိုရင် server နဲ့ user တစ်ခုချင်း ကြည့်လို့ရပြီ ဖြစ်ပေမဲ့ edit လုပ်လို့မရသေးပါ။ ဒါကြောင့် code တချို့ဆက်ရေးကြပါမယ်။

ServerComponent မှာ အခုလိုရေးပါ။

HTML
<button class="btn btn-primary" (click)="onEdit()">Edit</button>
TypeScript
onEdit() {
this.router.navigate(['edit'], { relativeTo: this.route });
}

Router ကို @angular/router ကနေ import လုပ်ဖို့မမေ့ပါနဲ့။ လက်ရှိရောက်နေတဲ့ နေရာက servers/:id ဖြစ်လို့ /edit ကိုဆက်သွားချင်ရင် အခုလို relative path ပုံစံရေးလိုက်လို့ရပါတယ်။

URL ကိုကြည့်ပါ။ edit ကိုရောက်သွားရင် query params နဲ့ fragment တွေပျောက်သွားတာတွေ့ရမှာပါ။

Server Edit Route

ဒီလိုဖြစ်နေတာခဏထားပြီး တခြားလုပ်ဆောင်ချက်တွေကို ဆက်ရေးပါမယ်။

ServersComponent မှာဒီလိုပြင်ပါ။ server id က 3 ဖြစ်မှ Edit လုပ်ခွင့်ပြုမယ်လို့ ရေးလိုက်တာပါ။

<li
...
[queryParams]="{ allowEdit: server.id === 3 ? '1' : '0' }"
>

ServerEditComponent template မှာ အခုလိုရေးပါ။

<h4 *ngIf="!allowEdit">You're not allowed to edit!</h4><div *ngIf="allowEdit">
<div class="form-group">
<label for="name">Server Name</label>
<input
type="text"
id="name"
class="form-control"
[(ngModel)]="server.name"
/>
</div>
<div class="form-group">
<label for="status">Server Status</label>
<select id="status" class="form-control"
[(ngModel)]="server.status">
<option value="online">Online</option>
<option value="offline">Offline</option>
</select>
</div>
<button class="btn btn-primary" (click)="onUpdate()">Update</button>
</div>

TypeScript မှာတော့ အခုလိုရေးပါ။

export class ServerEditComponent implements OnInit {

server: Server = { id: -1, name: '', status: 'offline' };
allowEdit = false;
constructor(private route: ActivatedRoute) {}onUpdate() {}ngOnInit() {
this.route.queryParams.subscribe((params: Params) => {
this.allowEdit = params['allowEdit'] === '1';
});
this.route.fragment.subscribe((value) => console.log(value));
}
}

Query params နဲ့ fragment ပါမလာတဲ့ ပြဿနာကိုဖြေရှင်းဖို့ ServerComponent မှာအခုလိုရေးပါ။

onEdit() {
this.router.navigate(['edit'], {
relativeTo: this.route,
queryParamsHandling: 'preserve',
preserveFragment: true
});
}

Query params ကိုဆက်သွားမဲ့ route မှာ ဘယ်လိုပုံစံနဲ့ သယ်မလဲဆိုတာ သတ်မှတ်လို့ရပါတယ်။

perserve ကိုရွေးရင်တော့ အသစ်ထည့်တဲ့ query params အားလုံးကိုဖယ်ချပြီး အရင်ကပါလာတဲ့ query params ကိုပဲ သယ်ပေးပါတယ်။

merge ကိုရွေးရင် အရင် query params နဲ့ အသစ်ထည့်တဲ့ query params ကိုပေါင်းပြီးသယ်ပေးပါတယ်။

ဒီမှာတော့ query params အသစ်မထည့်တော့တာကြောင့် preserve ကိုပဲရွေးပေးလိုက်ပါတယ်။

Fragment အတွက်ကတော့ fragment ကို ဆက်သယ်သွားချင်တယ် ဆိုရင် preserveFragment ကို true ပေးလိုက်ရင် ရပြီပဲဖြစ်ပါတယ်။

--

--

Ye Min Ko
Learn Ng

🌐 Web Developer | 👀 Self-Learner | 👨‍💻 An Introvert