Merge pull request #176 from todoubaba/hierarchical-dependency-injection
Polish hierarchical-dependency-injection.jade
This commit is contained in:
commit
28a51f44ec
|
@ -14,7 +14,7 @@ block includes
|
|||
interesting and useful results.
|
||||
|
||||
Angular 有一个多级依赖注入系统。
|
||||
实际上,应用程序中有一个与组件树平行的注入器树(译注:平行是指结构完全相同且一一对应)。
|
||||
实际上,应用程序中有一个与组件树平行的注入器树(译注:平行是指结构完全相同且一一对应)。
|
||||
我们可以在组件树中的任何级别上重新配置注入器,达到一些有趣和有用的效果。
|
||||
|
||||
In this chapter we explore these points and write some code.
|
||||
|
@ -28,6 +28,7 @@ block includes
|
|||
.l-main-section
|
||||
:marked
|
||||
## The Injector Tree
|
||||
|
||||
## 注入器树
|
||||
|
||||
In the [Dependency Injection](./dependency-injection.html) chapter
|
||||
|
@ -38,7 +39,7 @@ block includes
|
|||
We oversimplified. In fact, there is no such thing as ***the*** injector!
|
||||
An application may have multiple injectors!
|
||||
|
||||
我们其实有点简化过度了。实际上,没有***那个(唯一的)***注入器这回事,因为一个应用中可能有很多注入器。
|
||||
我们其实有点简化过度了。实际上,没有***那个(唯一的)***注入器这回事,一个应用中可能有多个注入器。
|
||||
|
||||
An Angular application is a tree of components. Each component instance has its own injector!
|
||||
The tree of components parallels the tree of injectors.
|
||||
|
@ -54,12 +55,13 @@ block includes
|
|||
masses of injectors for no good purpose.
|
||||
|
||||
Angular 并没有像*字面上理解的*那样为每个组件都创建一个独立的注入器。
|
||||
不是每个组件都需要它自己的注入器,盲目创建大量没有明确用途的注入器是非常低效的。
|
||||
不是每个组件都需要它自己的注入器,创建大量没有明确用途的注入器是非常低效的。
|
||||
|
||||
But it is true that every component ***has an injector*** (even if it shares that injector with another component)
|
||||
and there may be many different injector instances operating at different levels of the component tree.
|
||||
|
||||
但是,每个组件都**有一个注入器**是真实的(就算它与其它组件共享注入器,也是*有注入器*),并且确实可能会有大量不同的注入器实例工作在组件树的不同级别。
|
||||
但是,每个组件都**有一个注入器**是真实的(就算它与其它组件共享注入器,也是*有注入器*),
|
||||
并且确实可能会有大量不同的注入器实例工作在组件树的不同级别。
|
||||
|
||||
It is useful to pretend that every component has its own injector.
|
||||
|
||||
|
@ -71,7 +73,7 @@ block includes
|
|||
The new twist is that the `HeroesListComponent` may hold and manage multiple instances of the `HeroesCardComponent`.
|
||||
|
||||
考虑《英雄指南》应用的一个简单变种,它由三个不同的组件构成:`HeroesApp`、`HeroesListComponent`和`HeroesCardComponent`。
|
||||
`HeroesApp`保存了`HeroesListComponent`的一个单例。
|
||||
`HeroesApp`保存了`HeroesListComponent`的一个实例。
|
||||
新的变化是,`HeroesListComponent`可以保存和管理`HeroesCardComponent`的多个实例。
|
||||
|
||||
The following diagram represents the state of the component tree when there are three instances of `HeroesCardComponent`
|
||||
|
@ -118,7 +120,8 @@ figure.image-display
|
|||
If we don't reconfigure, the tree of injectors appears to be flat. All requests bubble up to the root
|
||||
<span if-docs="ts">NgModule</span> injector that we configured with the `!{_bootstrapModule}` method.
|
||||
|
||||
如果我们完全没有进行过重新配置,注入器的树看起来将是“平面”的。所有的申请都会被冒泡到根<span if-docs="ts">NgModule</span>注入器进行处理,也就是我们在`!{_bootstrapModule}`方法中配置的那个。
|
||||
如果我们完全没有进行过重新配置,注入器的树看起来将是“平面”的。所有的申请都会被冒泡到根 <span if-docs="ts">NgModule</span>
|
||||
注入器进行处理,也就是我们在`!{_bootstrapModule}`方法中配置的那个。
|
||||
|
||||
The ability to configure one or more providers at different levels opens up interesting and useful possibilities.
|
||||
|
||||
|
@ -130,8 +133,8 @@ figure.image-display
|
|||
This child is the parent of another component (C) that defines its own provider for `Car`.
|
||||
|
||||
让我们回到“汽车 (Car) ”类的例子。
|
||||
假设“根注入器”(记为A)配置过`Car`、`Engine`和`Tires`的提供商。
|
||||
然后创建了一个子组件(B),它为`Car`和`Engine`类定义了自己的提供商。
|
||||
假设“根注入器”(记为 A)配置过`Car`、`Engine`和`Tires`的提供商。
|
||||
然后创建了一个子组件(B),它为`Car`和`Engine`定义了自己的提供商。
|
||||
这个子组件 (B) 又有另一个子组件 (C),(C) 也为`Car`定义了自己的提供商。
|
||||
|
||||
Behind the scenes each component sets up its own injector with one or more providers defined for that component itself.
|
||||
|
@ -143,7 +146,7 @@ figure.image-display
|
|||
`Tires` resolved by the root injector (A).
|
||||
|
||||
当我们在最底层的组件 (C) 中试图解析出一个`Car`的实例时,注入器 (C) 解析出的`Car`类的实例,
|
||||
该`Car`的实例带有一个`Engine`类的实例(由注入器(B)解析出)和一个`Tires`类的实例(由跟注入器(A)解析出)。
|
||||
该`Car`的实例带有一个`Engine`类的实例(由注入器 (B) 解析出)和一个`Tires`类的实例(由跟注入器 (A) 解析出)。
|
||||
|
||||
figure.image-display
|
||||
img(src="/resources/images/devguide/dependency-injection/injector-tree.png" alt="injector tree" width="600")
|
||||
|
@ -151,6 +154,7 @@ figure.image-display
|
|||
.l-main-section
|
||||
:marked
|
||||
## Component Injectors
|
||||
|
||||
## 组件注入器
|
||||
|
||||
In the previous section, we talked about injectors and how they are organized like a tree. Lookups follow the injector tree upwards until they find the requested thing to inject. But when do we actually want to provide providers on the root injector and when do we want to provide them on a child injector?
|
||||
|
@ -229,7 +233,7 @@ figure.image-display
|
|||
|
||||
Our `HeroEditComponent` uses this services under the hood for its `hero` property. It intercepts the `get` and `set` method to delegate the actual work to our `RestoreService` which in turn makes sure that we won’t work on the original item but on a copy instead.
|
||||
|
||||
我们的`HeroEditComponent`组件悄悄把这个服务用在它的`hero`属性上。它拦截了`get`和`set`方法,并把真正的工作委托给我们的`RestoreService`服务,这样可以确保我们并不是在操作原始条目,而是一个副本。
|
||||
我们的`HeroEditComponent`组件在幕后把这个服务用在它的`hero`属性上。它拦截了`get`和`set`方法,并把真正的工作委托给我们的`RestoreService`服务,这样可以确保我们并不是在操作原始条目,而是一个副本。
|
||||
|
||||
At this point we may be scratching our heads asking what this has to do with component injectors?
|
||||
Look closely at the metadata for our `HeroEditComponent`. Notice the `providers` property.
|
||||
|
@ -281,7 +285,7 @@ figure.image-display
|
|||
scoped to that component instance and its child components.
|
||||
|
||||
但很明显,这个场景下我们不希望这样。我们希望每个组件都有它自己的`RestoreService`实例。
|
||||
在组件级别上定义(或重定义)一个提供商,将会为该组件创建一个新的服务实例。
|
||||
在组件级别上定义(或重定义)一个提供商,将会为该组件创建一个新的服务实例。
|
||||
我们已经为`HeroEditComponent`制造了一种“私有”`RestoreService`单例,它的作用域被局限在了该组件的实例及其子组件中。
|
||||
|
||||
//- ## Advanced Dependency Injection in Angular
|
||||
|
|
Loading…
Reference in New Issue