From 4084a725fd6f68b621b89565c683fdbdb5978315 Mon Sep 17 00:00:00 2001 From: Ward Bell Date: Fri, 11 Dec 2015 11:50:57 -0800 Subject: [PATCH] docs(forms): code shuffle, text, & alpha52 updates closes #478 --- .../{src/app/app.ts => app/app.component.ts} | 6 +- public/docs/_examples/forms/ts/app/boot.ts | 5 + .../ts/{src => }/app/hero-form.component.html | 68 ++--- .../ts/{src => }/app/hero-form.component.ts | 12 +- .../_examples/forms/ts/{src => }/app/hero.ts | 0 .../_examples/forms/ts/{src => }/index.html | 10 +- public/docs/_examples/forms/ts/package.json | 17 +- .../_examples/forms/ts/{src => }/plnkr.json | 0 .../docs/_examples/forms/ts/src/tsconfig.json | 11 - .../_examples/forms/ts/{src => }/styles.css | 0 public/docs/_examples/forms/ts/tsconfig.json | 16 ++ public/docs/_examples/package.json | 5 +- public/docs/ts/latest/guide/forms.jade | 242 +++++++++--------- .../images/devguide/forms/name-control-1.png | Bin 23510 -> 0 bytes .../images/devguide/forms/name-control-2.png | Bin 22818 -> 0 bytes 15 files changed, 195 insertions(+), 197 deletions(-) rename public/docs/_examples/forms/ts/{src/app/app.ts => app/app.component.ts} (63%) create mode 100644 public/docs/_examples/forms/ts/app/boot.ts rename public/docs/_examples/forms/ts/{src => }/app/hero-form.component.html (75%) rename public/docs/_examples/forms/ts/{src => }/app/hero-form.component.ts (76%) rename public/docs/_examples/forms/ts/{src => }/app/hero.ts (100%) rename public/docs/_examples/forms/ts/{src => }/index.html (56%) rename public/docs/_examples/forms/ts/{src => }/plnkr.json (100%) delete mode 100644 public/docs/_examples/forms/ts/src/tsconfig.json rename public/docs/_examples/forms/ts/{src => }/styles.css (100%) create mode 100644 public/docs/_examples/forms/ts/tsconfig.json delete mode 100644 public/resources/images/devguide/forms/name-control-1.png delete mode 100644 public/resources/images/devguide/forms/name-control-2.png diff --git a/public/docs/_examples/forms/ts/src/app/app.ts b/public/docs/_examples/forms/ts/app/app.component.ts similarity index 63% rename from public/docs/_examples/forms/ts/src/app/app.ts rename to public/docs/_examples/forms/ts/app/app.component.ts index a9c8970d3c..92f4ec5edd 100644 --- a/public/docs/_examples/forms/ts/src/app/app.ts +++ b/public/docs/_examples/forms/ts/app/app.component.ts @@ -1,5 +1,5 @@ // #docregion -import {bootstrap, Component} from 'angular2/angular2' +import {Component} from 'angular2/core'; import {HeroFormComponent} from './hero-form.component' @Component({ @@ -7,6 +7,4 @@ import {HeroFormComponent} from './hero-form.component' template: '', directives: [HeroFormComponent] }) -class AppComponent { } - -bootstrap(AppComponent); \ No newline at end of file +export class AppComponent { } diff --git a/public/docs/_examples/forms/ts/app/boot.ts b/public/docs/_examples/forms/ts/app/boot.ts new file mode 100644 index 0000000000..3fe89a9b15 --- /dev/null +++ b/public/docs/_examples/forms/ts/app/boot.ts @@ -0,0 +1,5 @@ +// #docregion +import {bootstrap} from 'angular2/platform/browser'; +import {AppComponent} from './app.component'; + +bootstrap(AppComponent); diff --git a/public/docs/_examples/forms/ts/src/app/hero-form.component.html b/public/docs/_examples/forms/ts/app/hero-form.component.html similarity index 75% rename from public/docs/_examples/forms/ts/src/app/hero-form.component.html rename to public/docs/_examples/forms/ts/app/hero-form.component.html index d34b5c4667..bcb6f7eee1 100644 --- a/public/docs/_examples/forms/ts/src/app/hero-form.component.html +++ b/public/docs/_examples/forms/ts/app/hero-form.component.html @@ -4,16 +4,16 @@

