我正在通过Angular 2 documentation on routing。我有一个示例应用程序,它显示了两个组件,这些组件被路由并连接到导航链接。 Here is a Plunker展示了这种行为。它是在Typescript中使用Angular 2构建的。
这是主要的app.component.ts'代码:
import {Component} from 'angular2/core';
import {RouteConfig, ROUTER_DIRECTIVES} from 'angular2/router';
import {CrisisCenterComponent} from './crisis-center/crisis-center.component';
import {HeroListComponent} from './heroes/hero-list.component';
import {HeroDetailComponent} from './heroes/hero-detail.component';
import {DialogService} from './dialog.service';
import {HeroService} from './heroes/hero.service';
@Component({
selector: 'my-app',
template: `
<h1 class="title">Component Router</h1>
<nav>
<a [routerLink]="['CrisisCenter']">Crisis Center</a>
<a [routerLink]="['Heroes']">Heroes</a>
</nav>
<router-outlet></router-outlet>
`,
providers: [DialogService, HeroService],
directives: [ROUTER_DIRECTIVES]
})
@RouteConfig([
{ // Crisis Center child route
path: '/crisis-center/...',
name: 'CrisisCenter',
component: CrisisCenterComponent,
useAsDefault: true
},
{path: '/heroes', name: 'Heroes', component: HeroListComponent},
{path: '/hero/:id', name: 'HeroDetail', component: HeroDetailComponent},
{path: '/disaster', name: 'Asteroid', redirectTo: ['CrisisCenter', 'CrisisDetail', {id:3}]}
])
export class AppComponent { }
我要做的是替换主要的<h1>
)标题&#39;组件路由器&#39;以&#39;视图&#39;的名称那个被渲染。所以当你点击“危机中心”时标题应该说“危机中心”;当你点击英雄&#39;标题应该说是英雄&#39;
我不想将标题移到子组件模板中 - 我希望将其保留在HTML页面的顶部,最好只保存在一个模板中。
有人能建议最好的(大多数类似Angular文档)方法来实现这个目标吗?
非常感谢。
答案 0 :(得分:10)
我就是这样做的:
- 首先,创建一个负责在组件之间共享路由名称的服务。并创建一个新的Subject&#34;主题同时作为Observable和Observer工作&#34;
import {Injectable} from 'angular2/core';
import {Subject} from 'rxjs/Rx';
@Injectable()
export class RouteNames{
public name = new Subject();
}
- 其次,通过在bootstrap上注入它来提供应用程序级别的服务:
import {RouteNames} from './route-names.service';
bootstrap(AppComponent, [ROUTER_PROVIDERS,RouteNames]);
现在,您需要做的就是将您的服务注入app.component和每个将更改路由名称的组件。
app.component:订阅RouteNames.name主题并在下一步更新变量routeName。
import {RouteNames} from './route-names.service';
@Component({
selector: 'my-app',
template: `
<h1 class="title">{{routeName}}</h1>
<nav>
<a [routerLink]="['CrisisCenter']">Crisis Center</a>
<a [routerLink]="['Heroes']">Heroes</a>
</nav>
<router-outlet></router-outlet>
`,
...
})
@RouteConfig([
...
])
export class AppComponent {
routeName = "Component Router";
constructor(private _routeNames:RouteNames){
this._routeNames.name.subscribe(n => this.routeName = n);
}
}
现在,在CrisisCenter上,注入RouteNames服务并在RouteNames.name上调用下一个:
从&#39; ../ route-names.service&#39;中导入{RouteNames};
@Component({
...
})
@RouteConfig([
...
])
export class CrisisCenterComponent {
constructor(private _routeNames:RouteNames){
_routeNames.name.next('Crisis Center');
}
}
就是这样,这是working plunker