@@ -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