Hero Form

- -
+ + + -
+ [(ngModel)]="model.name" + ngControl="name" #name="ngForm" >
Name is required
@@ -23,16 +23,16 @@
+ [(ngModel)]="model.alterEgo" + ngControl="alterEgo" >
Power is required @@ -41,7 +41,7 @@ + [disabled]="!heroForm.form.valid">Submit
@@ -110,7 +110,7 @@
@@ -128,29 +128,29 @@

Hero Form

- + {{diagnostic}}
+ [(ngModel)]="model.name" >
+ [(ngModel)]="model.alterEgo">
- +
@@ -159,37 +159,37 @@
- + + [(ngModel)]="model.name" > TODO: remove this: {{model.name}} - +
- + + [ngModel]="model.name" + (ngModelChange)="model.name = $event" > TODO: remove this: {{model.name}} - +
- + - + [(ngModel)]="model.name" + ngControl="name" > +
- + + [(ngModel)]="model.name" + ngControl="name" #spy >
TODO: remove this: {{spy.className}} - +

- Name via form.controls = {{showFormControls(hf)}} + Name via form.controls = {{showFormControls(heroForm)}}
\ No newline at end of file diff --git a/public/docs/_examples/forms/ts/src/app/hero-form.component.ts b/public/docs/_examples/forms/ts/app/hero-form.component.ts similarity index 76% rename from public/docs/_examples/forms/ts/src/app/hero-form.component.ts rename to public/docs/_examples/forms/ts/app/hero-form.component.ts index bc82817571..e68d17124e 100644 --- a/public/docs/_examples/forms/ts/src/app/hero-form.component.ts +++ b/public/docs/_examples/forms/ts/app/hero-form.component.ts @@ -1,9 +1,9 @@ // #docplaster // #docregion // #docregion first, final -import {Component} from 'angular2/angular2'; - -import { Hero } from './hero'; +import {Component} from 'angular2/core'; +import {NgForm} from 'angular2/common'; +import { Hero } from './hero'; @Component({ selector: 'hero-form', @@ -32,10 +32,10 @@ export class HeroFormComponent { // Reveal in html: // AlterEgo via form.controls = {{showFormControls(hf)}} - showFormControls(form){ - return form.controls.alterEgo && + showFormControls(form:NgForm){ + return form.controls['alterEgo'] && // #docregion form-controls - form.controls.name.value; // Dr. IQ + form.controls['name'].value; // Dr. IQ // #enddocregion form-controls } ///////////////////////////// diff --git a/public/docs/_examples/forms/ts/src/app/hero.ts b/public/docs/_examples/forms/ts/app/hero.ts similarity index 100% rename from public/docs/_examples/forms/ts/src/app/hero.ts rename to public/docs/_examples/forms/ts/app/hero.ts diff --git a/public/docs/_examples/forms/ts/src/index.html b/public/docs/_examples/forms/ts/index.html similarity index 56% rename from public/docs/_examples/forms/ts/src/index.html rename to public/docs/_examples/forms/ts/index.html index 42fa6ee681..70ebfb1b68 100644 --- a/public/docs/_examples/forms/ts/src/index.html +++ b/public/docs/_examples/forms/ts/index.html @@ -5,19 +5,19 @@ Hero Form - + - + - - + + diff --git a/public/docs/_examples/forms/ts/package.json b/public/docs/_examples/forms/ts/package.json index 5bffa1904d..041d18e248 100644 --- a/public/docs/_examples/forms/ts/package.json +++ b/public/docs/_examples/forms/ts/package.json @@ -4,19 +4,12 @@ "description": "", "main": "index.js", "scripts": { - "tsc": "tsc -p src -w", - "start": "live-server --open=src" + "tsc": "tsc", + "tsc:w": "tsc -w", + "lite": "lite-server", + "both": "concurrent \"npm run tsc:w\" \"npm run lite\" " }, "keywords": [], "author": "", - "license": "ISC", - "dependencies": { - "angular2": "2.0.0-alpha.44", - "bootstrap": "^3.3.5", - "systemjs": "0.19.2" - }, - "devDependencies": { - "live-server": "^0.8.1", - "typescript": "^1.6.2" - } + "license": "ISC" } diff --git a/public/docs/_examples/forms/ts/src/plnkr.json b/public/docs/_examples/forms/ts/plnkr.json similarity index 100% rename from public/docs/_examples/forms/ts/src/plnkr.json rename to public/docs/_examples/forms/ts/plnkr.json diff --git a/public/docs/_examples/forms/ts/src/tsconfig.json b/public/docs/_examples/forms/ts/src/tsconfig.json deleted file mode 100644 index 6a58b35a58..0000000000 --- a/public/docs/_examples/forms/ts/src/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "target": "ES5", - "module": "commonjs", - "sourceMap": true, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "removeComments": false, - "noImplicitAny": false - } -} \ No newline at end of file diff --git a/public/docs/_examples/forms/ts/src/styles.css b/public/docs/_examples/forms/ts/styles.css similarity index 100% rename from public/docs/_examples/forms/ts/src/styles.css rename to public/docs/_examples/forms/ts/styles.css diff --git a/public/docs/_examples/forms/ts/tsconfig.json b/public/docs/_examples/forms/ts/tsconfig.json new file mode 100644 index 0000000000..6ffae9f106 --- /dev/null +++ b/public/docs/_examples/forms/ts/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ES5", + "module": "system", + "moduleResolution": "node", + "sourceMap": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "removeComments": false, + "noImplicitAny": true, + "suppressImplicitAnyIndexErrors": true + }, + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/public/docs/_examples/package.json b/public/docs/_examples/package.json index e72ff7b8c7..92a6a4b31d 100644 --- a/public/docs/_examples/package.json +++ b/public/docs/_examples/package.json @@ -15,13 +15,14 @@ "author": "", "license": "ISC", "dependencies": { - "angular2": "^2.0.0-alpha.51", + "angular2": "2.0.0-alpha.52", "systemjs": "0.19.6", "es6-promise": "^3.0.2", "es6-shim": "^0.33.3", "reflect-metadata": "0.1.2", "rxjs": "5.0.0-alpha.14", - "zone.js": "0.5.8" + "zone.js": "0.5.8", + "bootstrap": "^3.3.6" }, "devDependencies": { "concurrently": "^1.0.0", diff --git a/public/docs/ts/latest/guide/forms.jade b/public/docs/ts/latest/guide/forms.jade index e6c3135806..bd8038eb80 100644 --- a/public/docs/ts/latest/guide/forms.jade +++ b/public/docs/ts/latest/guide/forms.jade @@ -1,6 +1,5 @@ include ../../../../_includes/_util-fns - :marked We’ve all used a form to login, submit a help request, place an order, book a flight, schedule a meeting and perform countless other data entry tasks. @@ -20,17 +19,17 @@ include ../../../../_includes/_util-fns - How to build an Angular form with a component and template - - The `ng-model` two-way data binding syntax for reading and writing values to input controls + - The `ngModel` two-way data binding syntax for reading and writing values to input controls - - The `ng-control` directive to track the change state and validity of form controls + - The `ngControl` directive to track the change state and validity of form controls - - The special CSS classes that `ng-control` adds to form controls and how we can use them to provide strong visual feedback + - The special CSS classes that `ngControl` adds to form controls and how we can use them to provide strong visual feedback - How to display validation errors to users and enable/disable form controls - How to share information across controls with template local variables - [Live Example](/resources/live-examples/forms/ts/src/plnkr.html) + [Live Example](/resources/live-examples/forms/ts/plnkr.html) .l-main-section :marked ## Template-Driven Forms @@ -51,7 +50,7 @@ include ../../../../_includes/_util-fns We'll discuss and learn to build the following template-driven form: figure.image-display - img(src="/resources/images/devguide/forms/hf-1.png" width="400px" alt="Clean Form") + img(src="/resources/images/devguide/forms/heroForm-1.png" width="400px" alt="Clean Form") :marked Here at the *Hero Employment Agency* we use this form to maintain personal information about the @@ -62,7 +61,7 @@ figure.image-display If we delete the hero name, the form displays a validation error in an attention grabbing style: figure.image-display - img(src="/resources/images/devguide/forms/hf-2.png" width="400px" alt="Invalid, Name Required") + img(src="/resources/images/devguide/forms/heroForm-2.png" width="400px" alt="Invalid, Name Required") :marked Note that the submit button is disabled and the "required" bar to the left of the input control changed from green to red. @@ -76,11 +75,11 @@ figure.image-display 1. Create the `Hero` model class 1. Create the component that controls the form 1. Create a template with the initial form layout - 1. Add the **ng-model** directive to each form input control - 1. Add the **ng-control** directive to each form input control + 1. Add the **ngModel** directive to each form input control + 1. Add the **ngControl** directive to each form input control 1. Add custom CSS to provide visual feedback 1. Show and hide validation error messages - 1. Handle form submission with **ng-submit** + 1. Handle form submission with **ngSubmit** 1. Disable the form’s submit button until the form is valid :marked @@ -98,7 +97,7 @@ figure.image-display Create a new file in the app folder called `hero.ts` and give it the following class definition: -+makeExample('forms/ts/src/app/hero.ts', null, 'app/hero.ts') ++makeExample('forms/ts/app/hero.ts', null, 'app/hero.ts') :marked It's an anemic model with few requirements and no behavior. Perfect for our demo. @@ -109,10 +108,11 @@ figure.image-display The `alterEgo` is optional and the constructor lets us omit it; note the (?) in `alterEgo?`. We can create a new hero like this: - ``` - let myHero = new Hero(42, 'SkyDog', 'Fetch any object at any distance', 'Leslie Rollover'); +code-example(format=""). + let myHero = new Hero(42, 'SkyDog', + 'Fetch any object at any distance', 'Leslie Rollover'); console.log('My hero is called ' + myHero.name); // "My hero is called SkyDog" - ``` +:marked .l-main-section :marked @@ -124,7 +124,7 @@ figure.image-display Create a new file called `hero-form.component.ts` and give it the following definition: -+makeExample('forms/ts/src/app/hero-form.component.ts', 'first', 'app/hero-form.component.ts') ++makeExample('forms/ts/app/hero-form.component.ts', 'first', 'app/hero-form.component.ts') :marked There’s nothing special about this component, nothing form-specific, nothing to distinguish it from any component we've written before. @@ -155,16 +155,16 @@ figure.image-display We made a good choice to put the HTML template elsewhere. We'll write that template in a moment. Before we do, we'll take a step back - and revise the `app.ts` to make use of our new `HeroFormComponent`. + and revise the `app.component.ts` to make use of our new `HeroFormComponent`. .l-main-section :marked - ## Revise the *app.ts* + ## Revise the *app.component.ts* - `app.ts` is the application's root component. It will host our new `HeroFormComponent`. + `app.component.ts` is the application's root component. It will host our new `HeroFormComponent`. Replace the contents of the "QuickStart" version with the following: -+makeExample('forms/ts/src/app/app.ts', null, 'app/app.ts') ++makeExample('forms/ts/app/app.component.ts', null, 'app/app.component.ts') :marked .l-sub-section @@ -184,7 +184,7 @@ figure.image-display Create a new template file called `hero-form.component.html` and give it the following definition: -+makeExample('forms/ts/src/app/hero-form.component.html', 'start', 'app/hero-form.component.html') ++makeExample('forms/ts/app/hero-form.component.html', 'start', 'app/hero-form.component.html') :marked That is plain old HTML 5. We're presenting two of the `Hero` fields, `name` and `alterEgo`, and @@ -213,15 +213,15 @@ figure.image-display Let's add the stylesheet. ol - li Open a terminal window and enter the command: + li Open a terminal window in the application root folder and enter the command: code-example(language="html" escape="html"). npm install bootstrap --save li Open index.html and add the following link to the <head>. - +makeExample('forms/ts/src/index.html', 'bootstrap')(format=".") + +makeExample('forms/ts/index.html', 'bootstrap')(format=".") :marked .l-main-section :marked - ## Add Powers with ***ng-for** + ## Add Powers with ***ngFor** Our hero may choose one super power from a fixed list of Agency-approved powers. We maintain that list internally (in `HeroFormComponent`). @@ -230,7 +230,7 @@ ol a technique we might have seen before in the [Displaying Data](./displaying-data.html) chapter. Add the following HTML *immediately below* the *Alter Ego* group. -+makeExample('forms/ts/src/app/hero-form.component.html', 'powers', 'app/hero-form.component.html (excerpt)') ++makeExample('forms/ts/app/hero-form.component.html', 'powers', 'app/hero-form.component.html (excerpt)')(format=".") :marked We are repeating the `` tag for each power in the list of Powers. @@ -239,11 +239,11 @@ ol .l-main-section :marked - ## Two-way data binding with ***ng-model** + ## Two-way data binding with ***ngModel** Running the app right now would be disappointing. figure.image-display - img(src="/resources/images/devguide/forms/hf-3.png" width="400px" alt="Early form with no binding") + img(src="/resources/images/devguide/forms/heroForm-3.png" width="400px" alt="Early form with no binding") :marked We don't see hero data because we are not binding to the `Hero` yet. We know how to do that from earlier chapters. @@ -259,7 +259,7 @@ figure.image-display Find the `` tag for the "Name" and update it like this -+makeExample('forms/ts/src/app/hero-form.component.html', 'ng-model-1') ++makeExample('forms/ts/app/hero-form.component.html', 'ngModel-1','app/hero-form.component.html (excerpt)')(format=".") .l-sub-section :marked @@ -268,42 +268,42 @@ figure.image-display We left ourselves a note to throw it way when we're done. :marked - Focus on the binding syntax: `[(ng-model)]="..."`. + Focus on the binding syntax: `[(ngModel)]="..."`. If we ran the app right now and started typing in the *Name* input box, adding and deleting characters, we'd see them appearing and disappearing from the interpolated text. At some point it might look like this. figure.image-display - img(src="/resources/images/devguide/forms/ng-model-in-action.png" width="400px" alt="ng-model in action") + img(src="/resources/images/devguide/forms/ng-model-in-action.png" width="400px" alt="ngModel in action") :marked The diagnostic is evidence that we really are flowing values from the input box to the model and back again. **That's two-way data binding!** - Let's add similar `[(ng-model)]` bindings to *Alter Ego* and *Hero Power*. + Let's add similar `[(ngModel)]` bindings to *Alter Ego* and *Hero Power*. We'll ditch the input box binding message and add a new binding at the top to the component's `diagnostic` property. Then we can confirm that two-way data binding works *for the entire Hero model*. - After revision the core of our form should have three `[(ng-model)]` bindings that + After revision the core of our form should have three `[(ngModel)]` bindings that look much like this: -+makeExample('forms/ts/src/app/hero-form.component.html', 'ng-model-2', 'app/hero-form.component.html (excerpt)') ++makeExample('forms/ts/app/hero-form.component.html', 'ngModel-2', 'app/hero-form.component.html (excerpt)') :marked If we ran the app right now and changed every Hero model property, the form might display like this: figure.image-display - img(src="/resources/images/devguide/forms/ng-model-in-action-2.png" width="400px" alt="ng-model in super action") + img(src="/resources/images/devguide/forms/ng-model-in-action-2.png" width="400px" alt="ngModel in super action") :marked The diagnostic near the top of the form confirms that all of our changes are reflected in the model. - ** We're done with the diagnostic binding. Delete it now.** + **Delete** the `{{diagnostic}}` binding at the top as it has served its purpose. .l-sub-section :marked - ### Inside [(ng-model)] - *This section is an optional deep dive into [(ng-model)]. Not interested? Skip ahead!* + ### Inside [(ngModel)] + *This section is an optional deep dive into [(ngModel)]. Not interested? Skip ahead!* The punctuation in the binding syntax, [()], is a good clue to what's going on. @@ -320,23 +320,23 @@ figure.image-display In fact, we can break the `NgModel` binding into its two separate modes as we do in this re-write of the "Name" `` binding: - +makeExample('forms/ts/src/app/hero-form.component.html', 'ng-model-3') + +makeExample('forms/ts/app/hero-form.component.html', 'ngModel-3','app/hero-form.component.html (excerpt)')(format=".") :marked
The Property Binding should feel familiar. The Event Binding might seem strange. - The `ng-model-change` is not an `` element event. + The `ngModelChange` is not an `` element event. It is actually an event property of the `NgModel` directive. When Angular sees a binding target in the form [(abc)], it expects the `abc` directive to have an `abc` input property and an `abc-change` output property. The other oddity is the template expression, `model.name = $event`. We're used to seeing an `$event` object coming from a DOM event. - The `ng-model-change` property doesn't produce a DOM event; it's an Angular `EventEmitter` + The `ngModelChange` property doesn't produce a DOM event; it's an Angular `EventEmitter` property that returns the input box value when it fires — which is precisely what we should assign to the model's `name' property. - Nice to know but is it practical? We almost always prefer `[(ng-model)]`. + Nice to know but is it practical? We almost always prefer `[(ngModel)]`. We might split the binding if we had to do something special in the event handling such as debounce or throttle the key strokes. @@ -345,7 +345,7 @@ figure.image-display .l-main-section :marked - ## Track change-state and validity with **ng-control** + ## Track change-state and validity with **ngControl** A form isn't just about data binding. We'd also like to know the state of the controls on our form. The `NgControl` directive keeps track of control state for us. @@ -365,18 +365,18 @@ figure.image-display control and make messages appear or disappear. We'll explore those effects soon. Right now - we should **add `ng-control`to all three form controls**, + we should **add `ngControl`to all three form controls**, starting with the *Name* input box -+makeExample('forms/ts/src/app/hero-form.component.html', 'ng-control-1', 'app/hero-form.component.html (excerpt)') ++makeExample('forms/ts/app/hero-form.component.html', 'ngControl-1', 'app/hero-form.component.html (excerpt)')(format=".") :marked - Be sure to assign a unique name to each `ng-control` directive. + Be sure to assign a unique name to each `ngControl` directive. .l-sub-section :marked - Angular registers controls under their `ng-control` names + Angular registers controls under their `ngControl` names with the `NgForm`. We didn't add the `NgForm` directive explicitly but it's here - and we'll talk about it [later in this chapter](#ng-form). + and we'll talk about it [later in this chapter](#ngForm). .l-main-section :marked @@ -406,7 +406,7 @@ table Let's add a temporary [local template variable](./template-syntax.html#local-vars) named **spy** to the "Name" `` tag and use the spy to display those classes. -+makeExample('forms/ts/src/app/hero-form.component.html', 'ng-control-2') ++makeExample('forms/ts/app/hero-form.component.html', 'ngControl-2','app/hero-form.component.html (excerpt)')(format=".") :marked Now run the app and focus on the *Name* input box. @@ -438,12 +438,12 @@ figure.image-display We achieve this effect by adding two styles to a new `styles.css` file that we add to our project as a sibling to `index.html`. -+makeExample('forms/ts/src/styles.css',null,'styles.css') ++makeExample('forms/ts/styles.css',null,'styles.css')(format=".") :marked These styles select for the two Angular validity classes and the HTML 5 "required" attribute. We update the `` of the `index.html` to include this style sheet. -+makeExample('forms/ts/src/index.html', 'styles', 'index.html (excerpt)')(format=".") ++makeExample('forms/ts/index.html', 'styles', 'index.html (excerpt)')(format=".") :marked ## Show and Hide Validation Error messages @@ -464,39 +464,36 @@ figure.image-display Here's how we do it for the *name* input box: -var stylePattern = { otl: /(#name="form")|(.*div.*$)|(Name is required)/gm }; -+makeExample('forms/ts/src/app/hero-form.component.html', ++makeExample('forms/ts/app/hero-form.component.html', 'name-with-error-msg', 'app/hero-form.component.html (excerpt)', stylePattern) :marked - We initialized the template local variable with the word "form" (`#name="form"`) + When we added the `ngControl` directive, we bound it to the the model's `name` property. + + Here we initialize a template local variable (`name`) with the value "ngForm" (`#name="ngForm"`). + Angular recognizes that syntax and re-sets the `name` local template variable to the + `ngControl` directive instance. + In other words, the `name` local template variable becomes a handle on the `ngControl` object + for this input box. - Angular recognizes that syntax and sets the `name` variable - to the `Control` object identified by the `ng-control` directive which, - not coincidentally, we called "name". - - We bind the `Control` object's `valid` property to the element's `hidden` property. - While the control is valid, the message is hidden; - if it becomes invalid, the message is revealed. - + Now we can control visibility of the "name" error message by binding the message `
` element's `hidden` property + to the `ngControl` object's `valid` property. The message is hidden while the control is valid; + the message is revealed when the control becomes invalid. + .l-sub-section :marked ### The NgForm directive - Recall from the previous section that `ng-control` registered this input box with the - `NgForm` directive as "name". - - We didn't add the **[`NgForm`](../api/core/NgForm-class.html) directive** explicitly. + We just set a template local variable with the value of an `NgForm` directive. + Why did that work? We didn't add the **[`NgForm`](../api/core/NgForm-class.html) directive** explicitly. + Angular added it surreptiously, wrapping it around the `
` element The `NgForm` directive supplements the `form` element with additional features. - It collects `Controls` (elements identified by an `ng-control` directive) + It collects `Controls` (elements identified by an `ngControl` directive) and monitors their properties including their validity. - It has its own `valid` property which is true only if every contained + It also has its own `valid` property which is true only if every contained control is valid. - - In this example, we are pulling the "name" control out of its `controls` collection - and assigning it to the template local variable so that we can - access the control's properties — such as the control's own `valid` property. :marked The Hero *Alter Ego* is optional so we can leave that be. @@ -507,35 +504,32 @@ figure.image-display .l-main-section :marked - ## Submit the form with **ng-submit** + ## Submit the form with **ngSubmit** The user should be able to submit this form after filling it in. The Submit button at the bottom of the form does nothing on its own but it will trigger a form submit because of its type (`type="submit"`). - A "form submit" is meaningless at the moment. - To make it meaningful, we'll update the `` tag with another Angular directive, `NgSubmit`, - and bind it to our `HeroFormComponent.submit()` method with an EventBinding -+makeExample('forms/ts/src/app/hero-form.component.html', 'ng-submit')(format=".") + A "form submit" is useless at the moment. + To make it useful, we'll update the `` tag with another Angular directive, `NgSubmit`, + and bind it to the `HeroFormComponent.submit()` method with an event binding ++makeExample('forms/ts/app/hero-form.component.html', 'ngSubmit')(format=".") :marked We slipped in something extra there at the end! We defined a - template local variable, **`#hf`**, and initialized it with the value, "form". + template local variable, **`#heroForm`**, and initialized it with the value, "ngForm". - The variable `hf` is now a handle to the `NgForm` as we [discussed earlier](#ng-form) - with respect to `ng-control` although this time we have a reference to the form - rather than a control. + The variable `heroForm` is now a handle to the `NgForm` directive that we [discussed earlier](#ngForm) + This time `heroForm` remains a reference to the form as a whole. - We'll bind the Form's over-all validity via - the `hf` variable to the button's `disabled` property - using an Event Binding. Here's the code: -+makeExample('forms/ts/src/app/hero-form.component.html', 'submit-button') + Later in the template we bind the button's `disabled` property to the form's over-all validity via + the `heroForm` variable. Here's that bit of markup: ++makeExample('forms/ts/app/hero-form.component.html', 'submit-button') :marked - If we run the application now, we find that the button is enabled. - It doesn't do anything useful yet but it's alive. + Re-run the application. The form opens in a valid state and the button is enabled. - Now if we delete the *Name*, we violate the "required" rule which - is duely noted in our error message. The Submit button is also disabled. + Now delete the *Name*. We violate the "name required" rule which + is duely noted in our error message as before. And now the Submit button is also disabled. Not impressed? Think about it for a moment. What would we have to do to wire the button's enable/disabled state to the form's validity without Angular's help? @@ -563,14 +557,14 @@ figure.image-display Start by wrapping the form in a `
` and bind its `hidden` property to the `HeroFormComponent.submitted` property. -+makeExample('forms/ts/src/app/hero-form.component.html', 'edit-div', 'app/hero-form.component.html (excerpt)') ++makeExample('forms/ts/app/hero-form.component.html', 'edit-div', 'app/hero-form.component.html (excerpt)')(format=".") :marked The main form is visible from the start because the the `submitted` property is false until we submit the form, as this fragment from the `HeroFormComponent` reminds us: -+makeExample('forms/ts/src/app/hero-form.component.ts', 'submitted') ++makeExample('forms/ts/app/hero-form.component.ts', 'submitted')(format=".") :marked When we click the Submit button, the `submitted` flag becomes true and the form disappears @@ -578,7 +572,7 @@ figure.image-display Now we need to show something else while the form is in the submitted state. Add the following block of HTML below the `
` wrapper we just wrote: -+makeExample('forms/ts/src/app/hero-form.component.html', 'submitted', 'app/hero-form.component.html (excerpt)') ++makeExample('forms/ts/app/hero-form.component.html', 'submitted', 'app/hero-form.component.html (excerpt)') :marked There's our hero again, displayed read-only with interpolation bindings. @@ -599,43 +593,45 @@ figure.image-display - An Angular HTML form template. - A form component class with a `Component` decorator. - - The `ng-submit` directive for handling the form submission. - - Template local variables such as `#hf`, `#name`, `#alter-ego` and `#power`. - - The `ng-model` directive for two-way data binding. - - The `ng-control` for validation and form element change tracking. + - The `ngSubmit` directive for handling the form submission. + - Template local variables such as `#heroForm`, `#name`, `#alter-ego` and `#power`. + - The `ngModel` directive for two-way data binding. + - The `ngControl` for validation and form element change tracking. - The local variable’s `valid` property on input controls to check if a control is valid and show/hide error messages. - - Property Binding to disable the submit button when the form is invalid. - - Custom CSS classes that provide visual feedback to users about required invalid controls. + - Controlling the submit button's enabled state by binding to `NgForm` validity. + - Custom CSS classes that provide visual feedback to users about invalid controls. - Here’s the final version of the application: - -+makeTabs( - `forms/ts/src/app/hero-form.component.html, - forms/ts/src/app/hero-form.component.ts, - forms/ts/src/app/hero.ts, - forms/ts/src/app/app.ts, - forms/ts/src/index.html, - forms/ts/src/styles.css`, - 'final, final,,,,', - `hero-form.component.html, - hero-form.component.ts, - hero.ts, - app.ts, - index.html, - styles.css`) -:marked Our final project folder structure should look like this: - ``` +code-example(format=""). angular2-forms ├── node_modules - ├── src - │ ├── app - │ | ├── app.ts - │ | ├── hero.ts - │ | ├── hero-form.component.html - │ | └── hero-form.component.ts - │ ├── index.html - │ ├── styles.css - │ └── tsconfig.json + ├── app + | ├── app.component.ts + | ├── boot.ts + | ├── hero.ts + | ├── hero-form.component.html + | └── hero-form.component.ts + ├── index.html + ├── styles.css + ├── tsconfig.json └── package.json - ``` +:marked + Here’s the final version of the source: + ++makeTabs( + `forms/ts/app/hero-form.component.ts, + forms/ts/app/hero-form.component.html, + forms/ts/app/hero.ts, + forms/ts/app/app.component.ts, + forms/ts/app/boot.ts, + forms/ts/index.html, + forms/ts/styles.css`, + 'final, final,,,,,', + `hero-form.component.ts, + hero-form.component.html, + hero.ts, + app.component.ts, + boot.ts, + index.html, + styles.css`) +:marked \ No newline at end of file diff --git a/public/resources/images/devguide/forms/name-control-1.png b/public/resources/images/devguide/forms/name-control-1.png deleted file mode 100644 index 642fab68ba3e195a8e8c67aec5d66b9e444f00e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23510 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

q>P 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