@@ -26,7 +26,7 @@ export function main() {
2626 function createChangeDetector ( memo :string , exp :string , context = null , formatters = null ,
2727 content = false ) {
2828 var prr = new ProtoRecordRange ( ) ;
29- prr . addRecordsFromAST ( ast ( exp ) , memo , content ) ;
29+ prr . addRecordsFromAST ( ast ( exp ) , memo , memo , content ) ;
3030
3131 var dispatcher = new LoggingDispatcher ( ) ;
3232 var rr = prr . instantiate ( dispatcher , formatters ) ;
@@ -97,21 +97,21 @@ export function main() {
9797 it ( "should support literal array" , ( ) => {
9898 var c = createChangeDetector ( 'array' , '[1,2]' ) ;
9999 c [ "changeDetector" ] . detectChanges ( ) ;
100- expect ( c [ "dispatcher" ] . loggedValues ) . toEqual ( [ [ 1 , 2 ] ] ) ;
100+ expect ( c [ "dispatcher" ] . loggedValues ) . toEqual ( [ [ [ 1 , 2 ] ] ] ) ;
101101
102102 c = createChangeDetector ( 'array' , '[1,a]' , new TestData ( 2 ) ) ;
103103 c [ "changeDetector" ] . detectChanges ( ) ;
104- expect ( c [ "dispatcher" ] . loggedValues ) . toEqual ( [ [ 1 , 2 ] ] ) ;
104+ expect ( c [ "dispatcher" ] . loggedValues ) . toEqual ( [ [ [ 1 , 2 ] ] ] ) ;
105105 } ) ;
106106
107107 it ( "should support literal maps" , ( ) => {
108108 var c = createChangeDetector ( 'map' , '{z:1}' ) ;
109109 c [ "changeDetector" ] . detectChanges ( ) ;
110- expect ( MapWrapper . get ( c [ "dispatcher" ] . loggedValues [ 0 ] , 'z' ) ) . toEqual ( 1 ) ;
110+ expect ( MapWrapper . get ( c [ "dispatcher" ] . loggedValues [ 0 ] [ 0 ] , 'z' ) ) . toEqual ( 1 ) ;
111111
112112 c = createChangeDetector ( 'map' , '{z:a}' , new TestData ( 1 ) ) ;
113113 c [ "changeDetector" ] . detectChanges ( ) ;
114- expect ( MapWrapper . get ( c [ "dispatcher" ] . loggedValues [ 0 ] , 'z' ) ) . toEqual ( 1 ) ;
114+ expect ( MapWrapper . get ( c [ "dispatcher" ] . loggedValues [ 0 ] [ 0 ] , 'z' ) ) . toEqual ( 1 ) ;
115115 } ) ;
116116
117117 it ( "should support binary operations" , ( ) => {
@@ -242,6 +242,7 @@ export function main() {
242242
243243 context . a = [ 0 ] ;
244244 cd . detectChanges ( ) ;
245+
245246 expect ( dsp . log ) . toEqual ( [ "a=" +
246247 arrayChangesAsString ( {
247248 collection : [ '0[null->0]' ] ,
@@ -343,10 +344,69 @@ export function main() {
343344 } ) ;
344345 }
345346 } ) ;
347+
348+ describe ( "onGroupChange" , ( ) => {
349+ it ( "should notify the dispatcher when a group of records changes" , ( ) => {
350+ var prr = new ProtoRecordRange ( ) ;
351+ prr . addRecordsFromAST ( ast ( "1 + 2" ) , "memo" , 1 ) ;
352+ prr . addRecordsFromAST ( ast ( "10 + 20" ) , "memo" , 1 ) ;
353+ prr . addRecordsFromAST ( ast ( "100 + 200" ) , "memo2" , 2 ) ;
354+
355+ var dispatcher = new LoggingDispatcher ( ) ;
356+ var rr = prr . instantiate ( dispatcher , null ) ;
357+
358+ var cd = new ChangeDetector ( rr ) ;
359+ cd . detectChanges ( ) ;
360+
361+ expect ( dispatcher . loggedValues ) . toEqual ( [ [ 3 , 30 ] , [ 300 ] ] ) ;
362+ } ) ;
363+
364+ it ( "should update every instance of a group individually" , ( ) => {
365+ var prr = new ProtoRecordRange ( ) ;
366+ prr . addRecordsFromAST ( ast ( "1 + 2" ) , "memo" , "memo" ) ;
367+
368+ var dispatcher = new LoggingDispatcher ( ) ;
369+ var rr = new RecordRange ( null , dispatcher ) ;
370+ rr . addRange ( prr . instantiate ( dispatcher , null ) ) ;
371+ rr . addRange ( prr . instantiate ( dispatcher , null ) ) ;
372+
373+ var cd = new ChangeDetector ( rr ) ;
374+ cd . detectChanges ( ) ;
375+
376+ expect ( dispatcher . loggedValues ) . toEqual ( [ [ 3 ] , [ 3 ] ] ) ;
377+ } ) ;
378+
379+ it ( "should notify the dispatcher before switching to the next group" , ( ) => {
380+ var prr = new ProtoRecordRange ( ) ;
381+ prr . addRecordsFromAST ( ast ( "a()" ) , "a" , 1 ) ;
382+ prr . addRecordsFromAST ( ast ( "b()" ) , "b" , 2 ) ;
383+ prr . addRecordsFromAST ( ast ( "c()" ) , "b" , 2 ) ;
384+
385+ var dispatcher = new LoggingDispatcher ( ) ;
386+ var rr = prr . instantiate ( dispatcher , null ) ;
387+
388+ var tr = new TestRecord ( ) ;
389+ tr . a = ( ) => { dispatcher . logValue ( 'InvokeA' ) ; return 'a' } ;
390+ tr . b = ( ) => { dispatcher . logValue ( 'InvokeB' ) ; return 'b' } ;
391+ tr . c = ( ) => { dispatcher . logValue ( 'InvokeC' ) ; return 'c' } ;
392+ rr . setContext ( tr ) ;
393+
394+ var cd = new ChangeDetector ( rr ) ;
395+ cd . detectChanges ( ) ;
396+
397+ expect ( dispatcher . loggedValues ) . toEqual ( [ 'InvokeA' , [ 'a' ] , 'InvokeB' , 'InvokeC' , [ 'b' , 'c' ] ] ) ;
398+ } ) ;
399+ } ) ;
346400 } ) ;
347401 } ) ;
348402}
349403
404+ class TestRecord {
405+ a ;
406+ b ;
407+ c ;
408+ }
409+
350410class Person {
351411 name :string ;
352412 address :Address ;
@@ -387,6 +447,7 @@ class TestData {
387447class LoggingDispatcher extends WatchGroupDispatcher {
388448 log :List ;
389449 loggedValues :List ;
450+
390451 constructor ( ) {
391452 this . log = null ;
392453 this . loggedValues = null ;
@@ -397,10 +458,18 @@ class LoggingDispatcher extends WatchGroupDispatcher {
397458 this . log = ListWrapper . create ( ) ;
398459 this . loggedValues = ListWrapper . create ( ) ;
399460 }
461+
462+ logValue ( value ) {
463+ ListWrapper . push ( this . loggedValues , value ) ;
464+ }
465+
466+ onRecordChange ( group , records :List ) {
467+ var value = records [ 0 ] . currentValue ;
468+ var dest = records [ 0 ] . protoRecord . dest ;
469+ ListWrapper . push ( this . log , dest + '=' + this . _asString ( value ) ) ;
400470
401- onRecordChange ( record :Record , context ) {
402- ListWrapper . push ( this . loggedValues , record . currentValue ) ;
403- ListWrapper . push ( this . log , context + '=' + this . _asString ( record . currentValue ) ) ;
471+ var values = ListWrapper . map ( records , ( r ) => r . currentValue ) ;
472+ ListWrapper . push ( this . loggedValues , values ) ;
404473 }
405474
406475 _asString ( value ) {
0 commit comments