` wrapper we just wrote:
There's our hero again, displayed read-only with interpolation bindings.
This `
` appears only while the component is in the submitted state.
The HTML includes an _Edit_ button whose click event is bound to an expression
that clears the `submitted` flag.
When we click the _Edit_ button, this block disappears and the editable form reappears.
That's as much drama as we can muster for now.
## Conclusion
The Angular form discussed in this guide takes advantage of the following
framework features to provide support for data modification, validation, and more:
- An Angular HTML form template.
- A form component class with a `@Component` decorator.
- Handling form submission by binding to the `NgForm.ngSubmit` event property.
- Template reference variables such as `#heroForm` and `#name`.
- `[(ngModel)]` syntax for two-way data binding.
- The use of `name` attributes for validation and form element change tracking.
- The reference variable’s `valid` property on input controls to check if a control is valid and show/hide error messages.
- Controlling the submit button's enabled state by binding to `NgForm` validity.
- Custom CSS classes that provide visual feedback to users about invalid controls.
Our final project folder structure should look like this:
angular-forms
src
app
app.component.ts
app.module.ts
hero.ts
hero-form.component.html
hero-form.component.ts
main.ts
tsconfig.json
index.html
node_modules ...
package.json
Here’s the code for the final version of the application:
{@example 'forms/ts/src/app/hero-form.component.ts' region='final'}
{@example 'forms/ts/src/app/hero-form.component.html' region='final'}
{@example 'forms/ts/src/app/hero.ts'}
{@example 'forms/ts/src/app/app.module.ts'}
{@example 'forms/ts/src/app/app.component.ts'}
{@example 'forms/ts/src/main.ts'}
{@example 'forms/ts/src/index.html'}
{@example 'forms/ts/src/forms.css'}