به روز رسانی
تمام مسیریابیهای این سری به نگارش سوم روتر AngularJS 2.0 به روز رسانی شدند.
ریز جزئیات تغییرات
توضیحات:
ابتدا نیاز است وابستگیهای روتر جدید را به نحو ذیل به فایل package.json اضافه کنید:
سپس
یک فایل جدید را به نام app.routes.ts به ریشهی پروژه اضافه کنید، با این محتوا
در اینجا مسیریابیهای قدیمی برنامه از فایل app.component.ts خارج شده و به یک فایل مستقل منتقل شدهاند.
در سیستم مسیریابی جدید، خاصیتهای name و useAsDefault وجود ندارند و حذف شدهاند. همچنین مسیریابیها نباید با / شروع شوند.
به علاوه در فایل index.html، مسیر ریشه به نحو ذیل مشخص میشود:
پس از تعریف فایل app.routes.ts، نیاز است آنرا به main.ts معرفی کرد:
به این ترتیب کار برپایی مسیریابی اصلی سایت به پایان میرسد.
البته باید دقت داشت که فایل systemjs.config.js هم کمی نیاز است جهت بارگذاری این مسیریاب جدید اصلاح شود.
در ادامه، در فایل app.component.ts، دایرکتیوهای مرتبط با مسیریابی که در ROUTER_DIRECTIVES قرار دارند، اینبار از ماژول ذیل تامین میشوند:
سپس لینکهای مسیریابی، اینبار بجای نام مسیریابی که در نگارش سوم روتر، حذف شدهاست، به همان مسیر متناظر اشاره میکند:
این مورد جهت متدهای navigate هم صدق میکند و بجای نام، به مسیر مدنظر باید ویرایش شوند:
تغییر مهم دیگر رخ داده، در مورد نحوهی دسترسی به پارامترهای مسیریابی است که نمونهای از آنرا در مورد product-detail.component.ts در اینجا مشاهده میکنید:
اینبار سرویس RouteParams حذف شدهاست و بجای آن ActivatedRoute را داریم که خاصیت params آن، یک observable را باز میگرداند. به همین جهت باید متد subscribe آنرا جهت دسترسی به پارامترهای مسیریابی، فراخوانی کرد. این فراخوانی نیز باید در متد ngOnInit باشد و همچنین برای جلوگیری از نشتی حافظه، باید در ngOnDestroy کار unsubscribe آن انجام شود.
یک اصلاح دیگر هم در اینجا داریم. لینک به صفحهی جزئیات هر محصول اینبار به صورت زیر ویرایش میشود (در فایل product-list.component.html):
تمام مسیریابیهای این سری به نگارش سوم روتر AngularJS 2.0 به روز رسانی شدند.
ریز جزئیات تغییرات
توضیحات:
ابتدا نیاز است وابستگیهای روتر جدید را به نحو ذیل به فایل package.json اضافه کنید:
"dependencies": { // ... "@angular/router": "^3.0.0-alpha.7", // ... },
یک فایل جدید را به نام app.routes.ts به ریشهی پروژه اضافه کنید، با این محتوا
import { provideRouter, RouterConfig } from '@angular/router'; import { ProductListComponent } from './products/product-list.component'; import { WelcomeComponent } from './home/welcome.component'; import { ProductDetailComponent } from './products/product-detail.component'; import { ProductFormComponent } from './products/product-form.component'; import { SignupFormComponent } from './users/signup-form.component'; import { TypedShaComponent } from './using-third-party-libraries/typed-sha.component'; import { UnTypedShaComponent } from './using-third-party-libraries/untyped-sha.component'; import { UsingJQueryAddonsComponent } from './using-jquery-addons/using-jquery-addons.component'; export const routes: RouterConfig = [ { path: '', component: WelcomeComponent }, { path: 'welcome', component: WelcomeComponent }, { path: 'products', component: ProductListComponent }, { path: 'product/:id', component: ProductDetailComponent }, { path: 'addproduct', component: ProductFormComponent }, { path: 'adduser', component: SignupFormComponent }, { path: 'typedsha', component: TypedShaComponent }, { path: 'untypedsha', component: UnTypedShaComponent }, { path: 'usingjquery', component: UsingJQueryAddonsComponent } ]; export const APP_ROUTER_PROVIDERS = [ provideRouter(routes) ];
در سیستم مسیریابی جدید، خاصیتهای name و useAsDefault وجود ندارند و حذف شدهاند. همچنین مسیریابیها نباید با / شروع شوند.
به علاوه در فایل index.html، مسیر ریشه به نحو ذیل مشخص میشود:
<base href=".">
// ... import { APP_ROUTER_PROVIDERS } from './app.routes'; // ... bootstrap(AppComponent, [ // ... APP_ROUTER_PROVIDERS ]) .catch(err => console.error(err));
البته باید دقت داشت که فایل systemjs.config.js هم کمی نیاز است جهت بارگذاری این مسیریاب جدید اصلاح شود.
در ادامه، در فایل app.component.ts، دایرکتیوهای مرتبط با مسیریابی که در ROUTER_DIRECTIVES قرار دارند، اینبار از ماژول ذیل تامین میشوند:
import { ROUTER_DIRECTIVES } from '@angular/router';
سپس لینکهای مسیریابی، اینبار بجای نام مسیریابی که در نگارش سوم روتر، حذف شدهاست، به همان مسیر متناظر اشاره میکند:
<a [routerLink]="['/welcome']">Home</a>
this._router.navigate(['/products']);
import { Component, OnInit, OnDestroy } from '@angular/core'; import { Router, ActivatedRoute } from '@angular/router'; @Component({ templateUrl: 'app/products/product-detail.component.html' //template: require('./product-detail.component.html')//for webpack }) export class ProductDetailComponent implements OnInit, OnDestroy { private sub: any; pageTitle: string = 'Product Detail'; constructor(private _route: ActivatedRoute, private _router: Router) { } ngOnInit(): void { this.sub = this._route.params .subscribe(params => { let id = +params['id']; // (+) converts string 'id' to a number this.pageTitle += `: ${id}`; }); } ngOnDestroy(): void { this.sub.unsubscribe(); // we must unsubscribe before Angular destroys the component. Failure to do so could create a memory leak. } onBack(): void { this._router.navigate(['/products']); } }
یک اصلاح دیگر هم در اینجا داریم. لینک به صفحهی جزئیات هر محصول اینبار به صورت زیر ویرایش میشود (در فایل product-list.component.html):
<a [routerLink]="['/product', product.productId]"> {{product.productName}} </a>