UNPKG

angular2

Version:

Angular 2 - a web framework for modern web apps

172 lines (171 loc) 6.57 kB
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; import { CONST_EXPR, isBlank } from 'angular2/src/facade/lang'; import { ListWrapper, StringMapWrapper } from 'angular2/src/facade/collection'; import { BaseException } from 'angular2/src/facade/exceptions'; import { ObservableWrapper, EventEmitter } from 'angular2/src/facade/async'; import { Directive, forwardRef, Provider, Inject, Optional, Self } from 'angular2/core'; import { ControlContainer } from './control_container'; import { setUpControl, setUpControlGroup, composeValidators, composeAsyncValidators } from './shared'; import { Validators, NG_VALIDATORS, NG_ASYNC_VALIDATORS } from '../validators'; const formDirectiveProvider = CONST_EXPR(new Provider(ControlContainer, { useExisting: forwardRef(() => NgFormModel) })); /** * Binds an existing control group to a DOM element. * * ### Example ([live demo](http://plnkr.co/edit/jqrVirudY8anJxTMUjTP?p=preview)) * * In this example, we bind the control group to the form element, and we bind the login and * password controls to the login and password elements. * * ```typescript * @Component({ * selector: 'my-app', * template: ` * <div> * <h2>NgFormModel Example</h2> * <form [ngFormModel]="loginForm"> * <p>Login: <input type="text" ngControl="login"></p> * <p>Password: <input type="password" ngControl="password"></p> * </form> * <p>Value:</p> * <pre>{{value}}</pre> * </div> * `, * directives: [FORM_DIRECTIVES] * }) * export class App { * loginForm: ControlGroup; * * constructor() { * this.loginForm = new ControlGroup({ * login: new Control(""), * password: new Control("") * }); * } * * get value(): string { * return JSON.stringify(this.loginForm.value, null, 2); * } * } * ``` * * We can also use ngModel to bind a domain model to the form. * * ```typescript * @Component({ * selector: "login-comp", * directives: [FORM_DIRECTIVES], * template: ` * <form [ngFormModel]='loginForm'> * Login <input type='text' ngControl='login' [(ngModel)]='credentials.login'> * Password <input type='password' ngControl='password' * [(ngModel)]='credentials.password'> * <button (click)="onLogin()">Login</button> * </form>` * }) * class LoginComp { * credentials: {login: string, password: string}; * loginForm: ControlGroup; * * constructor() { * this.loginForm = new ControlGroup({ * login: new Control(""), * password: new Control("") * }); * } * * onLogin(): void { * // this.credentials.login === 'some login' * // this.credentials.password === 'some password' * } * } * ``` */ export let NgFormModel = class NgFormModel extends ControlContainer { constructor(_validators, _asyncValidators) { super(); this._validators = _validators; this._asyncValidators = _asyncValidators; this.form = null; this.directives = []; this.ngSubmit = new EventEmitter(); } ngOnChanges(changes) { this._checkFormPresent(); if (StringMapWrapper.contains(changes, "form")) { var sync = composeValidators(this._validators); this.form.validator = Validators.compose([this.form.validator, sync]); var async = composeAsyncValidators(this._asyncValidators); this.form.asyncValidator = Validators.composeAsync([this.form.asyncValidator, async]); this.form.updateValueAndValidity({ onlySelf: true, emitEvent: false }); } this._updateDomValue(); } get formDirective() { return this; } get control() { return this.form; } get path() { return []; } addControl(dir) { var ctrl = this.form.find(dir.path); setUpControl(ctrl, dir); ctrl.updateValueAndValidity({ emitEvent: false }); this.directives.push(dir); } getControl(dir) { return this.form.find(dir.path); } removeControl(dir) { ListWrapper.remove(this.directives, dir); } addControlGroup(dir) { var ctrl = this.form.find(dir.path); setUpControlGroup(ctrl, dir); ctrl.updateValueAndValidity({ emitEvent: false }); } removeControlGroup(dir) { } getControlGroup(dir) { return this.form.find(dir.path); } updateModel(dir, value) { var ctrl = this.form.find(dir.path); ctrl.updateValue(value); } onSubmit() { ObservableWrapper.callEmit(this.ngSubmit, null); return false; } /** @internal */ _updateDomValue() { this.directives.forEach(dir => { var ctrl = this.form.find(dir.path); dir.valueAccessor.writeValue(ctrl.value); }); } _checkFormPresent() { if (isBlank(this.form)) { throw new BaseException(`ngFormModel expects a form. Please pass one in. Example: <form [ngFormModel]="myCoolForm">`); } } }; NgFormModel = __decorate([ Directive({ selector: '[ngFormModel]', bindings: [formDirectiveProvider], inputs: ['form: ngFormModel'], host: { '(submit)': 'onSubmit()' }, outputs: ['ngSubmit'], exportAs: 'ngForm' }), __param(0, Optional()), __param(0, Self()), __param(0, Inject(NG_VALIDATORS)), __param(1, Optional()), __param(1, Self()), __param(1, Inject(NG_ASYNC_VALIDATORS)), __metadata('design:paramtypes', [Array, Array]) ], NgFormModel);