شروع به کار با AngularJS 2.0 و TypeScript - قسمت نهم - مسیریابی
نویسنده: وحید نصیری
تاریخ: ۱۳۹۵/۰۲/۱۱ ۱۷:۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
<!-- Required for routing --> <script src="~/node_modules/angular2/bundles/router.dev.js"></script>
<!DOCTYPE html>
<html>
<head>
<base href="/"> //same as before ...
import { ROUTER_PROVIDERS } from 'angular2/router';
//same as before ...
@Component({
//same as before …
providers: [
ProductService,
HTTP_PROVIDERS,
ROUTER_PROVIDERS
]
})
//same as before ... <div class='panel panel-primary'>
<div class='panel-heading'>
{{pageTitle}}
</div>
</div> import { Component } from 'angular2/core';
@Component({
templateUrl: 'app/products/product-detail.component.html'
})
export class ProductDetailComponent {
pageTitle: string = 'Product Detail';
} { path: '/products', name: 'Products', component: ProductListComponent }, //same as before …
import { ROUTER_PROVIDERS, RouteConfig } from 'angular2/router';
//same as before …
@Component({
//same as before …
})
@RouteConfig([
{ path: '/welcome', name: 'Welcome', component: WelcomeComponent, useAsDefault: true },
{ path: '/products', name: 'Products', component: ProductListComponent }
])
export class AppComponent {
pageTitle: string = "DNT AngularJS 2.0 APP";
} import { Component } from 'angular2/core';
@Component({
templateUrl: 'app/home/welcome.component.html'
})
export class WelcomeComponent {
public pageTitle: string = "Welcome";
} <div class="panel panel-primary">
<div class="panel-heading">
{{pageTitle}}
</div>
<div class="panel-body">
<h3 class="text-center">Default page</h3>
</div>
</div> import { WelcomeComponent } from './home/welcome.component'; @Component({
//same as before …
template: `
<div>
<nav class='navbar navbar-default'>
<div class='container-fluid'>
<a class='navbar-brand'>{{pageTitle}}</a>
<ul class='nav navbar-nav'>
<li><a [routerLink]="['Welcome']">Home</a></li>
<li><a [routerLink]="['Products']">Product List</a></li>
</ul>
</div>
</nav>
<div class='container'>
<router-outlet></router-outlet>
</div>
</div>
`,
//same as before …
}) import { ROUTER_PROVIDERS, RouteConfig, ROUTER_DIRECTIVES } from 'angular2/router'; directives: [ROUTER_DIRECTIVES],
//same as before …
import { ProductDetailComponent } from './products/product-detail.component';
@Component({
//same as before …
})
@RouteConfig([
//same as before …
{ path: '/product/:id', name: 'ProductDetail', component: ProductDetailComponent }
])
//same as before … <td>{{ product.productName }}</td> <td>
<a [routerLink]="['ProductDetail', {id: product.productId}]">
{{product.productName}}
</a>
</td> import { Component, OnInit } from 'angular2/core';
import { ROUTER_DIRECTIVES } from 'angular2/router';
//same as before …
@Component({
//same as before …
directives: [StarComponent, ROUTER_DIRECTIVES]
})
import { Component } from 'angular2/core';
import { RouteParams } from 'angular2/router';
@Component({
templateUrl: 'app/products/product-detail.component.html'
})
export class ProductDetailComponent {
pageTitle: string = 'Product Detail';
constructor(private _routeParams: RouteParams) {
let id = +this._routeParams.get('id');
this.pageTitle += `: ${id}`;
}
}
<div class='panel panel-primary'>
<div class='panel-heading'>
{{pageTitle}}
</div>
<div class='panel-footer'>
<a class='btn btn-default' (click)='onBack()' style='width:80px'>
<i class='glyphicon glyphicon-chevron-left'></i> Back
</a>
</div>
</div>
import { Component } from 'angular2/core';
import { RouteParams, Router } from 'angular2/router';
@Component({
templateUrl: 'app/products/product-detail.component.html'
})
export class ProductDetailComponent {
pageTitle: string = 'Product Detail';
constructor(private _routeParams: RouteParams, private _router: Router) {
let id = +this._routeParams.get('id');
this.pageTitle += `: ${id}`;
}
onBack(): void {
this._router.navigate(['Products']);
}
} public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
constraints: new { controller = "Home" } // for catch all to work, Home|About|SomeName
);
// Route override to work with Angularjs and HTML5 routing
routes.MapRoute(
name: "NotFound",
url: "{*catchall}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
} import { ROUTER_PROVIDERS, RouteConfig, ROUTER_DIRECTIVES } from '@angular/router-deprecated'; <script src="~/systemjs.config.js"></script>
"dependencies": {
// ...
"@angular/router": "^3.0.0-alpha.7",
// ...
}, 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)
]; <base href=".">
// ...
import { APP_ROUTER_PROVIDERS } from './app.routes';
// ...
bootstrap(AppComponent, [
// ...
APP_ROUTER_PROVIDERS
])
.catch(err => console.error(err)); 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']);
}
} <a [routerLink]="['/product', product.productId]">
{{product.productName}}
</a>
function packUmd(pkgName) {
packages['@angular/' + pkgName] = { main: '/bundles/' + pkgName + '.umd.js', defaultExtension: 'js' };
}; var setPackageConfig = /*System.packageWithIndex ? packIndex : packUmd;*/packIndex;
// **OR** method 2
ngPackageNames.forEach(setPackageConfig);
packages['@angular/router'] = { main: 'index.js', defaultExtension: 'js' };
npm install npm run postinstall
import { Router } from '@angular/router';
.....
@Component({
selector: 'app-menu',
moduleId: module.id,
templateUrl: 'menu.component.html',
styleUrls: ['menu.component.css']
})
...
constructor(private _menuService: MenuService, public elementRef: ElementRef, public _router: Router) {
}
onClick(event: any) {
console.log('menu click');
debugger;
//----در این قسمت متغیر مقدار
//undefined
//دارد
this._router.navigate(['Subsystem']);
} import { bootstrap } from '@angular/platform-browser-dynamic';
import { HTTP_PROVIDERS } from '@angular/http';
import { Router} from '@angular/router';
import { MenuService } from './menu/menu.service';
import { AppComponent } from './app.component';
import { MenuComponent } from './menu/menu.component';
import { appRouterProviders } from './app.routes';
bootstrap(AppComponent, [MenuService, HTTP_PROVIDERS, appRouterProviders]); import { Component } from '@angular/core';
import { HTTP_PROVIDERS } from '@angular/http';
import { MenuComponent } from './menu/menu.component';
import { SubSystemComponent } from './subsystem/subsystem.component';
import { MenuService } from './menu/menu.service';
import { SubSystemService } from './subsystem/subsystem.service';
import { ROUTER_DIRECTIVES, RouterLink, RouterOutlet} from '@angular/router';
// Add the RxJS Observable operators we need in this app.
import './rxjs-operators';
@Component({
selector: 'my-app',
templateUrl: 'app/app.component.html',
directives: [MenuComponent, SubSystemComponent, ROUTER_DIRECTIVES, RouterOutlet, RouterLink],
providers: [MenuService, SubSystemService, HTTP_PROVIDERS]
})
export class AppComponent {
currentSubsSystemId: number=1;
}
// - Routes instead of RouteConfig
// - RouterModule instead of provideRoutes
import { Routes, RouterModule } from '@angular/router'; // - Updated Export export const routing = RouterModule.forRoot(routes);
<router-outlet name="role"></router-outlet> <router-outlet name="product"></router-outlet> <router-outlet name="book"></router-outlet>
<a [routerLink]="[{ outlets: { role: ['role'] } }]">Role</a>
<a [routerLink]="[{ outlets: { product: ['product'] } }]">Product</a>
<a [routerLink]="[{ outlets: { book: ['book'] } }]">Book</a> <a [routerLink]="[{ outlets: { product: ['product'] } }]">Product</a>