/** * @license * Copyright Google Inc. All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ /* tslint:disable:no-console */ import {Component, Directive, Host, NgModule} from '@angular/core'; import {FormControl, FormGroup, FormsModule, NG_VALIDATORS, NgForm} from '@angular/forms'; import {BrowserModule} from '@angular/platform-browser'; import {platformBrowserDynamic} from '@angular/platform-browser-dynamic'; /** * A domain model we are binding the form controls to. */ class CheckoutModel { firstName: string; middleName: string; lastName: string; country: string = 'Canada'; creditCard: string; amount: number; email: string; comments: string; } /** * Custom validator. */ export function creditCardValidator(c: FormControl): {[key: string]: boolean} { if (c.value && /^\d{16}$/.test(c.value)) { return null; } else { return {'invalidCreditCard': true}; } } export const creditCardValidatorBinding = { provide: NG_VALIDATORS, useValue: creditCardValidator, multi: true }; @Directive({selector: '[credit-card]', providers: [creditCardValidatorBinding]}) export class CreditCardValidator { } /** * This is a component that displays an error message. * * For instance, * * * * Will display the "is required" error if the control is empty, and "invalid credit card" if the * control is not empty * but not valid. * * In a real application, this component would receive a service that would map an error code to an * actual error message. * To make it simple, we are using a simple map here. */ @Component({ selector: 'show-error', inputs: ['controlPath: control', 'errorTypes: errors'], template: ` {{errorMessage}} ` }) export class ShowError { formDir: NgForm; controlPath: string; errorTypes: string[]; constructor(@Host() formDir: NgForm) { this.formDir = formDir; } get errorMessage(): string { const form: FormGroup = this.formDir.form; const control = form.get(this.controlPath); if (control && control.touched) { for (let i = 0; i < this.errorTypes.length; ++i) { if (control.hasError(this.errorTypes[i])) { return this._errorMessage(this.errorTypes[i]); } } } return null; } private _errorMessage(code: string): string { const config: {[key: string]: string} = { 'required': 'is required', 'invalidCreditCard': 'is invalid credit card number', }; return config[code]; } } @Component({ selector: 'template-driven-forms', template: `

Checkout Form

` }) export class TemplateDrivenForms { model = new CheckoutModel(); countries = ['US', 'Canada']; onSubmit(): void { console.log('Submitting:'); console.log(this.model); } } @NgModule({ declarations: [TemplateDrivenForms, CreditCardValidator, ShowError], bootstrap: [TemplateDrivenForms], imports: [BrowserModule, FormsModule] }) export class ExampleModule { } platformBrowserDynamic().bootstrapModule(ExampleModule);