fix: 纠正错误及翻译遗漏的部分

This commit is contained in:
Zhicheng Wang 2018-03-12 13:04:24 +08:00 committed by Zhicheng Wang
parent 69908c35f6
commit 0c420c2efc
8 changed files with 117 additions and 30 deletions

View File

@ -8,7 +8,7 @@ An **Attribute** directive changes the appearance or behavior of a DOM element.
Try the <live-example title="Attribute Directive example"></live-example>.
你可以到这里试试:<live-example title="Attribute Directive example"></live-example>
你可以到这里试试:<live-example title="属性型指令范例"></live-example>
{@a directive-overview}
@ -174,8 +174,12 @@ the element to which you applied `appHighlight`.
`ElementRef` grants direct access to the host DOM element
through its `nativeElement` property.
`ElementRef` 通过其 `nativeElement` 属性给你了直接访问宿主 DOM 元素的能力。
This first implementation sets the background color of the host element to yellow.
这里的第一个实现把宿主元素的背景色设置为了黄色。
{@a apply-directive}
## Apply the attribute directive
@ -263,10 +267,13 @@ There are at least three problems with _that_ approach:
The handlers delegate to a helper method that sets the color on the host DOM element, `el`.
这些处理器委托了一个辅助方法来为DOM元素`el`)设置颜色。
The helper method, `highlight`, was extracted from the constructor.
The revised constructor simply declares the injected `el: ElementRef`.
这些处理器委托给了一个辅助方法它用于为DOM元素设置颜色`el`就是你在构造器中声明和初始化过的。
这个辅助方法(`highlight`)被从构造函数中提取了出来。
修改后的构造函数只负责声明要注入的元素 `el: ElementRef`
<code-example path="attribute-directives/src/app/highlight.directive.2.ts" linenums="false" title="src/app/highlight.directive.ts (constructor)" region="ctor"></code-example>
@ -289,7 +296,7 @@ the mouse hovers over the `p` and disappears as it moves out.
## Pass values into the directive with an _@Input_ data binding
## 使用数据绑定向指令传递值
## 使用 `@Input` 数据绑定向指令传递值
Currently the highlight color is hard-coded _within_ the directive. That's inflexible.
In this section, you give the developer the power to set the highlight color while applying the directive.
@ -617,13 +624,12 @@ Now apply that reasoning to the following example:
The template and its component trust each other.
The `color` property doesn't require the `@Input` decorator.
`color`属性位于右侧的绑定表达式中,它属于模板所在的组件。
`color`属性位于右侧的绑定表达式中,它属于模板所在的组件。
该模板和组件相互信任。因此`color`不需要`@Input`装饰器。
* The `appHighlight` property on the left refers to an _aliased_ property of the `HighlightDirective`,
not a property of the template's component. There are trust issues.
Therefore, the directive property must carry the `@Input` decorator.
`appHighlight`属性位于左侧,它引用了`HighlightDirective`中一个*带别名的*属性,它不是模板所属组件的一部分,因此存在信任问题。
`appHighlight`属性位于左侧,它引用了`HighlightDirective`中一个*带别名的*属性,它不是模板所属组件的一部分,因此存在信任问题。
所以,该属性必须带`@Input`装饰器。

View File

@ -41,7 +41,7 @@ in which two or more components share information.
**See the <live-example name="component-interaction"></live-example>**.
**参见<live-example name="cb-component-interaction"></live-example>**。
**参见<live-example name="component-interaction"></live-example>**。
{@a parent-to-child}

View File

