【问题标题】:Update parent component title from routed child component in Angular 2 [duplicate]从Angular 2中的路由子组件更新父组件标题[重复]
【发布时间】:2016-06-28 19:12:57
【问题描述】:

我正在通过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 { }

我要做的是将主 (&lt;h1&gt;) 标题“组件路由器”替换为正在呈现的“视图”的名称。因此,当您单击“危机中心”时,标题应显示“危机中心”;当您点击“英雄”时,标题应显示“英雄”。

我不想将标题移动到子组件模板中 - 我想将其保留在 HTML 页面的顶部,最好只保留在一个模板中。

谁能提出最好的(最类似于 Angular 文档的)方法来实现这一点?

非常感谢。

【问题讨论】:

    标签: angularjs angular angular2-routing angular2-template


    【解决方案1】:

    这就是我的做法:

    -- 首先,创建一个服务,负责在组件之间共享路由名称。并新建一个Subject“subjects 同时作为 Observable 和 Observer 工作”

    import {Injectable} from 'angular2/core';
    import {Subject} from 'rxjs/Rx';
    
    @Injectable()
    export class RouteNames{
      public name = new Subject();
    }
    

    -- 其次,通过在引导程序中注入它来在应用程序级别提供您的服务:

    import {RouteNames} from './route-names.service';
    bootstrap(AppComponent, [ROUTER_PROVIDERS,RouteNames]);
    

    现在,您需要做的就是将您的服务注入 app.component 以及将更改路由名称的每个组件。

    app.component:订阅 RouteNames.name 主题并在 next 上更新变量 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 上调用 next:

    从'../route-names.service'导入{RouteNames};

    @Component({
      ...
    })
    @RouteConfig([
      ...
    ])
    export class CrisisCenterComponent {
      constructor(private _routeNames:RouteNames){
        _routeNames.name.next('Crisis Center');
      }
    }
    

    就是这样,这里是working plunker

    【讨论】:

    • 太棒了,谢谢。 Subject 看起来很方便!为了完整起见,我也更新了 Plunker 的“英雄”组件。
    • @Dan Yup,我在我的服务中经常使用主题进行交流。我将您的 plunker 编辑添加到我的答案中。
    • 很棒的答案!帮了我很多忙,谢谢!
    • 这太棒了 +1 任何想法是否有可能更进一步并做一些类似的事情来将组件(代替字符串)注入标题?
    • @mutex,或者类似this ?,而不是字符串,主题采用{component:Type,routeName:string} 对象。 AppComponent 注入新的标头组件,将routeName 分配给它,如果旧组件存在,则将其删除。
    猜你喜欢
    • 2016-12-19
    • 1970-01-01
    • 2017-11-20
    • 2017-05-18
    • 1970-01-01
    • 2021-02-10
    • 2017-07-02
    • 2016-08-21
    • 2016-05-21
    相关资源
    最近更新 更多