@@ -8,9 +8,10 @@ import {NativeShadowDomStrategy} from 'angular2/src/core/compiler/shadow_dom_str
88import { Injector } from 'angular2/di' ;
99import { DOM } from 'angular2/src/facade/dom' ;
1010
11- import { Component , TemplateConfig } from 'angular2/core' ;
12- import { ControlDirective , ControlNameDirective , ControlGroupDirective , NewControlGroupDirective ,
13- Control , ControlGroup } from 'angular2/forms' ;
11+ import { Component , Decorator , TemplateConfig } from 'angular2/core' ;
12+ import { ControlGroupDirective , ControlNameDirective ,
13+ ControlDirective , NewControlGroupDirective ,
14+ Control , ControlGroup , ControlValueAccessor } from 'angular2/forms' ;
1415
1516import { TemplateLoader } from 'angular2/src/core/compiler/template_loader' ;
1617import { XHRMock } from 'angular2/src/mock/xhr_mock' ;
@@ -36,19 +37,14 @@ export function main() {
3637 } ) ;
3738 }
3839
39- function formComponent ( view ) {
40- // TODO: vsavkin remove when view variables work
41- return view . elementInjectors [ 0 ] . getComponent ( ) ;
42- }
43-
4440 describe ( "integration tests" , ( ) => {
4541 it ( "should initialize DOM elements with the given form object" , ( done ) => {
4642 var ctx = new MyComp ( new ControlGroup ( {
4743 "login" : new Control ( "loginValue" )
4844 } ) ) ;
4945
5046 var t = `<div [control-group]="form">
51- <input [ control-name]="' login' ">
47+ <input type="text" control-name=" login">
5248 </div>` ;
5349
5450 compile ( MyComp , t , ctx , ( view ) => {
@@ -65,7 +61,7 @@ export function main() {
6561 var ctx = new MyComp ( form ) ;
6662
6763 var t = `<div [control-group]="form">
68- <input [ control-name]="' login' ">
64+ <input type="text" control-name=" login">
6965 </div>` ;
7066
7167 compile ( MyComp , t , ctx , ( view ) => {
@@ -86,7 +82,7 @@ export function main() {
8682 var ctx = new MyComp ( form ) ;
8783
8884 var t = `<div [control-group]="form">
89- <input [ control-name]="' login' ">
85+ <input type="text" control-name=" login">
9086 </div>` ;
9187
9288 compile ( MyComp , t , ctx , ( view ) => {
@@ -108,7 +104,7 @@ export function main() {
108104 } ) , "one" ) ;
109105
110106 var t = `<div [control-group]="form">
111- <input [control-name]="name">
107+ <input type="text" [control-name]="name">
112108 </div>` ;
113109
114110 compile ( MyComp , t , ctx , ( view ) => {
@@ -123,11 +119,51 @@ export function main() {
123119 } ) ;
124120 } ) ;
125121
122+ describe ( "different control types" , ( ) => {
123+ it ( "should support type=checkbox" , ( done ) => {
124+ var ctx = new MyComp ( new ControlGroup ( { "checkbox" : new Control ( true ) } ) ) ;
125+
126+ var t = `<div [control-group]="form">
127+ <input type="checkbox" control-name="checkbox">
128+ </div>` ;
129+
130+ compile ( MyComp , t , ctx , ( view ) => {
131+ var input = queryView ( view , "input" )
132+ expect ( input . checked ) . toBe ( true ) ;
133+
134+ input . checked = false ;
135+ dispatchEvent ( input , "change" ) ;
136+
137+ expect ( ctx . form . value ) . toEqual ( { "checkbox" : false } ) ;
138+ done ( ) ;
139+ } ) ;
140+ } ) ;
141+
142+ it ( "should support custom value accessors" , ( done ) => {
143+ var ctx = new MyComp ( new ControlGroup ( { "name" : new Control ( "aa" ) } ) ) ;
144+
145+ var t = `<div [control-group]="form">
146+ <input type="text" control-name="name" wrapped-value>
147+ </div>` ;
148+
149+ compile ( MyComp , t , ctx , ( view ) => {
150+ var input = queryView ( view , "input" )
151+ expect ( input . value ) . toEqual ( "!aa!" ) ;
152+
153+ input . value = "!bb!" ;
154+ dispatchEvent ( input , "change" ) ;
155+
156+ expect ( ctx . form . value ) . toEqual ( { "name" : "bb" } ) ;
157+ done ( ) ;
158+ } ) ;
159+ } ) ;
160+ } ) ;
161+
126162 describe ( "declarative forms" , ( ) => {
127163 it ( "should initialize dom elements" , ( done ) => {
128164 var t = `<div [new-control-group]="{'login': 'loginValue', 'password':'passValue'}">
129- <input id="login" [ control]="' login' ">
130- <input id="password" [ control]="' password' ">
165+ <input type="text" id="login" control=" login">
166+ <input type="password" id="password" control=" password">
131167 </div>` ;
132168
133169 compile ( MyComp , t , new MyComp ( ) , ( view ) => {
@@ -142,8 +178,8 @@ export function main() {
142178 } ) ;
143179
144180 it ( "should update the control group values on DOM change" , ( done ) => {
145- var t = `<div [new-control-group]="{'login': 'loginValue'}">
146- <input [ control]="' login' ">
181+ var t = `<div #form [new-control-group]="{'login': 'loginValue'}">
182+ <input type="text" control=" login">
147183 </div>` ;
148184
149185 compile ( MyComp , t , new MyComp ( ) , ( view ) => {
@@ -152,7 +188,8 @@ export function main() {
152188 input . value = "updatedValue" ;
153189 dispatchEvent ( input , "change" ) ;
154190
155- expect ( formComponent ( view ) . value ) . toEqual ( { 'login' : 'updatedValue' } ) ;
191+ var form = view . contextWithLocals . get ( "form" ) ;
192+ expect ( form . value ) . toEqual ( { 'login' : 'updatedValue' } ) ;
156193 done ( ) ;
157194 } ) ;
158195 } ) ;
@@ -166,7 +203,7 @@ export function main() {
166203 template : new TemplateConfig ( {
167204 inline : "" ,
168205 directives : [ ControlGroupDirective , ControlNameDirective ,
169- ControlDirective , NewControlGroupDirective ]
206+ ControlDirective , NewControlGroupDirective , WrappedValue ]
170207 } )
171208} )
172209class MyComp {
@@ -178,3 +215,22 @@ class MyComp {
178215 this . name = name ;
179216 }
180217}
218+
219+ class WrappedValueAccessor extends ControlValueAccessor {
220+ readValue ( el ) {
221+ return el . value . substring ( 1 , el . value . length - 1 ) ;
222+ }
223+
224+ writeValue ( el , value ) :void {
225+ el . value = `!${ value } !` ;
226+ }
227+ }
228+
229+ @Decorator ( {
230+ selector :'[wrapped-value]'
231+ } )
232+ class WrappedValue {
233+ constructor ( cd :ControlNameDirective ) {
234+ cd . valueAccessor = new WrappedValueAccessor ( ) ;
235+ }
236+ }
0 commit comments