2016-04-10 09:14:24 -04:00
|
|
|
|
include ../_util-fns
|
|
|
|
|
|
|
|
|
|
a(id='top')
|
|
|
|
|
:marked
|
|
|
|
|
Our app should be able to make the browser title bar say whatever we want it to say.
|
|
|
|
|
This cookbook explains how to do it.
|
2016-05-07 18:20:40 +01:00
|
|
|
|
|
2016-05-22 19:26:23 +08:00
|
|
|
|
应用程序应该能让浏览器标题栏显示我们想让它显示的内容。本*烹饪宝典*解释怎么做。
|
2016-04-10 09:14:24 -04:00
|
|
|
|
:marked
|
|
|
|
|
**See the [live example](/resources/live-examples/cb-set-document-title/ts/plnkr.html)**.
|
2016-05-07 18:20:40 +01:00
|
|
|
|
|
2016-05-09 22:16:34 +08:00
|
|
|
|
**参见[在线例子](/resources/live-examples/cb-set-document-title/ts/plnkr.html)**.
|
2016-05-15 23:00:09 +01:00
|
|
|
|
|
2016-04-10 09:14:24 -04:00
|
|
|
|
.l-sub-section
|
|
|
|
|
img(src='/resources/images/devguide/plunker-separate-window-button.png' alt="pop out the window" align="right" style="margin-right:-20px")
|
|
|
|
|
:marked
|
|
|
|
|
To see the browser Title bar changes,
|
|
|
|
|
pop out the preview window by clicking the blue 'X' button in the upper right corner.
|
2016-05-07 18:20:40 +01:00
|
|
|
|
|
|
|
|
|
要看到浏览器标题的变化,点击预览窗口右上角的'X'按钮,弹出窗口。
|
2016-04-10 09:14:24 -04:00
|
|
|
|
:marked
|
|
|
|
|
## The problem with *<title>*
|
|
|
|
|
|
2016-05-07 18:20:40 +01:00
|
|
|
|
## *<title>*的问题
|
|
|
|
|
|
2016-04-10 09:14:24 -04:00
|
|
|
|
The obvious approach is to bind a property of the component to the HTML `<title>` like this:
|
2016-05-07 18:20:40 +01:00
|
|
|
|
|
2016-05-18 11:38:10 +08:00
|
|
|
|
显而易见的方法是把组件的属性绑定到HTML的`<title>`标签上,像这样:
|
2016-05-15 23:00:09 +01:00
|
|
|
|
|
2016-04-10 09:14:24 -04:00
|
|
|
|
code-example(format='')
|
|
|
|
|
<title>{{This_Does_Not_Work}}</title>
|
|
|
|
|
:marked
|
|
|
|
|
Sorry but that won't work.
|
|
|
|
|
The root component of our application is an element contained within the `<body>` tag.
|
|
|
|
|
The HTML `<title>` is in the document `<head>`, outside the body, making it inaccessible to Angular data binding.
|
2016-05-07 18:20:40 +01:00
|
|
|
|
|
2016-05-18 11:38:10 +08:00
|
|
|
|
抱歉,这样不行。我们应用程序的根组件是一个包含在`<body>`标签里的元素。该HTML的`<title>`在文档的`<head>`元素里,在`<body>`之外,Angular的数据绑定无法访问到它。
|
2016-04-10 09:14:24 -04:00
|
|
|
|
|
|
|
|
|
We could grab the browser `document` object and set the title manually.
|
|
|
|
|
That's dirty and undermines our chances of running the app outside of a browser someday.
|
2016-05-07 18:20:40 +01:00
|
|
|
|
|
2016-05-18 11:38:10 +08:00
|
|
|
|
我们可以得到浏览器的`document`对象,并且手动设置标题。但是这样看起来很脏,而且我们将无法在浏览器之外运行应用程序。
|
2016-05-15 23:00:09 +01:00
|
|
|
|
|
2016-04-10 09:14:24 -04:00
|
|
|
|
.l-sub-section
|
|
|
|
|
:marked
|
2016-04-26 10:55:31 -07:00
|
|
|
|
Running your app outside a browser means that you can take advantage of server-side
|
|
|
|
|
pre-rendering for near-instant first app render times and for SEO. It means you could run from
|
|
|
|
|
inside a Web Worker to improve your app's responsiveness by using multiple threads. And it
|
|
|
|
|
means that you could run your app inside Electron.js or Windows Universal to deliver it to the desktop.
|
2016-05-07 18:20:40 +01:00
|
|
|
|
|
2016-06-14 09:26:54 +08:00
|
|
|
|
在浏览器外运行应用程序意味着:利用服务器端预先渲染,为应用程序实现几乎实时的首次渲染,同时还能支持SEO(搜索引擎优化)。
|
2016-05-18 11:38:10 +08:00
|
|
|
|
意味着你可以在一个Web Worker中运行你的应用程序,通过多线程技术增强应用程序的响应性。
|
|
|
|
|
还意味着你可以在Electron.js或者Windows Universal里面运行,发布到桌面环境。
|
2016-04-10 09:14:24 -04:00
|
|
|
|
|
|
|
|
|
:marked
|
|
|
|
|
## Use the *Title* service
|
2016-05-15 23:00:09 +01:00
|
|
|
|
|
2016-05-07 18:20:40 +01:00
|
|
|
|
## 使用*Title*服务
|
|
|
|
|
|
2016-04-10 09:14:24 -04:00
|
|
|
|
Fortunately, Angular 2 bridges the gap by providing a `Title` service as part of the *Browser platform*.
|
2016-05-02 00:29:25 +02:00
|
|
|
|
The [Title](../api/platform/browser/Title-class.html) service is a simple class that provides an API
|
2016-04-10 09:14:24 -04:00
|
|
|
|
for getting and setting the current HTML document title:
|
2016-05-07 18:20:40 +01:00
|
|
|
|
|
2016-05-18 11:38:10 +08:00
|
|
|
|
幸运的是,Angular 2在*浏览器平台*的包中,提供了一个`Title`服务,弥补了这个差别。
|
|
|
|
|
[Title](../api/platform/browser/Title-class.html)服务是一个简单的类,提供了一个API,用来获取和设置当前HTML文档的标题。
|
2016-04-10 09:14:24 -04:00
|
|
|
|
|
|
|
|
|
* `getTitle() : string` — Gets the title of the current HTML document.
|
2016-05-07 18:20:40 +01:00
|
|
|
|
|
2016-05-18 11:38:10 +08:00
|
|
|
|
*`getTitle(): string` —— 获取当前HTML文档的标题。
|
2016-05-07 18:20:40 +01:00
|
|
|
|
|
2016-04-10 09:14:24 -04:00
|
|
|
|
* `setTitle( newTitle : string )` — Sets the title of the current HTML document.
|
2016-05-07 18:20:40 +01:00
|
|
|
|
|
2016-05-18 11:38:10 +08:00
|
|
|
|
* `setTitle( newTitle: string)` —— 设置当前HTML文档的标题。
|
2016-04-10 09:14:24 -04:00
|
|
|
|
|
|
|
|
|
While this class is part of the Browser platform package, it is *not part of the default Browser
|
|
|
|
|
platform providers* that Angular loads automatically.
|
|
|
|
|
This means as we bootstrap our application using the Browser platform `boostrap()`
|
|
|
|
|
function, we'll also have to include `Title` service explicitly as one of the bootstrap providers:
|
2016-05-07 18:20:40 +01:00
|
|
|
|
|
2016-05-18 11:38:10 +08:00
|
|
|
|
虽然该类是浏览器平台包的一部分,但它*没有被*Angular加载为*浏览器平台上的默认服务供应商*。
|
|
|
|
|
这意味着,我们在使用浏览器平台的`bootstrap()`函数来引导我们的应用程序时,我们必须要明确地把`Title`服务作为引导期的供应商之一加入进来:
|
2016-04-10 09:14:24 -04:00
|
|
|
|
|
|
|
|
|
+makeExample( "cb-set-document-title/ts/app/main.ts", "bootstrap-title", "app/main.ts (provide Title service)" )(format='.')
|
|
|
|
|
:marked
|
|
|
|
|
Once we've explicitly provided the `Title` service we can then inject the `Title` service into any of our
|
|
|
|
|
custom application components and services.
|
|
|
|
|
|
2016-05-18 11:38:10 +08:00
|
|
|
|
一旦我们明确提供了`Title`服务,就能把`Title`服务注入到任何一个应用程序内组件和服务里面。
|
2016-05-07 18:20:40 +01:00
|
|
|
|
|
2016-04-10 09:14:24 -04:00
|
|
|
|
Let's inject the `Title` service into the root `AppComponent` and expose a bindable `setTitle` method that calls it:
|
2016-05-07 18:20:40 +01:00
|
|
|
|
|
2016-05-18 11:38:10 +08:00
|
|
|
|
我们来把`Title`服务注入到根组件`AppComponent`,并暴露出可供绑定的`setTitle`方法让别人来调用该服务:
|
2016-04-10 09:14:24 -04:00
|
|
|
|
|
|
|
|
|
+makeExample( "cb-set-document-title/ts/app/app.component.ts", "class", "app/app.component.ts (class)" )(format='.')
|
|
|
|
|
:marked
|
2016-05-15 23:03:05 +01:00
|
|
|
|
We bind that method to three anchor tags and, voila!
|
2016-05-07 18:20:40 +01:00
|
|
|
|
|
2016-05-18 11:38:10 +08:00
|
|
|
|
我们把这个方法绑定到三个A标签,瞧瞧!
|
2016-05-15 23:00:09 +01:00
|
|
|
|
|
2016-04-10 09:14:24 -04:00
|
|
|
|
figure.image-display
|
|
|
|
|
img(src="/resources/images/cookbooks/set-document-title/set-title-anim.gif" alt="Set title")
|
|
|
|
|
|
|
|
|
|
:marked
|
|
|
|
|
Here's the complete solution
|
2016-05-07 18:20:40 +01:00
|
|
|
|
|
2016-06-14 09:26:54 +08:00
|
|
|
|
这里是完整的方案(代码)。
|
2016-04-10 09:14:24 -04:00
|
|
|
|
|
|
|
|
|
+makeTabs(
|
|
|
|
|
`cb-set-document-title/ts/app/main.ts,
|
|
|
|
|
cb-set-document-title/ts/app/app.component.ts`,
|
|
|
|
|
'',
|
|
|
|
|
'app/main.ts, app/app.component.ts' )
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
Todo: tie this back to the router so we can see how to use this Title service to (re)set the title
|
|
|
|
|
that appears in the window navigation history and shows up in the back/forward buttons
|
|
|
|
|
during routing.
|
|
|
|
|
|
|
|
|
|
See https://github.com/angular/angular/issues/7630#issuecomment-198328802
|
|
|
|
|
|
|
|
|
|
.l-main-section
|
|
|
|
|
:marked
|
|
|
|
|
## Why we provide the *Title* service in *bootstrap*
|
2016-05-15 23:00:09 +01:00
|
|
|
|
|
2016-05-18 11:38:10 +08:00
|
|
|
|
## 为什么我们要在*bootstrap*里面提供这个*Title*服务
|
2016-05-15 23:00:09 +01:00
|
|
|
|
|
2016-04-10 09:14:24 -04:00
|
|
|
|
We generally recommended providing application-wide services in the root application component, `AppComponent`.
|
|
|
|
|
|
2016-05-18 11:38:10 +08:00
|
|
|
|
我们通常会推荐在应用程序的根组件`AppComponent`中提供应用程序级的服务。
|
2016-05-07 18:20:40 +01:00
|
|
|
|
|
2016-04-10 09:14:24 -04:00
|
|
|
|
Here we recommend registering the title service during bootstrapping,
|
2016-05-25 19:47:23 +05:30
|
|
|
|
a location we reserve for configuring the runtime Angular environment.
|
2016-04-10 09:14:24 -04:00
|
|
|
|
|
2016-05-18 11:38:10 +08:00
|
|
|
|
但这里,我们推荐在引导过程中注册这个Title服务,这个位置是我们为设置Angular运行环境而保留的。
|
2016-05-07 18:20:40 +01:00
|
|
|
|
|
2016-04-10 09:14:24 -04:00
|
|
|
|
That's exactly what we're doing.
|
|
|
|
|
The `Title` service is part of the Angular *browser platform*.
|
|
|
|
|
If we bootstrap our application into a different platform,
|
|
|
|
|
we'll have to provide a different `Title` service that understands the concept of a "document title" for that specific platform.
|
|
|
|
|
Ideally the application itself neither knows nor cares about the runtime environment.
|
2016-05-07 18:20:40 +01:00
|
|
|
|
|
2016-05-18 11:38:10 +08:00
|
|
|
|
我们的做法正是如此。这里的`Title`服务是Angular*浏览器平台*的一部分。如果我们在其它平台上引导应用程序,就得提供另一个专为那个平台准备的`Title`服务。
|
2016-04-10 09:14:24 -04:00
|
|
|
|
:marked
|
|
|
|
|
[Back to top](#top)
|
2016-05-07 18:20:40 +01:00
|
|
|
|
|
|
|
|
|
[回到顶部](#top)
|