从Angular 2中的路由子组件更新父组件标题

时间:2016-03-13 21:02:06

标签: angularjs angular angular2-routing angular2-template

我正在通过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文档)方法来实现这个目标吗?

非常感谢。

1 个答案:

答案 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