From 68631c58f5b32cb99b60a0400a0dedbb92ee1e3e Mon Sep 17 00:00:00 2001 From: Zhicheng Wang Date: Mon, 16 May 2016 18:57:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E7=A1=80=E7=9F=A5=E8=AF=86-=E8=A1=A8?= =?UTF-8?q?=E5=8D=95=20=E4=B8=80=E5=AE=A1=E5=AE=8C=E6=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/docs/ts/latest/guide/forms.jade | 300 +++++++++++++------------ 1 file changed, 162 insertions(+), 138 deletions(-) diff --git a/public/docs/ts/latest/guide/forms.jade b/public/docs/ts/latest/guide/forms.jade index 600fde62c9..af05c5bbfa 100644 --- a/public/docs/ts/latest/guide/forms.jade +++ b/public/docs/ts/latest/guide/forms.jade @@ -5,25 +5,26 @@ include ../_util-fns schedule a meeting and perform countless other data entry tasks. Forms are the mainstay of business applications. - 我们全都使用表单来执行登录、求助、下单、预订机票、发起会议,以及不计其数的其它数据录入任务。 + 我们全都用过表单来执行登录、求助、下单、预订机票、发起会议,以及不计其数的其它数据录入任务。 + 表单是商业应用的主体。 Any seasoned web developer can slap together an HTML form with all the right tags. It's more challenging to create a cohesive data entry experience that guides the user efficiently and effectively through the workflow behind the form. 不管什么样的Web开发者,都能使用正确的标签“捏”出一个HTML。 - 但要想做出一个能整合数据输入体验的表单,以指导用户明晰、高效的走通表单背后的工作流,就是一个挑战了。 + 但要想做出一个优秀的表单,让它具有贴心的数据输入体验,以指导用户明晰、高效的走通表单背后的工作流,这个挑战就大多了。 *That* takes design skills that are, to be frank, well out of scope for this chapter. - *这当中* 所需要的设计技能,坦白讲,确实超出了本章的范围。 + *这当中*所需要的设计技能,坦白讲,确实超出了本章的范围。 It also takes framework support for **two-way data binding, change tracking, validation, and error handling** ... which we shall cover in this chapter on Angular forms. - 它也需要框架支持,来实现 **双向数据绑定、变更跟踪、有效性验证和错误处理** - 这些Angular表单相关的内容,是本章将会覆盖的。 + 但它也需要框架支持,来实现**双向数据绑定、变更跟踪、有效性验证和错误处理**…… + 这些Angular表单相关的内容,属于本章的范围。 We will build a simple form from scratch, one step at a time. Along the way we'll learn @@ -36,16 +37,16 @@ include ../_util-fns - 使用`[(ngModel)]`语法实现双向数据绑定,以便从输入控件中读取和写入值 - using `ngControl` to track the change state and validity of form controls - - 使用`ngControl`来跟踪变更状态以及对表单控件做验证 + - 使用`ngControl`来跟踪变更状态并对表单控件做验证 - the special CSS classes that `ngControl` adds to form controls and how we can use them to provide strong visual feedback - - 那些`ngControl`往表单控件上添加的特殊的CSS类,以及我们该如何使用它们来提供强烈的视觉反馈 + - `ngControl`添加到表单控件上的那些特殊的CSS类,以及我们该如何使用它们来提供强烈的视觉反馈 - displaying validation errors to users and enable/disable form controls - - 给用户显示有效性验证的错误信息,以及禁用/使能表单控件 + - 向用户显示有效性验证的错误提示,以及禁用/使能表单控件 - sharing information among controls with template reference variables - - 在控件和模板引用变量之间共享信息 + - 通过模板引用变量,在控件之间共享信息 [Live Example](/resources/live-examples/forms/ts/plnkr.html) @@ -58,7 +59,7 @@ include ../_util-fns Many of us will build forms by writing templates in the Angular [template syntax](./template-syntax.html) with the form-specific directives and techniques described in this chapter. - 大多数人都可以使用表单特有指令和本章所描述的技术,在模板中按照Angular[模板语法](./template-syntax.html)来构建表单。 + 大多数人都可以使用表单特有的指令和本章所描述的技术,在模板中按照Angular[模板语法](./template-syntax.html)来构建表单。 .l-sub-section :marked That's not the only way to create a form but it's the way we'll cover in this chapter. @@ -69,7 +70,7 @@ include ../_util-fns We can lay out the controls creatively, bind them to data, specify validation rules and display validation errors, conditionally enable or disable specific controls, trigger built-in visual feedback, and much more. - 我们可以构建需要在Angular模板中使用的几乎所有的表单 —— 登录表单、联系人表单 …… 大量的各种商务表单。 + 我们可以构建要用在Angular模板中的几乎所有表单 —— 登录表单、联系人表单…… 大量的各种商务表单。 我们可以创造性的摆放各种控件、把它们绑定到数据、指定校验规则、显示校验错误、有条件的禁用/使能特定的控件、触发内置的视觉反馈等等,不胜枚举。 It will be pretty easy because Angular handles many of the repetitive, boiler plate tasks we'd @@ -88,7 +89,7 @@ figure.image-display Here at the *Hero Employment Agency* we use this form to maintain personal information about the heroes in our stable. Every hero needs a job. It's our company mission to match the right hero with the right crisis! - 这里是 *英雄职业介绍所* ,我们使用这个表单来维护我们候选英雄们的个人信息。每个英雄都需要一个工作。我们公司的任务就是让正确的英雄去解决他/她所擅长的危机! + 这里是*英雄职介中心*,我们使用这个表单来维护我们候选英雄们的个人信息。每个英雄都需要一份工作。我们公司的任务就是让正确的英雄去解决他/她所擅长的危机! Two of the three fields on this form are required. Required fields have a green bar on the left to make them easy to spot. @@ -125,13 +126,13 @@ figure.image-display 1. Bind data properties to each form input control with the `ngModel` two-way data binding syntax 1. 使用`ngModel`双向数据绑定语法把数据属性绑定到每个表单输入控件 1. Add the **ngControl** directive to each form input control - 1. 往每个表单输入控件上添加 **ngControl** 指令 + 1. 往每个表单输入控件上添加**ngControl**指令 1. Add custom CSS to provide visual feedback 1. 添加自定义CSS来显示视觉反馈 1. Show and hide validation error messages 1. 显示和隐藏有效性验证的错误信息 1. Handle form submission with **ngSubmit** - 1. 使用 **ngSubmit** 处理表单提交 + 1. 使用**ngSubmit**处理表单提交 1. Disable the form’s submit button until the form is valid 1. 禁用此表单的提交按钮,直到表单变为有效的 @@ -150,15 +151,15 @@ include ../_quickstart_repo As users enter form data, we capture their changes and update an instance of a model. We can't layout the form until we know what the model looks like. - 当用户输入表单数据时,我们捕获他们的更改,并且更新到模型的一个实例中。 - 除非我们知道了模型里有什么,否则没办法开始设计表单。 + 当用户输入表单数据时,我们要捕获他们的更改,并更新到模型的一个实例中。 + 除非我们知道模型里有什么,否则没法设计表单。 A model can be as simple as a "property bag" that holds facts about a thing of application importance. That describes well our `Hero` class with its three required fields (`id`, `name`, `power`) and one optional field (`alterEgo`). - 最简单的模型就是一个“属性包儿”,用来存放关于应用中一个重要事物的那些事实。 - 这里我们使用三个必备字段(`id`、`name`、`power`),和一个可选字段(`alterEgo`,中文含义:第二人格)。 + 最简单的模型就是一个“属性包”,用来存放关于应用中一件重要事物的某些事实。 + 这里我们使用三个必备字段(`id`、`name`、`power`),和一个可选字段(`alterEgo`,译注:中文含义:第二人格,比如X战警中的Jean/黑凤凰)。 Create a new file in the app folder called `hero.ts` and give it the following class definition: @@ -169,16 +170,16 @@ include ../_quickstart_repo :marked It's an anemic model with few requirements and no behavior. Perfect for our demo. - 这是一个贫血模型,没几条规定也没什么行为。对我们的演示来说很完美。 + 这是一个贫血模型,没什么要求,也没有行为。对我们的演示来说很完美。 The TypeScript compiler generates a public field for each `public` constructor parameter and assigns the parameter’s value to that field automatically when we create new heroes. - TypeScript编译器为每个`public`的构造函数参数创建一个公有字段,并且在创建新的英雄实例时,会把参数值自动赋给这些公有字段。 + TypeScript编译器为构造函数中每个标为`public`的参数创建一个公有字段,并在创建新的英雄实例时,把参数值自动赋给这些公有字段。 The `alterEgo` is optional and the constructor lets us omit it; note the (?) in `alterEgo?`. - `alterEgo`是可选的,并且构造函数让我们可以省略掉它,注意`alterEgo?`中的问号(?)。 + `alterEgo`是可选的,构造函数让我们可以省略掉它,注意`alterEgo?`中的问号(?)。 We can create a new hero like this: @@ -215,13 +216,13 @@ code-example(format=""). Understanding this component requires only the Angular 2 concepts we’ve learned in previous chapters - 要理解这个组件,只需要我们在前面的章节中已经学过的那些概念: + 要理解这个组件,只会用到前面章节中已经学过的那些概念: 1. We import the `Component` decorator from the Angular library as we usually do. 1. 像往常一样,我们从Angular库中导入`Component`装饰器。 1. The `@Component` selector value of "hero-form" means we can drop this form in a parent template with a `` tag. - 1. `@Component`选择器的值`hero-form`表示我们将把此表单扔进父模板中的一个``标签中。 + 1. `@Component`选择器的值"hero-form"表示我们将把此表单扔进父模板中的一个``标签中。 1. The `templateUrl` property points to a separate file for template HTML called `hero-form.component.html`. 1. `templateUrl`属性指向一个独立的HTML模板文件,名叫`hero-form.component.html`。 @@ -231,18 +232,19 @@ code-example(format=""). or perhaps expose these properties as [inputs and outputs](./template-syntax.html#inputs-outputs) for binding to a parent component. None of this concerns us now and these future changes won't affect our form. 1. 我们为`model`和`powers`定义了供演示用的假数据。 - 接下来,我们可以注入一个用于获取和保存真实数据的服务,或者把这些属性暴露为[输入与输出属性](./template-syntax.html#inputs-outputs),以便绑定到父组件上。 - 注意,我们现在所关注的这些变化,即使将来真的发生了,也不会影响到我们的表单。 + 接下来,我们可以注入一个用于获取和保存真实数据的服务, + 或者把这些属性暴露为[输入与输出属性](./template-syntax.html#inputs-outputs),以绑定到父组件上。 + 我们现在所关注的这些变更点,即使将来真的发生了,也不会影响到我们的表单。 1. We threw in a `diagnostic` property at the end to return a JSON representation of our model. It'll help us see what we're doing during our development; we've left ourselves a cleanup note to discard it later. - 1. 我们在最后增加一个`diagnostic`属性,它返回我们这个模型的JSON形式。 - 它会帮我们看到在开发中所做的那些事,以后会在清理时丢弃它。 + 1. 我们在最后增加一个`diagnostic`属性,它返回这个模型的JSON形式。 + 它会帮我们看清开发过程中发生的事,等最后做清理时我们会丢弃它。 Why don't we write the template inline in the component file as we often do elsewhere in the Developer Guide? - 这次我们为什么不像开发人员指南中的其它地方那样写成组件的行内模板呢? + 这次我们为什么不像开发人员指南中的其它地方那样写成组件的内联模板呢? There is no “right” answer for all occasions. We like inline templates when they are short. Most form templates won't be short. TypeScript and JavaScript files generally aren't the best place to @@ -264,7 +266,7 @@ code-example(format=""). .l-main-section :marked ## Revise the *app.component.ts* - ## 修改 *app.component.ts* 文件 + ## 修改*app.component.ts*文件 `app.component.ts` is the application's root component. It will host our new `HeroFormComponent`. @@ -286,7 +288,7 @@ code-example(format=""). 1. 导入了新的`HeroFormComponent`组件。 1. The `template` is simply the new element tag identified by the component's `selector` property. - 1. `template`只是简单地换成了`HeroFormComponent`的`selector`属性中指定的新元素标签。 + 1. 直接把`template`的内容改成`HeroFormComponent`的`selector`属性中指定的新元素标签。 1. The `directives` array tells Angular that our template depends upon the `HeroFormComponent` which is itself a Directive (as are all Components). @@ -312,15 +314,15 @@ code-example(format=""). The *Name* `` control has the HTML5 `required` attribute; the *Alter Ego* `` control does not because `alterEgo` is optional. - *姓名Name* ``控件具有HTML5的`required`属性;但 *Alter Ego* ``控件没有,因为`alterEgo`字段是可选的。 + *Name*``控件具有HTML5的`required`属性;但 *Alter Ego* ``控件没有,因为`alterEgo`字段是可选的。 We've got a *Submit* button at the bottom with some classes on it. - 我们在底部有一个 *Submit* 按钮,它有一些CSS类。 + 我们在底部有一个*Submit*按钮,它有一些CSS类。 **We are not using Angular yet**. There are no bindings. No extra directives. Just layout. - **我们还没有用到Angular** 。没有绑定。没有额外的指令。只做了个布局。 + **我们还没有用到Angular**。没有绑定。没有额外的指令。只做了个布局。 The `container`,`form-group`, `form-control`, and `btn` classes come from [Twitter Bootstrap](http://getbootstrap.com/css/). Purely cosmetic. @@ -329,7 +331,7 @@ code-example(format=""). `container`、`form-group`、`form-control`和`btn`类来自[Twitter Bootstrap](http://getbootstrap.com/css/)。纯粹是装饰。 我们使用Bootstrap来打扮我们的表单。 - 嘿,没有一点儿小个性的表单算个啥! + 嘿,一点儿样式儿都没有的表单算个啥! .callout.is-important header Angular Forms Do Not Require A Style Library @@ -339,7 +341,7 @@ code-example(format=""). the styles of any external library. Angular apps can use any CSS library ... or none at all. - Angular不需要`container`、`form-group`、`form-control`和`btn`类,或者来自任何第三方库的任何样式,Angular应用可以使用任何CSS库 …… 或者啥也不用。 + Angular不需要`container`、`form-group`、`form-control`和`btn`类,或者来自任何第三方库的任何样式,Angular应用可以使用任何CSS库 …… 或者啥都不用。 :marked Let's add the stylesheet. @@ -358,23 +360,23 @@ ol .l-main-section :marked ## Add Powers with ***ngFor** - ## 用 ***ngFor*** 添加超能力 + ## 用***ngFor***添加超能力 Our hero may choose one super power from a fixed list of Agency-approved powers. We maintain that list internally (in `HeroFormComponent`). - 我们的英雄可以从经过职业介绍所认证过的固定列表中选择一项超能力。 + 我们的英雄可以从由职介中心认证过的固定列表中选择一项超能力。 我们先在`HeroFormComponent`中内部维护这个列表。 We'll add a `select` to our form and bind the options to the `powers` list using `ngFor`, a technique we might have seen before in the [Displaying Data](./displaying-data.html) chapter. - 我们将添加一个`select`到表单中,并且通过`ngFor`把`powers`列表绑定到候选项(options)。 + 我们将添加一个`select`到表单中,并且用`ngFor`把`powers`列表绑定到`option`中。 前面我们应该在[显示数据](./displaying-data.html)一章中见过`ngFor`。 Add the following HTML *immediately below* the *Alter Ego* group. - 在 *Alter Ego* 的紧下方添加如下的HTML: + 在*Alter Ego*的紧下方添加如下HTML: +makeExample('forms/ts/app/hero-form.component.html', 'powers', 'app/hero-form.component.html (节选)')(format=".") :marked @@ -382,17 +384,17 @@ ol The `p` template input variable is a different power in each iteration; we display its name using the interpolation syntax with the double-curly-braces. - 我们为列表中的每一项超能力重复渲染`