include ../_util-fns
:marked
Angular 2 is a framework to help us build client applications in HTML and JavaScript.
Angular 2是一个用HTML和JavaScript构建客户端应用的框架。
The framework consists of several cooperating libraries, some of them core and some optional.
该框架包括一系列紧密合作的库,有些是核心库,有些是可选库。
We write applications by composing HTML *templates* with Angularized-markup,
writing *component* classes to manage those templates, adding application logic in *services*,
and handing the top root component to Angular's *bootstrapper*.
我们这样写应用程序:用带Angular扩展语法的HTML写*模板*,用*组件*类管理这些模板,用*服务*添加应用逻辑,用根组件完成Angular*启动*。
Angular takes over, presenting our application content in a browser and responding to user interactions
according to the instructions we provided.
Angular在浏览器中接管、展现应用的内容,并根据我们提供的操作指令响应用户的交互。
:marked
Of course there is more to it than this. We'll learn the details when we dive into the guide chapters.
Let's get the big picture first.
当然,这只是冰山一角。随着内容的深入,我们还会学到更多的细节。
我们先来看看宏观图景。
figure
img(src="/resources/images/devguide/architecture/overview2.png" alt="overview" style="margin-left:-40px;" width="700")
:marked
The architecture diagram identifies the eight main building blocks of an Angular 2 application:
这个架构图展现了Angular应用中的8个主要构造块:
1. [Module](#module)
1. [模块(Module)](#module)
1. [Component](#component)
1. [组件(Component)](#component)
1. [Template](#template)
1. [模板(Template)](#template)
1. [Metadata](#metadata)
1. [元数据(Metadata)](#metadata)
1. [Data Binding](#data-binding)
1. [数据绑定(Data Binding)](#data-binding)
1. [Directive](#directive)
1. [指令(Directive)](#directive)
1. [Service](#service)
1. [服务(Service)](#service)
1. [Dependency Injection](#dependency-injection)
1. [依赖注入(Dependency Injection)](#dependency-injection)
Learn these eight and we're on our way.
掌握这8点,我们就可以开始使用Angular 2编写应用程序了。
.l-sub-section
:marked
The code referenced in this chapter is available as a [live example](/resources/live-examples/architecture/ts/plnkr.html).
本章所引用的代码可以从这个[在线例子](/resources/live-examples/architecture/ts/plnkr.html)中找到。
.l-main-section
:marked
## The Module
## 模块
figure
img(src="/resources/images/devguide/architecture/module.png" alt="模块" align="left" style="width:240px; margin-left:-40px;margin-right:10px" )
:marked
Angular apps are modular.
Angular应用是模块化的。
In general we assemble our application from many **modules**.
我们的程序通常都是由很多*模块*组装而成的。
A typical module is a cohesive block of code dedicated to a single purpose.
A module **exports** something of value in that code, typically one thing such as a class.
典型的模块是一个内聚的代码块,用以实现单一的目的。
在这些代码中,模块会*导出*一些东西,最典型的就是类。
.l-sub-section
:marked
### Modules are optional
### 模块是可选的
We highly recommend modular design. TypeScript has great support for ES2015 module syntax and our chapters assume we're taking a modular
approach using that syntax. That's why we list *Module* among the basic building blocks.
我们强烈推荐使用模块化设计。TypeScript对ES2015的模块语法支持很好,我们的文档假设我们利用这些语法来应用模块化方案。这就是为什么我们要把*模块*列为基本构造块之一。
Angular itself doesn't require a modular approach nor this particular syntax. Don't use it if you don't want it.
Each chapter has plenty to offer after you steer clear of the `import` and `export` statements.
Angular本身并不需要模块化方案,也不需要使用这种特定的语法。如果你不喜欢,可以不用它。
就算你避开`import`和`export`语句,每章也会为你提供很多(知识)。
Find setup and organization clues in the JavaScript track (select it from the combo-box at the top of this page)
which demonstrates Angular 2 development with plain old JavaScript and no module system.
在JavaScript(你可以从页面顶部的组合框选择JavaScript)分支下,可以找到如何安装和组织的线索。
它示范了如何用老版本的JavaScript语言,在没有模块化系统支持的情况下进行Angular 2应用程序的开发。
:marked
Perhaps the first module we meet is a module that exports a *component* class.
The component is one of the basic Angular blocks, we write a lot of them,
and we'll talk about components in the next segment. For the moment it is enough to know that a
component class is the kind of thing we'd export from a module.
我们遇到的第一个模块,很可能就是用于导出*组件*类的那个。
组件是Angular中的基本构造块之一,我们会编写很多组件。我们将会在下一段继续讨论组件。
目前,我们只要知道组件类是从模块中导出一种东西就行了。
Most applications have an `AppComponent`. By convention, we'll find it in a file named `app.component.ts`.
Look inside such a file and we'll see an `export` statement like this one.
大多数应用都有一个`AppComponent`。按照惯例,它位于一个名叫`app.component.ts`的文件中。
打开它,我们将会看到一个`export`语句,就像这样:
+makeExample('architecture/ts/app/app.component.ts', 'export', 'app/app.component.ts (节选)')(format=".")
:marked
The `export` statement tells TypeScript that this is a module whose
`AppComponent` class is public and accessible to other modules of the application.
`export`语句告诉TypeScript:这是一个模块,其中`AppComponent`类是公开的,可以被应用程序中的其它模块访问。
When we need a reference to the `AppComponent`, we **import** it like this:
当需要引用`AppComponent`时,我们要像这样**导入**它:
+makeExample('architecture/ts/app/main.ts', 'import', 'app/main.ts (节选)')(format=".")
:marked
The `import` statement tells the system it can get an `AppComponent` from a module named `app.component`
located in a neighboring file.
The **module name** (AKA module id) is often the same as the filename without its extension.
`import`语句告诉系统,它能从附近名叫`app.component`的文件中获得`AppComponent`组件。
**模块名**(又叫模块ID)通常和去掉扩展名后的文件名相同。
### Library Modules
### 模块库
figure
img(src="/resources/images/devguide/architecture/library-module.png" alt="组件" align="left" style="width:240px; margin-left:-40px;margin-right:10px" )
:marked
Some modules are libraries of other modules.
有些模块是其它模块的库。
Angular itself ships as a collection of library modules within several npm packages.
Their names begin with the `@angular` prefix.
Each Angular library contains a [barrel](../glossary.html#barrel) module
that is actually a public façade over several logically-related private modules.
Angular本身就是通过npm包发布的一组模块库,它们都以`@angular`为前缀。
每个Angular库中都包含一个[封装桶](../glossary.html#barrel)模块。
它实际上是一个公开的外观层(façade),囊括了一些逻辑相关的私有模块。
The `@angular/core` library is the primary Angular library module from which we get most of what we need.
`@angular/core`库是主要的Angular模块库,从这里我们能获得大部分需要的东西。
There are other important Angular library modules too such as `@angular/common`, `@angular/router`, and `@angular/http`.
还有另一些重要的Angular模块库,比如`@angular/common`、`@angular/router` 和 `@angular/http`。
We import what we need from an Angular library module in much the same way.
For example, we import the Angular **`Component` *function*** from the *@angular/core* module like this:
我们从Angular模块库中导入所需内容的方式都差不多。
比如,我们从*@angular2/core*中导入Angular **`Component`*函数***的代码是这样的:
+makeExample('architecture/ts/app/app.component.ts', 'import')(format=".")
:marked
Compare that syntax to our previous import of `AppComponent`.
比较一下它和前面导入`AppComponent`时的语法。
+makeExample('architecture/ts/app/main.ts', 'import')(format=".")
:marked
Notice the difference?
In the first case, when importing from an Angular library module,
the import statement refers to the bare module name, `@angular/core`, *without a path prefix*.
注意到不同之处了吗?
第一种,从Angular模块库中导入时,import语句引用的是“裸”模块名 —— `@angular/core` —— *不带路径前缀*。
When we import from one of *our* own files, we prefix the module name with the file path.
In this example we specify a relative file path (./). That means the
source module is in the same folder (./) as the module importing it.
We could path up and around the application folder structure if the source module were somewhere else.
当我们从*自己的*文件中导入时,模块名中带有路径前缀。
在这个例子中,前缀是一个相对路径(./)。这表示源模块和想导入它的模块位于同一个目录中(./)。
如果源模块位于其它位置,我们还可以向上引用应用目录结构中的任意路径(如`../../../somewhere/`)。
.l-sub-section
:marked
We import and export in the ECMAScript 2015 (ES2015) module syntax.
Learn more about that syntax [here](http://www.2ality.com/2014/09/es6-modules-final.html)
and many other places on the web.
我们导入和导出使用的是ECMAScript 2015 (ES2015)的语法。
要学习关于此语法的更多知识,参见[这里](http://www.2ality.com/2014/09/es6-modules-final.html),在网上很多别的地方也能找到相关资料。
The infrastructure *behind* module loading and importing is an important subject.
But it's a subject outside the scope of this introduction to Angular.
While we're focused on our application, *import* and *export*
is about all we need to know.
“模块加载与导入”背后的基础设施是一个很重要的话题,但它不在Angular简介的范围内。
目前的焦点是我们的应用程序,我们只需要知道*import*和*export*就够了。
:marked
The key take-aways are:
这里的关键点是:
* Angular apps are composed of modules.
* Angular应用是由模块组成的。
* Modules export things — classes, function, values — that other modules import.
* 模块导出一些东西 —— 类,函数,值,供其它模块导入。
* We prefer to write our application as a collection of modules, each module exporting one thing.
* 首选的写法是把应用写成一组模块,每个模块只导出一样东西。
The first module we write will most likely export a component.
我们写的第一个模块将会导出一个组件。
.l-main-section
:marked
## The Component
## 组件
figure
img(src="/resources/images/devguide/architecture/hero-component.png" alt="组件" align="left" style="width:200px; margin-left:-40px;margin-right:10px" )
:marked
A **Component** controls a patch of screen real estate that we could call a *view*.
The shell at the application root with navigation links, that list of heroes, the hero editor ...
they're all views controlled by Components.
**组件**控制屏幕中巴掌大的那么一小块地方,这块地方我们称之为*视图*。
应用的“外壳”包括一些导航链接、英雄列表、英雄编辑器…… 它们都是由组件控制的视图。
We define a Component's application logic - what it does to support the view - inside a class.
The class interacts with the view through an API of properties and methods.
我们在类中定义组件的应用逻辑(它被用来为视图提供支持)。
组件通过一些由属性和方法组成的API与视图交互。
A `HeroListComponent`, for example, might have a `heroes` property that returns an array of heroes
that it acquired from a service.
It might have a `selectHero()` method that sets a `selectedHero` property when the user clicks on a hero from that list.
It might be a class like this:
比如,在`HeroListComponent`组件中,可能有一个`heroes`属性,它返回一个英雄的数组,而这些数据是从服务中取得的。
它可能还有一个`selectHero()`方法,当用户从列表中点击一个英雄时,用它来设置`selectedHero`属性。
它可能是像这样的一个类:
+makeExample('architecture/ts/app/hero-list.component.ts', 'class', 'app/hero-list.component.ts')
:marked
Angular creates, updates, and destroys components as the user moves through the application.
The developer can take action at each moment in this lifecycle through optional [Lifecycle Hooks](lifecycle-hooks.html).
当用户在这个应用中“移动”时,Angular会创建、更新和销毁组件。
开发人员可以通过[生命周期钩子](lifecycle-hooks.html)在组件生命周期的各个时间点上插入自己的操作。
.l-sub-section
:marked
We're not showing those hooks in this example
but we are making a mental note to find out about them later.
我们不会在这个例子中展示这些钩子,先在脑子中留个记号,将来再翻出来讲。
We may wonder who is calling that constructor? Who provides the service parameter?
For the moment, have faith that Angular will call the constructor and deliver an
appropriate `HeroService` when we need it.
你可能会好奇,谁来调用那个构造函数?谁为服务提供参数?
目前,你只要信任Angular会在合适的时机调用构造函数,并在我们需要的时候给出一个合适的`HeroService`实例。
.l-main-section
:marked
## The Template
## 模板
figure
img(src="/resources/images/devguide/architecture/template.png" alt="模板" align="left" style="width:200px; margin-left:-40px;margin-right:10px" )
:marked
We define a Component's view with its companion **template**. A template is a form of HTML
that tells Angular how to render the Component.
我们通过组件的自带的**模板**来定义视图。模板以HTML形式存在,用来告诉Angular如何渲染组件(视图)。
A template looks like regular HTML much of the time ... and then it gets a bit strange. Here is a
template for our `HeroList` component.
多数情况下,模板看起来很像标准HTML……当然也有一小点儿奇怪的地方。下面是`HeroList`组件的一个模板。
+makeExample('architecture/ts/app/hero-list.component.html',null,'app/hero-list.component.html')
:marked
We recognize `
Metadata tells Angular how to process a class.
元数据告诉Angular如何处理一个类。