همانطور که
در قسمت قبل مشاهده کردیم، از تعریف Child Routes برای میسر ساختن نمایش قالبهای کامپوننتها، در درون سایر قالبهای کامپوننتها، استفاده میشود. برای نمونه قالبهای برگههای یک فرم ویرایش اطلاعات را با تعریف یک router-outlet دیگر، در درون قالب والد آنها نمایش دادیم. اما شاید بخواهیم کار گروه بندی مسیریابیها را بدون افزودن یک router-outlet دیگر انجام دهیم. برای این منظور میتوان مسیریابیهای کامپوننتهای نمایش لیست محصولات، جزئیات یک محصول و ویرایش یک محصول را ذیل یک والد که هیچ کامپوننتی ندارد، گروه بندی کرد. به همین جهت به router-outlet اضافهتری نیاز ندارد و به آن component-less routes نیز گفته میشود.
علت نیاز به گروه بندی مسیریابیها در ذیل یک مسیریابی بدون کامپوننت
علت وجود امکان گروه بندی مسیریابیها، در ذیل یک مسیریابی بدون کامپوننت به شرح زیر هستند:
- امکان مدیریت و ساماندهی سادهتر مسیریابیها با افزایش حجم برنامه
- امکان به اشتراک گذاری Route Resolvers و محافظت کنندههای از مسیرها
- ممکن ساختن امکان lazy loading آن گروه
گروه بندی مسیریابیها
در حال حاضر، مسیریابی ماژول محصولات مثال این سری، یک چنین تعاریفی را پیدا کردهاست:
const routes: Routes = [
{ path: 'products', component: ProductListComponent },
{
path: 'products/:id', component: ProductDetailComponent,
resolve: { product: ProductResolverService }
},
{
path: 'products/:id/edit', component: ProductEditComponent,
resolve: { product: ProductResolverService },
children: [ ]
}
];
در اینجا میتوان دو مسیریابی نمایش جزئیات یک محصول و ویرایش و افزودن یک محصول را تبدیل به فرزندان مسیریابی نمایش لیست محصولات کرد. از آنجائیکه Child Routes، سبب توسعه و بسط مسیریابی والد خود میشوند، نیاز است مسیرهای مطلق آنها را تبدیل به مسیرهایی نسبی کنیم:
const routes: Routes = [
{
path: 'products',
children: [
{
path: '',
component: ProductListComponent
},
{
path: ':id',
component: ProductDetailComponent,
resolve: { product: ProductResolverService }
},
{
path: ':id/edit',
component: ProductEditComponent,
resolve: { product: ProductResolverService },
children: [
{ path: '', redirectTo: 'info', pathMatch: 'full' },
{ path: 'info', component: ProductEditInfoComponent },
{ path: 'tags', component: ProductEditTagsComponent }
]
}
]
}
];
در اینجا کدهای کامل این تغییرات را جهت تعریف یک component-less route مشاهده میکنید.
- ابتدا دو مسیریابی نمایش جزئیات و ویرایش یک محصول، تبدیل به یک گروه، به صورت فرزندان مسیریابی products با تعریف خاصیت children آن شدهاند.
- سپس pathهای آنها ویرایش شده و با حذف /product از ابتدای آنها، حالت نسبی را پیدا کردهاند.
- مسیریابی products که والد این مسیریابیهای فرزند است نیز بدون کامپوننت تعریف شدهاست.
- کامپوننت مسیریابی products، به عنوان مدیریت کنندهی مسیر پیش فرض این فرزندان، تعریف شدهاست.
Child routes در درون router-outlet تعریف شدهی درون قالب والد آنها نمایش داده میشوند (مانند برگههای edit info و edit tags
قسمت قبل). با توجه به اینکه اکنون دو مسیریابی دیگر، به صورت فرزندان مسیریابی صفحهی نمایش لیست محصولات تعریف شدهاند، به همین جهت باید یک router-outlet جدید را در درون قالب کامپوننت نمایش لیست محصولات، تعریف کرد. اما نمیخواهیم نمایش جزئیات یک محصول و یا صفحهی ویرایش آنها، در همان صفحهی نمایش لیست محصولات ظاهر شوند. برای رفع این مشکل است که نیاز به تعریف یک مسیریابی بدون کامپوننت خواهیم داشت. به همین جهت در تعاریف فوق، تعریف component: ProductListComponent به یکی از مداخل آرایهی children منتقل شدهاست (بجای تعریف آن همانند قبل ذیل مسیریابی products) که دارای path خالی است (یا همان مسیر پیش فرض که در اینجا به products اشاره میکند).
در این حالت چون مسیریابی والد، به همراه یک کامپوننت تعریف نشدهاست، مسیریاب، سعی در نمایش فرزندان آن در router-outlet والد نمیکند. بجای آن، فرزندان، در یک router-outlet قرار گرفتهی در یک سطح بالاتر، نمایش داده میشوند که دقیقا همان router-outlet تعریف شدهی در فایل قالب src\app\app.component.html است.
کدهای کامل این قسمت را از اینجا میتوانید دریافت کنید: angular-routing-lab-05.zip
برای اجرای آن فرض بر این است که پیشتر
Angular CLI را نصب کردهاید. سپس از طریق خط فرمان به ریشهی پروژه وارد شده و دستور npm install را صادر کنید تا وابستگیهای آن دریافت و نصب شوند. در آخر با اجرای دستور ng s -o برنامه ساخته شده و در مرورگر پیش فرض سیستم نمایش داده خواهد شد.