@ -316,6 +316,8 @@ They are _not inherited_ by any components nested within the template nor by any
The CLI creates an empty styles file for you by default and references that file in the component's generated `styleUrls`.
CLI 会默认为你创建一个空白的样式表文件,并且在所生成组件的 `styleUrls` 中引用该文件。
<code-example language="sh" class="code-shell">
ng generate component hero-app
@ -352,8 +354,12 @@ You can also write `<link>` tags into the component's HTML template.
The link tag's `href` URL must be relative to the
_**application root**_, not relative to the component file.
link 标签的 `href` URL 必须是相对于***本应用的根路径***的,而不是相对于这个组件文件的。
When building with the CLI, be sure to include the linked style file among the assets to be copied to the server as described in the [CLI documentation](https://github.com/angular/angular-cli/wiki/stories-asset-configuration).
当使用 CLI 进行构建时,要确保这个链接到的样式表文件被复制到了服务器上。参见 [CLI 官方文档](https://github.com/angular/angular-cli/wiki/stories-asset-configuration)。
</div>
### CSS @imports
@ -377,17 +383,29 @@ In this case, the URL is relative to the CSS file into which you're importing.
### External and global style files
### 外部以及全局样式文件
When building with the CLI, you must configure the `.angular-cli.json` to include _all external assets_, including external style files.
当使用 CLI 进行构建时,你必须配置 `.angular-cli.json` 文件,使其包含*所有外部资源*(包括外部的样式表文件)。
Register **global** style files in the `styles` section which, by default, is pre-configured with the global `styles.css` file.
在它的 `styles` 区注册这些**全局**样式文件,默认情况下,它会有一个预先配置的全局 `styles.css` 文件。
See the [CLI documentation](https://github.com/angular/angular-cli/wiki/stories-global-styles) to learn more.
要了解更多,参见 [CLI 官方文档](https://github.com/angular/angular-cli/wiki/stories-global-styles)。
### Non-CSS style files
### 非 CSS 样式文件
If you're building with the CLI,
you can write style files in [sass](http://sass-lang.com/), [less](http://lesscss.org/), or [stylus](http://stylus-lang.com/) and specify those files in the `@Component.styleUrls` metadata with the appropriate extensions (`.scss`, `.less`, `.styl`) as in the following example:
如果使用 CLI 进行构建,那么你可以用 [sass](http://sass-lang.com/)、[less](http://lesscss.org/) 或 [stylus](http://stylus-lang.com/) 来编写样式,并使用相应的扩展名(`.scss`、`.less`、`.styl`)把它们指定到 `@Component.styleUrls` 元数据中。例子如下:
<code-example>
@Component({
@ -401,15 +419,23 @@ you can write style files in [sass](http://sass-lang.com/), [less](http://lesscs
The CLI build process runs the pertinent CSS preprocessor.
CLI 的构建过程会运行相关的预处理器。
When generating a component file with `ng generate component`, the CLI emits an empty CSS styles file (`.css`) by default.
You can configure the CLI to default to your preferred CSS preprocessor
as explained in the [CLI documentation](https://github.com/angular/angular-cli/wiki/stories-css-preprocessors
"CSS Preprocessor integration").
当使用 `ng generate component` 命令生成组件文件时CLI 会默认生成一个空白的 CSS 样式文件(`.css`)。
你可以配置 CLI让它默认使用你喜欢的 CSS 预处理器,参见 [CLI 官方文档](https://github.com/angular/angular-cli/wiki/stories-css-preprocessors
"CSS Preprocessor integration") 中的解释。
<div class="alert is-important">
Style strings added to the `@Component.styles` array _must be written in CSS_ because the CLI cannot apply a preprocessor to inline styles.
添加到 `@Component.styles` 数组中的字符串*必须写成 CSS*,因为 CLI 没法对这些内联的样式使用任何 CSS 预处理器。
</div>
{@a view-encapsulation}

View File

@ -264,5 +264,4 @@ Here are two sample components and the `AdComponent` interface for reference:
See the <live-example name="dynamic-component-loader"></live-example>.
参见<live-example name="cb-dynamic-component-loader"></live-example>
参见<live-example name="dynamic-component-loader"></live-example>

View File

@ -2488,7 +2488,7 @@ So you flatten the `Observable` with the `switchMap` operator instead.
The `switchMap` operator also cancels previous in-flight requests. If the user re-navigates to this route
with a new `id` while the `HeroService` is still retrieving the old `id`, `switchMap` discards that old request and returns the hero for the new `id`.
`switchMap`操作符也会取消以前未完成的在途请求。如果用户使用心得`id`再次导航到该路由,而`HeroService`仍在接受老`id`对应的英雄,那么`switchMap`就会抛弃老的请求,并返回这个新`id`的英雄信息。
`switchMap`操作符也会取消以前未完成的在途请求。如果用户使用新的`id`再次导航到该路由,而`HeroService`仍在接受老`id`对应的英雄,那么`switchMap`就会抛弃老的请求,并返回这个新`id`的英雄信息。
The observable `Subscription` will be handled by the `AsyncPipe` and the component's `hero` property will be (re)set with the retrieved hero.
@ -4432,14 +4432,14 @@ The same rule applies for feature modules loaded [asynchronously](#asynchronous-
### _CanActivateChild_: guarding child routes
### `CanAcitvateChild`:保护子路由
### `CanActivateChild`:保护子路由
You can also protect child routes with the `CanActivateChild` guard.
The `CanActivateChild` guard is similar to the `CanActivate` guard.
The key difference is that it runs _before_ any child route is activated.
我们还可以使用`CanActivateChild`守卫来保护子路由。
`CanActivateChild`守卫和`CanAcitvate`守卫很像。
`CanActivateChild`守卫和`CanActivate`守卫很像。
它们的区别在于,`CanActivateChild`会在*任何子路由*被激活之前运行。
You protected the admin feature module from unauthorized access.
@ -4459,8 +4459,8 @@ The `canActivateChild()` method can return an `Observable<boolean>` or `Promise<
async checks and a `boolean` for sync checks.
This one returns a `boolean`:
接下来,实现`CanAcitvateChild`方法,它所接收的参数与`CanAcitvate`方法一样:一个`ActivatedRouteSnapshot`和一个`RouterStateSnapshot`。
`CanAcitvateChild`方法可以返回`Observable<boolean>`或`Promise<boolean>`来支持异步检查,或`boolean`来支持同步检查。
接下来,实现`CanActivateChild`方法,它所接收的参数与`CanActivate`方法一样:一个`ActivatedRouteSnapshot`和一个`RouterStateSnapshot`。
`CanActivateChild`方法可以返回`Observable<boolean>`或`Promise<boolean>`来支持异步检查,或`boolean`来支持同步检查。
这里返回的是`boolean`
<code-example path="router/src/app/auth-guard.service.3.ts" linenums="false" title="src/app/auth-guard.service.ts (excerpt)" region="can-activate-child">
@ -5059,7 +5059,7 @@ You're already protecting the `AdminModule` with a `CanActivate` guard that prev
accessing the admin feature area.
It redirects to the login page if the user is not authorized.
我们已经使用`CanAcitvate`保护`AdminModule`了,它会阻止未授权用户访问管理特性区。如果用户未登录,它就会跳转到登录页。
我们已经使用`CanActivate`保护`AdminModule`了,它会阻止未授权用户访问管理特性区。如果用户未登录,它就会跳转到登录页。
But the router is still loading the `AdminModule` even if the user can't visit any of its components.
Ideally, you'd only load the `AdminModule` if the user is logged in.

View File

@ -788,38 +788,38 @@ For example, when the browser renders `<input type="text" value="Bob">`, it crea
corresponding DOM node with a `value` property *initialized* to "Bob".
例如,当浏览器渲染`<input type="text" value="Bob">`时,它将创建相应 DOM 节点,
其`value` property 被*初始化为* “Bob”。
它的 `value` 这个 property 被*初始化为* “Bob”。
When the user enters "Sally" into the input box, the DOM element `value` *property* becomes "Sally".
But the HTML `value` *attribute* remains unchanged as you discover if you ask the input element
about that attribute: `input.getAttribute('value')` returns "Bob".
当用户在输入框中输入 “Sally” 时DOM 元素的`value` *property* 变成了 “Sally”。
但是这个 HTML `value` *attribute* 保持不变。如果我们读取 input 元素的 attribute就会发现确实没变
当用户在输入框中输入 “Sally” 时DOM 元素的 `value` 这个 *property* 变成了 “Sally”。
但是该 HTML 的 `value` 这个 *attribute* 保持不变。如果我们读取 input 元素的 attribute就会发现确实没变
`input.getAttribute('value') // 返回 "Bob"`
The HTML attribute `value` specifies the *initial* value; the DOM `value` property is the *current* value.
HTML attribute `value`指定了*初始*值DOM `value` property 是*当前*值。
HTML `value` 这个 attribute 指定了*初始*值DOM `value` 这个 property 是*当前*值。
The `disabled` attribute is another peculiar example. A button's `disabled` *property* is
`false` by default so the button is enabled.
When you add the `disabled` *attribute*, its presence alone initializes the button's `disabled` *property* to `true`
so the button is disabled.
`disabled` attribute 是另一个古怪的例子。按钮的`disabled` *property* 是`false`,因为默认情况下按钮是可用的。
当我们添加`disabled` *attribute* 时,只要它出现了按钮的`disabled` *property* 就初始化为`true`,于是按钮就被禁用了。
`disabled` 这个 attribute 是另一种特例。按钮的`disabled` 这个 *property* 是`false`,因为默认情况下按钮是可用的。
当我们添加`disabled` 这个 *attribute* 时,只要它出现了按钮的`disabled` 这个 *property* 就初始化为`true`,于是按钮就被禁用了。
Adding and removing the `disabled` *attribute* disables and enables the button. The value of the *attribute* is irrelevant,
which is why you cannot enable a button by writing `<button disabled="false">Still Disabled</button>`.
添加或删除`disabled` *attribute*会禁用或启用这个按钮。但 *attribute* 的值无关紧要,这就是我们为什么没法通过
添加或删除`disabled` 这个 *attribute*会禁用或启用这个按钮。但 *attribute* 的值无关紧要,这就是我们为什么没法通过
`<button disabled="false">仍被禁用</button>`这种写法来启用按钮。
Setting the button's `disabled` *property* (say, with an Angular binding) disables or enables the button.
The value of the *property* matters.
设置按钮的`disabled` *property*(如,通过 Angular 绑定)可以禁用或启用这个按钮。
设置按钮的`disabled` 这个 *property*(如,通过 Angular 绑定)可以禁用或启用这个按钮。
这就是 *property* 的价值。
**The HTML attribute and the DOM property are not the same thing, even when they have the same name.**
@ -1511,8 +1511,6 @@ Here's how the table renders:
One-Two
1-2列
</td>
</tr>
@ -1523,16 +1521,12 @@ Here's how the table renders:
Five
五列
</td>
<td>
Six
六列
</td>
</tr>
@ -2920,27 +2914,44 @@ The `iconUrl` and `onSave` are members of the `AppComponent` class.
They are _not_ decorated with `@Input()` or `@Output`.
Angular does not object.
`iconUrl``onSave``AppComponent` 类的成员。但它们并没有带 `@Input()``@Output()` 装饰器。
Angular 不在乎。
**You can always bind to a public property of a component in its own template.**
It doesn't have to be an _Input_ or _Output_ property
**你总是可以在组件自己的模板中绑定到组件的公共属性,**而不用管它们是否输入Input属性或输出Output属性。
A component's class and template are closely coupled.
They are both parts of the same thing.
Together they _are_ the component.
Exchanges between a component class and its template are internal implementation details.
这是因为组件类和模板是紧耦合的,它们是同一个东西的两个部分,合起来构成组件。
组件类及其模板之间的交互属于实现细节。
### Binding to a different component
### 绑定到其它组件
You can also bind to a property of a _different_ component.
In such bindings, the _other_ component's property is to the _left_ of the (`=`).
你也可以绑定到*其它*组件的属性。
这种绑定形式下,*其它*组件的属性位于等号(`=`)的*左侧*。
In the following example, the `AppComponent` template binds `AppComponent` class members to properties of the `HeroDetailComponent` whose selector is `'app-hero-detail'`.
下面的例子中,`AppComponent` 的模板把 `AppComponent` 类的成员绑定到了 `HeroDetailComponent`(选择器为`'app-hero-detail'` 的属性上。
<code-example path="template-syntax/src/app/app.component.html" region="io-2" title="src/app/app.component.html" linenums="false">
</code-example>
The Angular compiler _may_ reject these bindings with errors like this one:
Angular 的编译器*可能*会对这些绑定报错,就像这样:
<code-example language="sh" class="code-shell">
Uncaught Error: Template parse errors:
@ -2951,42 +2962,71 @@ Can't bind to 'hero' since it isn't a known property of 'app-hero-detail'
You know that `HeroDetailComponent` has `hero` and `deleteRequest` properties.
But the Angular compiler refuses to recognize them.
你自己知道 `HeroDetailComponent` 有两个属性 `hero``detectRequest`,但 Angular 编译器并不知道。
**The Angular compiler won't bind to properties of a different component
unless they are Input or Output properties**.
**Angular 编译器不会绑定到其它组件的属性上 —— 除非这些属性是输入或输出属性。**
There's a good reason for this rule.
这条规则是有充分理由的。
It's OK for a component to bind to its _own_ properties.
The component author is in complete control of those bindings.
组件绑定到它*自己*的属性当然没问题。
该组件的作者对这些绑定有完全的控制权。
But other components shouldn't have that kind of unrestricted access.
You'd have a hard time supporting your component if anyone could bind to any of its properties.
Outside components should only be able to bind to the component's public binding API.
但是,其它组件不应该进行这种毫无限制的访问。
如果任何人都可以绑定到你的组件的任何属性上,那么这个组件就很难维护。
所以,外部组件应该只能绑定到组件的公共(允许绑定) API 上。
Angular asks you to be _explicit_ about that API.
It's up to _you_ to decide which properties are available for binding by
external components.
Angular 要求你*显式声明*那些 API。
它让*你*可以自己决定哪些属性是可以被外部组件绑定的。
#### TypeScript _public_ doesn't matter
#### TypeScript 的 `public` 是没用的
You can't use the TypeScript _public_ and _private_ access modifiers to
shape the component's public binding API.
你不能用 TypeScript 的 `public``private` 访问控制符来标明组件的公共 API。
<div class="alert is-important">
All data bound properties must be TypeScript _public_ properties.
Angular never binds to a TypeScript _private_ property.
所有数据绑定属性必须是 TypeScript 的公共属性Angular 永远不会绑定到 TypeScript 中的私有属性。
</div>
Angular requires some other way to identify properties that _outside_ components are allowed to bind to.
That _other way_ is the `@Input()` and `@Output()` decorators.
因此Angular 需要一些其它方式来标记出那些允许被*外部*组件绑定到的属性。
这种*其它方式*,就是 `@Input()``@Output()` 装饰器。
### Declaring Input and Output properties
### 声明输入与输出属性
In the sample for this guide, the bindings to `HeroDetailComponent` do not fail
because the data bound properties are annotated with `@Input()` and `@Output()` decorators.
在本章的例子中,绑定到 `HeroDetailComponent` 不会失败,这是因为这些要进行数据绑定的属性都带有 `@Input()``@Output()` 装饰器。
<code-example path="template-syntax/src/app/hero-detail.component.ts" region="input-output-1" title="src/app/hero-detail.component.ts" linenums="false">
</code-example>
@ -3356,10 +3396,14 @@ You'll need this template operator when you turn on strict null checks. It's opt
## The `$any` type cast function (`$any( <expression> )`)
## 类型转换函数 `$any` $any( <表达式> )
Sometimes a binding expression will be reported as a type error and it is not possible or difficult
to fully specify the type. To silence the error, you can use the `$any` cast function to cast
the expression to [the `any` type](http://www.typescriptlang.org/docs/handbook/basic-types.html#any).
有时候,绑定表达式可能会报类型错误,并且它不能或很难指定类型。要消除这种报错,你可以使用 `$any` 转换函数来把表达式转换成 [`any` 类型](http://www.typescriptlang.org/docs/handbook/basic-types.html#any)。
<code-example path="template-syntax/src/app/app.component.html" region="any-type-cast-function-1" title="src/app/app.component.html" linenums="false">
</code-example>
@ -3368,15 +3412,21 @@ In this example, when the Angular compiler turns your template into TypeScript c
it prevents TypeScript from reporting that `marker` is not a member of the `Hero`
interface.
在这个例子中,当 Angular 编译器把模板转换成 TypeScript 代码时,`$any` 表达式可以防止 TypeScript 编译器报错说 `marker` 不是 `Hero` 接口的成员。
The `$any` cast function can be used in conjunction with `this` to allow access to undeclared members of
the component.
`$any` 转换函数可以和 `this` 联合使用,以便访问组件中未声明过的成员。
<code-example path="template-syntax/src/app/app.component.html" region="any-type-cast-function-2" title="src/app/app.component.html" linenums="false">
</code-example>
The `$any` cast function can be used anywhere in a binding expression where a method call is valid.
`$any` 转换函数可以在绑定表达式中任何可以进行方法调用的地方使用。
## Summary
## 小结

View File

@ -86,6 +86,12 @@ Angular 和 Grails 开发高校[教务管理系统](http://www.github.com/jwgl)
- OuYancey来自Github
- GenweiWu来自Github
- dxyqqs来自Github
- wkylin来自Github
- rthel来自Github
- nickChenyx来自Github
- HNUHell来自Github
- SkyStardust来自Github
- Eve来自Github
- 另外还有一些做好事不留名的活雷锋
想让你的名字也出现在这里吗?请提供[反馈、纠错](https://github.com/angular/angular-cn/issues)。

View File

@ -88,7 +88,7 @@ If you're _coding along_ with this tutorial, stay here and add the *In-memory We
Install the *In-memory Web API* package from _npm_
`npm` 中安装这个*内存 Web API* 包
`npm` 中安装这个*内存 Web API* 包(译注:请使用 0.5+ 的版本,不要使用 0.4-
<code-example language="sh" class="code-shell">