diff --git a/modules/@angular/common/src/common_directives.ts b/modules/@angular/common/src/common_directives.ts index f1ad4cb1df..dc54725474 100644 --- a/modules/@angular/common/src/common_directives.ts +++ b/modules/@angular/common/src/common_directives.ts @@ -9,8 +9,6 @@ import {Type} from '@angular/core'; import {CORE_DIRECTIVES} from './directives'; -import {FORM_DIRECTIVES} from './forms-deprecated'; - /** * A collection of Angular core directives that are likely to be used in each and every Angular @@ -57,4 +55,4 @@ import {FORM_DIRECTIVES} from './forms-deprecated'; * * @experimental Contains forms which are experimental. */ -export const COMMON_DIRECTIVES: Type[][] = /*@ts2dart_const*/[CORE_DIRECTIVES, FORM_DIRECTIVES]; +export const COMMON_DIRECTIVES: Type[][] = /*@ts2dart_const*/[CORE_DIRECTIVES]; diff --git a/modules/@angular/common/src/forms-deprecated.ts b/modules/@angular/common/src/forms-deprecated.ts index ef8c18e804..d6484feaa9 100644 --- a/modules/@angular/common/src/forms-deprecated.ts +++ b/modules/@angular/common/src/forms-deprecated.ts @@ -18,8 +18,9 @@ * Forms providers are not included in default providers; you must import these providers * explicitly. */ -import {Type} from '@angular/core'; +import {AppModule, Type} from '@angular/core'; +import {FORM_DIRECTIVES} from './forms-deprecated/directives'; import {RadioControlRegistry} from './forms-deprecated/directives/radio_control_value_accessor'; import {FormBuilder} from './forms-deprecated/form_builder'; @@ -57,3 +58,18 @@ export {NG_ASYNC_VALIDATORS, NG_VALIDATORS, Validators} from './forms-deprecated * @experimental */ export const FORM_PROVIDERS: Type[] = /*@ts2dart_const*/[FormBuilder, RadioControlRegistry]; + + +/** + * The app module for the deprecated forms API. + * @deprecated + */ +@AppModule({ + providers: [ + FORM_PROVIDERS, + ], + directives: FORM_DIRECTIVES, + pipes: [] +}) +export class DeprecatedFormsModule { +} diff --git a/modules/@angular/common/test/forms-deprecated/integration_spec.ts b/modules/@angular/common/test/forms-deprecated/integration_spec.ts index 090932d2c1..1e33f2a445 100644 --- a/modules/@angular/common/test/forms-deprecated/integration_spec.ts +++ b/modules/@angular/common/test/forms-deprecated/integration_spec.ts @@ -7,11 +7,11 @@ */ import {NgFor, NgIf} from '@angular/common'; -import {Control, ControlGroup, ControlValueAccessor, FORM_DIRECTIVES, FORM_PROVIDERS, NG_ASYNC_VALIDATORS, NG_VALIDATORS, NgControl, NgForm, RadioButtonState, Validator, Validators} from '@angular/common/src/forms-deprecated'; +import {Control, ControlGroup, ControlValueAccessor, DeprecatedFormsModule, NG_ASYNC_VALIDATORS, NG_VALIDATORS, NgControl, NgForm, RadioButtonState, Validator, Validators} from '@angular/common/src/forms-deprecated'; import {TestComponentBuilder} from '@angular/compiler/testing'; import {Component, Directive, EventEmitter, Output} from '@angular/core'; import {Input, Provider, forwardRef} from '@angular/core'; -import {ComponentFixture, fakeAsync, flushMicrotasks, tick} from '@angular/core/testing'; +import {ComponentFixture, configureModule, fakeAsync, flushMicrotasks, tick} from '@angular/core/testing'; import {afterEach, beforeEach, ddescribe, describe, expect, iit, inject, it, xit} from '@angular/core/testing/testing_internal'; import {AsyncTestCompleter} from '@angular/core/testing/testing_internal'; import {By} from '@angular/platform-browser/src/dom/debug/by'; @@ -25,6 +25,8 @@ import {PromiseWrapper} from '../../src/facade/promise'; export function main() { describe('integration tests', () => { + beforeEach(() => {configureModule({modules: [DeprecatedFormsModule]})}); + it('should initialize DOM elements with the given form object', inject( [TestComponentBuilder, AsyncTestCompleter], @@ -1548,10 +1550,7 @@ class UniqLoginValidator implements Validator { @Component({ selector: 'my-comp', template: '', - directives: [ - FORM_DIRECTIVES, WrappedValue, MyInput, NgIf, NgFor, LoginIsEmptyValidator, UniqLoginValidator - ], - providers: [FORM_PROVIDERS] + directives: [WrappedValue, MyInput, NgIf, NgFor, LoginIsEmptyValidator, UniqLoginValidator] }) class MyComp8 { form: any; diff --git a/modules/@angular/forms/src/directives.ts b/modules/@angular/forms/src/directives.ts index 3528f71c0f..ed57d9f026 100644 --- a/modules/@angular/forms/src/directives.ts +++ b/modules/@angular/forms/src/directives.ts @@ -44,7 +44,18 @@ export {NgSelectOption, SelectControlValueAccessor} from './directives/select_co export {NgSelectMultipleOption, SelectMultipleControlValueAccessor} from './directives/select_multiple_control_value_accessor'; export {MaxLengthValidator, MinLengthValidator, PatternValidator, RequiredValidator} from './directives/validators'; +const SHARED_FORM_DIRECTIVES: Type[] = /*@ts2dart_const*/[ + NgSelectOption, NgSelectMultipleOption, DefaultValueAccessor, NumberValueAccessor, + CheckboxControlValueAccessor, SelectControlValueAccessor, SelectMultipleControlValueAccessor, + RadioControlValueAccessor, NgControlStatus, RequiredValidator, MinLengthValidator, + MaxLengthValidator, PatternValidator +]; +const TEMPLATE_DRIVEN_DIRECTIVES: Type[] = /*@ts2dart_const*/[NgModel, NgModelGroup, NgForm]; + +const REACTIVE_DRIVEN_DIRECTIVES: Type[] = /*@ts2dart_const*/[ + FormControlDirective, FormGroupDirective, FormControlName, FormGroupName, FormArrayName +]; /** * @@ -63,20 +74,12 @@ export {MaxLengthValidator, MinLengthValidator, PatternValidator, RequiredValida * ``` * @experimental */ -export const FORM_DIRECTIVES: Type[] = /*@ts2dart_const*/[ - NgModel, NgModelGroup, NgForm, - - NgSelectOption, NgSelectMultipleOption, DefaultValueAccessor, NumberValueAccessor, - CheckboxControlValueAccessor, SelectControlValueAccessor, SelectMultipleControlValueAccessor, - RadioControlValueAccessor, NgControlStatus, - - RequiredValidator, MinLengthValidator, MaxLengthValidator, PatternValidator -]; +export const FORM_DIRECTIVES: Type[][] = + /*@ts2dart_const*/[TEMPLATE_DRIVEN_DIRECTIVES, SHARED_FORM_DIRECTIVES]; /** * @experimental */ -export const REACTIVE_FORM_DIRECTIVES: Type[] = - /*@ts2dart_const*/[ - FormControlDirective, FormGroupDirective, FormControlName, FormGroupName, FormArrayName - ]; + +export const REACTIVE_FORM_DIRECTIVES: Type[][] = + /*@ts2dart_const*/[REACTIVE_DRIVEN_DIRECTIVES, SHARED_FORM_DIRECTIVES]; diff --git a/modules/@angular/forms/src/form_providers.ts b/modules/@angular/forms/src/form_providers.ts index c673c7c8ac..82aed7e0aa 100644 --- a/modules/@angular/forms/src/form_providers.ts +++ b/modules/@angular/forms/src/form_providers.ts @@ -6,64 +6,37 @@ * found in the LICENSE file at https://angular.io/license */ - -import {COMMON_DIRECTIVES, FORM_DIRECTIVES as OLD_FORM_DIRECTIVES, FORM_PROVIDERS as OLD_FORM_PROVIDERS} from '@angular/common'; -import {CompilerConfig} from '@angular/compiler'; -import {PLATFORM_DIRECTIVES, PLATFORM_PIPES, Type} from '@angular/core'; - -import {FORM_DIRECTIVES as NEW_FORM_DIRECTIVES} from './directives'; -import {RadioControlRegistry as NewRadioControlRegistry} from './directives/radio_control_value_accessor'; -import {ListWrapper} from './facade/collection'; -import {FormBuilder as NewFormBuilder} from './form_builder'; - +import {AppModule, Type} from '@angular/core'; +import {FORM_DIRECTIVES, REACTIVE_FORM_DIRECTIVES} from './directives'; +import {RadioControlRegistry} from './directives/radio_control_value_accessor'; +import {FormBuilder} from './form_builder'; /** * Shorthand set of providers used for building Angular forms. - * - * ### Example - * - * ```typescript - * bootstrap(MyApp, [FORM_PROVIDERS]); - * ``` - * * @experimental */ -export const FORM_PROVIDERS: Type[] = /*@ts2dart_const*/[NewFormBuilder, NewRadioControlRegistry]; - -function flatten(platformDirectives: any[]): any[] { - let flattenedDirectives: any[] = []; - platformDirectives.forEach((directives) => { - if (Array.isArray(directives)) { - flattenedDirectives = flattenedDirectives.concat(directives); - } else { - flattenedDirectives.push(directives); - } - }); - return flattenedDirectives; -} - +export const FORM_PROVIDERS: Type[] = /*@ts2dart_const*/[RadioControlRegistry]; /** + * Shorthand set of providers used for building reactive Angular forms. * @experimental */ -export function disableDeprecatedForms(): any[] { - return [{ - provide: CompilerConfig, - useFactory: (platformDirectives: any[], platformPipes: any[]) => { - const flattenedDirectives = flatten(platformDirectives); - ListWrapper.remove(flattenedDirectives, OLD_FORM_DIRECTIVES); - return new CompilerConfig({platformDirectives: flattenedDirectives, platformPipes}); - }, - deps: [PLATFORM_DIRECTIVES, PLATFORM_PIPES] - }]; +export const REACTIVE_FORM_PROVIDERS: Type[] = + /*@ts2dart_const*/[FormBuilder, RadioControlRegistry]; + +/** + * The app module for forms. + * @experimental + */ +@AppModule({providers: [FORM_PROVIDERS], directives: FORM_DIRECTIVES, pipes: []}) +export class FormsModule { } /** + * The app module for reactive forms. * @experimental */ -export function provideForms(): any[] { - return [ - {provide: PLATFORM_DIRECTIVES, useValue: NEW_FORM_DIRECTIVES, multi: true}, FORM_PROVIDERS - ]; -} +@AppModule({providers: [REACTIVE_FORM_PROVIDERS], directives: REACTIVE_FORM_DIRECTIVES, pipes: []}) +export class ReactiveFormsModule { +} \ No newline at end of file diff --git a/modules/@angular/forms/test/integration_spec.ts b/modules/@angular/forms/test/integration_spec.ts index bf7bb88ee7..848c67e344 100644 --- a/modules/@angular/forms/test/integration_spec.ts +++ b/modules/@angular/forms/test/integration_spec.ts @@ -10,11 +10,10 @@ import {NgFor, NgIf} from '@angular/common'; import {TestComponentBuilder} from '@angular/compiler/testing'; import {Component, Directive, EventEmitter, Output} from '@angular/core'; import {Input, Provider, forwardRef} from '@angular/core'; -import {ComponentFixture} from '@angular/core/testing'; -import {fakeAsync, flushMicrotasks, tick} from '@angular/core/testing'; +import {ComponentFixture, configureModule, fakeAsync, flushMicrotasks, tick} from '@angular/core/testing'; import {afterEach, beforeEach, ddescribe, describe, expect, iit, inject, it, xdescribe, xit} from '@angular/core/testing/testing_internal'; import {AsyncTestCompleter} from '@angular/core/testing/testing_internal'; -import {ControlValueAccessor, FORM_DIRECTIVES, FORM_PROVIDERS, FormArray, FormControl, FormGroup, NG_ASYNC_VALIDATORS, NG_VALIDATORS, NgControl, NgForm, NgModel, REACTIVE_FORM_DIRECTIVES, Validator, Validators, disableDeprecatedForms, provideForms} from '@angular/forms'; +import {ControlValueAccessor, FORM_DIRECTIVES, FORM_PROVIDERS, FormArray, FormControl, FormGroup, FormsModule, NG_ASYNC_VALIDATORS, NG_VALIDATORS, NgControl, NgForm, NgModel, REACTIVE_FORM_DIRECTIVES, ReactiveFormsModule, Validator, Validators} from '@angular/forms'; import {By} from '@angular/platform-browser/src/dom/debug/by'; import {getDOM} from '@angular/platform-browser/src/dom/dom_adapter'; import {dispatchEvent} from '@angular/platform-browser/testing/browser_util'; @@ -25,8 +24,8 @@ import {PromiseWrapper} from '../src/facade/promise'; export function main() { describe('integration tests', () => { - let providerArr: any[]; - beforeEach(() => { providerArr = [disableDeprecatedForms(), provideForms()]; }); + + beforeEach(() => { configureModule({modules: [FormsModule, ReactiveFormsModule]}); }); it('should initialize DOM elements with the given form object', inject( @@ -36,18 +35,15 @@ export function main() { `; - tcb.overrideTemplate(MyComp8, t) - .overrideProviders(MyComp8, providerArr) - .createAsync(MyComp8) - .then((fixture) => { - fixture.debugElement.componentInstance.form = - new FormGroup({'login': new FormControl('loginValue')}); - fixture.detectChanges(); + tcb.overrideTemplate(MyComp8, t).createAsync(MyComp8).then((fixture) => { + fixture.debugElement.componentInstance.form = + new FormGroup({'login': new FormControl('loginValue')}); + fixture.detectChanges(); - var input = fixture.debugElement.query(By.css('input')); - expect(input.nativeElement.value).toEqual('loginValue'); - async.done(); - }); + var input = fixture.debugElement.query(By.css('input')); + expect(input.nativeElement.value).toEqual('loginValue'); + async.done(); + }); })); it('should throw if a form isn\'t passed into formGroup', @@ -58,14 +54,11 @@ export function main() { `; - tcb.overrideTemplate(MyComp8, t) - .overrideProviders(MyComp8, providerArr) - .createAsync(MyComp8) - .then((fixture) => { - expect(() => fixture.detectChanges()) - .toThrowError(new RegExp(`formGroup expects a FormGroup instance`)); - async.done(); - }); + tcb.overrideTemplate(MyComp8, t).createAsync(MyComp8).then((fixture) => { + expect(() => fixture.detectChanges()) + .toThrowError(new RegExp(`formGroup expects a FormGroup instance`)); + async.done(); + }); })); it('should update the form group values on DOM change', @@ -78,20 +71,17 @@ export function main() { `; - tcb.overrideTemplate(MyComp8, t) - .overrideProviders(MyComp8, providerArr) - .createAsync(MyComp8) - .then((fixture) => { - fixture.debugElement.componentInstance.form = form; - fixture.detectChanges(); - var input = fixture.debugElement.query(By.css('input')); + tcb.overrideTemplate(MyComp8, t).createAsync(MyComp8).then((fixture) => { + fixture.debugElement.componentInstance.form = form; + fixture.detectChanges(); + var input = fixture.debugElement.query(By.css('input')); - input.nativeElement.value = 'updatedValue'; - dispatchEvent(input.nativeElement, 'input'); + input.nativeElement.value = 'updatedValue'; + dispatchEvent(input.nativeElement, 'input'); - expect(form.value).toEqual({'login': 'updatedValue'}); - async.done(); - }); + expect(form.value).toEqual({'login': 'updatedValue'}); + async.done(); + }); })); it('should ignore the change event for ', @@ -104,22 +94,19 @@ export function main() { `; - tcb.overrideTemplate(MyComp8, t) - .overrideProviders(MyComp8, providerArr) - .createAsync(MyComp8) - .then((fixture) => { - fixture.debugElement.componentInstance.form = form; - fixture.detectChanges(); - var input = fixture.debugElement.query(By.css('input')); + tcb.overrideTemplate(MyComp8, t).createAsync(MyComp8).then((fixture) => { + fixture.debugElement.componentInstance.form = form; + fixture.detectChanges(); + var input = fixture.debugElement.query(By.css('input')); - input.nativeElement.value = 'updatedValue'; + input.nativeElement.value = 'updatedValue'; - ObservableWrapper.subscribe( - form.valueChanges, (value) => { throw 'Should not happen'; }); - dispatchEvent(input.nativeElement, 'change'); + ObservableWrapper.subscribe( + form.valueChanges, (value) => { throw 'Should not happen'; }); + dispatchEvent(input.nativeElement, 'change'); - async.done(); - }); + async.done(); + }); })); it('should emit ngSubmit event on submit', @@ -203,22 +190,19 @@ export function main() { const t = `
`; - tcb.overrideTemplate(MyComp8, t) - .overrideProviders(MyComp8, providerArr) - .createAsync(MyComp8) - .then((fixture) => { - fixture.debugElement.componentInstance.form = control; - fixture.detectChanges(); + tcb.overrideTemplate(MyComp8, t).createAsync(MyComp8).then((fixture) => { + fixture.debugElement.componentInstance.form = control; + fixture.detectChanges(); - var input = fixture.debugElement.query(By.css('input')); - expect(input.nativeElement.value).toEqual('loginValue'); + var input = fixture.debugElement.query(By.css('input')); + expect(input.nativeElement.value).toEqual('loginValue'); - input.nativeElement.value = 'updatedValue'; - dispatchEvent(input.nativeElement, 'input'); + input.nativeElement.value = 'updatedValue'; + dispatchEvent(input.nativeElement, 'input'); - expect(control.value).toEqual('updatedValue'); - async.done(); - }); + expect(control.value).toEqual('updatedValue'); + async.done(); + }); })); it('should update DOM elements when rebinding the form group', @@ -229,22 +213,19 @@ export function main() { `; - tcb.overrideTemplate(MyComp8, t) - .overrideProviders(MyComp8, providerArr) - .createAsync(MyComp8) - .then((fixture) => { - fixture.debugElement.componentInstance.form = - new FormGroup({'login': new FormControl('oldValue')}); - fixture.detectChanges(); + tcb.overrideTemplate(MyComp8, t).createAsync(MyComp8).then((fixture) => { + fixture.debugElement.componentInstance.form = + new FormGroup({'login': new FormControl('oldValue')}); + fixture.detectChanges(); - fixture.debugElement.componentInstance.form = - new FormGroup({'login': new FormControl('newValue')}); - fixture.detectChanges(); + fixture.debugElement.componentInstance.form = + new FormGroup({'login': new FormControl('newValue')}); + fixture.detectChanges(); - var input = fixture.debugElement.query(By.css('input')); - expect(input.nativeElement.value).toEqual('newValue'); - async.done(); - }); + var input = fixture.debugElement.query(By.css('input')); + expect(input.nativeElement.value).toEqual('newValue'); + async.done(); + }); })); it('should update DOM elements when updating the value of a control', @@ -258,21 +239,18 @@ export function main() { `; - tcb.overrideTemplate(MyComp8, t) - .overrideProviders(MyComp8, providerArr) - .createAsync(MyComp8) - .then((fixture) => { - fixture.debugElement.componentInstance.form = form; - fixture.detectChanges(); + tcb.overrideTemplate(MyComp8, t).createAsync(MyComp8).then((fixture) => { + fixture.debugElement.componentInstance.form = form; + fixture.detectChanges(); - login.updateValue('newValue'); + login.updateValue('newValue'); - fixture.detectChanges(); + fixture.detectChanges(); - var input = fixture.debugElement.query(By.css('input')); - expect(input.nativeElement.value).toEqual('newValue'); - async.done(); - }); + var input = fixture.debugElement.query(By.css('input')); + expect(input.nativeElement.value).toEqual('newValue'); + async.done(); + }); })); it('should mark controls as touched after interacting with the DOM control', @@ -286,22 +264,19 @@ export function main() { `; - tcb.overrideTemplate(MyComp8, t) - .overrideProviders(MyComp8, providerArr) - .createAsync(MyComp8) - .then((fixture) => { - fixture.debugElement.componentInstance.form = form; - fixture.detectChanges(); + tcb.overrideTemplate(MyComp8, t).createAsync(MyComp8).then((fixture) => { + fixture.debugElement.componentInstance.form = form; + fixture.detectChanges(); - var loginEl = fixture.debugElement.query(By.css('input')); - expect(login.touched).toBe(false); + var loginEl = fixture.debugElement.query(By.css('input')); + expect(login.touched).toBe(false); - dispatchEvent(loginEl.nativeElement, 'blur'); + dispatchEvent(loginEl.nativeElement, 'blur'); - expect(login.touched).toBe(true); + expect(login.touched).toBe(true); - async.done(); - }); + async.done(); + }); })); it('should support form arrays', @@ -317,29 +292,26 @@ export function main() { `; - tcb.overrideTemplate(MyComp8, t) - .overrideProviders(MyComp8, providerArr) - .createAsync(MyComp8) - .then((fixture) => { - fixture.debugElement.componentInstance.form = form; - fixture.debugElement.componentInstance.cityArray = cityArray; - fixture.detectChanges(); - tick(); + tcb.overrideTemplate(MyComp8, t).createAsync(MyComp8).then((fixture) => { + fixture.debugElement.componentInstance.form = form; + fixture.debugElement.componentInstance.cityArray = cityArray; + fixture.detectChanges(); + tick(); - const inputs = fixture.debugElement.queryAll(By.css('input')); - expect(inputs[0].nativeElement.value).toEqual('SF'); - expect(inputs[1].nativeElement.value).toEqual('NY'); - expect(fixture.componentInstance.form.value).toEqual({cities: ['SF', 'NY']}); + const inputs = fixture.debugElement.queryAll(By.css('input')); + expect(inputs[0].nativeElement.value).toEqual('SF'); + expect(inputs[1].nativeElement.value).toEqual('NY'); + expect(fixture.componentInstance.form.value).toEqual({cities: ['SF', 'NY']}); - inputs[0].nativeElement.value = 'LA'; - dispatchEvent(inputs[0].nativeElement, 'input'); + inputs[0].nativeElement.value = 'LA'; + dispatchEvent(inputs[0].nativeElement, 'input'); - fixture.detectChanges(); - tick(); + fixture.detectChanges(); + tick(); - expect(fixture.componentInstance.form.value).toEqual({cities: ['LA', 'NY']}); + expect(fixture.componentInstance.form.value).toEqual({cities: ['LA', 'NY']}); - }); + }); }))); it('should support pushing new controls to form arrays', @@ -355,24 +327,21 @@ export function main() { `; - tcb.overrideTemplate(MyComp8, t) - .overrideProviders(MyComp8, providerArr) - .createAsync(MyComp8) - .then((fixture) => { - fixture.debugElement.componentInstance.form = form; - fixture.debugElement.componentInstance.cityArray = cityArray; - fixture.detectChanges(); - tick(); + tcb.overrideTemplate(MyComp8, t).createAsync(MyComp8).then((fixture) => { + fixture.debugElement.componentInstance.form = form; + fixture.debugElement.componentInstance.cityArray = cityArray; + fixture.detectChanges(); + tick(); - cityArray.push(new FormControl('LA')); - fixture.detectChanges(); - tick(); + cityArray.push(new FormControl('LA')); + fixture.detectChanges(); + tick(); - const inputs = fixture.debugElement.queryAll(By.css('input')); - expect(inputs[2].nativeElement.value).toEqual('LA'); - expect(fixture.componentInstance.form.value).toEqual({cities: ['SF', 'NY', 'LA']}); + const inputs = fixture.debugElement.queryAll(By.css('input')); + expect(inputs[2].nativeElement.value).toEqual('LA'); + expect(fixture.componentInstance.form.value).toEqual({cities: ['SF', 'NY', 'LA']}); - }); + }); }))); describe('different control types', () => { @@ -384,25 +353,20 @@ export function main() { `; - tcb.overrideTemplate(MyComp8, t) - .overrideProviders(MyComp8, providerArr) - .createAsync(MyComp8) - .then((fixture) => { - fixture.debugElement.componentInstance.form = - new FormGroup({'text': new FormControl('old')}); - fixture.detectChanges(); + tcb.overrideTemplate(MyComp8, t).createAsync(MyComp8).then((fixture) => { + fixture.debugElement.componentInstance.form = + new FormGroup({'text': new FormControl('old')}); + fixture.detectChanges(); - var input = fixture.debugElement.query(By.css('input')); - expect(input.nativeElement.value).toEqual('old'); + var input = fixture.debugElement.query(By.css('input')); + expect(input.nativeElement.value).toEqual('old'); - input.nativeElement.value = 'new'; - dispatchEvent(input.nativeElement, 'input'); + input.nativeElement.value = 'new'; + dispatchEvent(input.nativeElement, 'input'); - expect(fixture.debugElement.componentInstance.form.value).toEqual({ - 'text': 'new' - }); - async.done(); - }); + expect(fixture.debugElement.componentInstance.form.value).toEqual({'text': 'new'}); + async.done(); + }); })); it('should support without type', @@ -413,24 +377,19 @@ export function main() { `; - tcb.overrideTemplate(MyComp8, t) - .overrideProviders(MyComp8, providerArr) - .createAsync(MyComp8) - .then((fixture) => { - fixture.debugElement.componentInstance.form = - new FormGroup({'text': new FormControl('old')}); - fixture.detectChanges(); - var input = fixture.debugElement.query(By.css('input')); - expect(input.nativeElement.value).toEqual('old'); + tcb.overrideTemplate(MyComp8, t).createAsync(MyComp8).then((fixture) => { + fixture.debugElement.componentInstance.form = + new FormGroup({'text': new FormControl('old')}); + fixture.detectChanges(); + var input = fixture.debugElement.query(By.css('input')); + expect(input.nativeElement.value).toEqual('old'); - input.nativeElement.value = 'new'; - dispatchEvent(input.nativeElement, 'input'); + input.nativeElement.value = 'new'; + dispatchEvent(input.nativeElement, 'input'); - expect(fixture.debugElement.componentInstance.form.value).toEqual({ - 'text': 'new' - }); - async.done(); - }); + expect(fixture.debugElement.componentInstance.form.value).toEqual({'text': 'new'}); + async.done(); + }); })); it('should support