设置文档标题

应用程序应该能让浏览器标题栏显示我们想让它显示的内容。本烹饪宝典解释怎么做。

参见live example / downloadable example

要在在线例子中看到浏览器标题的变化,请点击右上角的图标在Plunker编辑器中打开它,然后点击预览窗口右上角的蓝色'X'按钮,弹出窗口。

pop out the window
pop out the window

<title>的问题

显而易见的方法是把组件的属性绑定到HTML的<title>标签上,像这样:

<title>{{This_Does_Not_Work}}</title>

抱歉,这样不行。我们应用程序的根组件是一个包含在<body>标签里的元素。该HTML的<title>在文档的<head>元素里,在<body>之外,Angular的数据绑定无法访问到它。

可以从浏览器获得document对象,并且手动设置标题。但是这样看起来很脏,而且将无法在浏览器之外运行应用程序。

在浏览器外运行应用程序意味着:利用服务器端预先渲染,为应用程序实现几乎实时的首次渲染,同时还能支持SEO(搜索引擎优化)。 意味着你可以在一个Web Worker中运行你的应用程序,通过多线程技术增强应用程序的响应性。 还意味着你可以在Electron.js或者Windows Universal里面运行,发布到桌面环境。

使用Title服务

幸运的是,Angular在浏览器平台的包中,提供了一个Title服务,弥补了这种差异。 Title服务是一个简单的类,提供了一个API,用来获取和设置当前HTML文档的标题。

我们来把Title服务注入到根组件AppComponent,并暴露出可供绑定的setTitle方法让别人来调用该服务:

src/app/app.component.ts (class)

export class AppComponent {
  public constructor(private titleService: Title ) { }

  public setTitle( newTitle: string) {
    this.titleService.setTitle( newTitle );
  }
}

我们把这个方法绑定到三个A标签,瞧瞧!

Set title

这里是完整的方案(代码)。

  1. import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
  2. import { AppModule } from './app/app.module';
  3. platformBrowserDynamic().bootstrapModule(AppModule);

为什么要在bootstrap里面提供这个Title服务

我们通常会推荐在应用程序的根组件AppComponent中提供应用程序级的服务。

但这里,我们推荐在引导过程中注册这个Title服务,这个位置是为设置Angular运行环境而保留的。

我们的做法正是如此。这里的Title服务是Angular浏览器平台的一部分。如果在其它平台上引导应用程序,就得提供另一个专为那个平台准备的Title服务。

回到顶部