@@ -483,104 +483,127 @@ describe('Scope', function() {
483
483
describe ( '$watchCollection' , function ( ) {
484
484
var log , $rootScope , deregister ;
485
485
486
- beforeEach ( inject ( function ( _$rootScope_ ) {
487
- log = [ ] ;
486
+ beforeEach ( inject ( function ( _$rootScope_ , _log_ ) {
488
487
$rootScope = _$rootScope_ ;
489
- deregister = $rootScope . $watchCollection ( 'obj' , function logger ( obj ) {
490
- log . push ( toJson ( obj ) ) ;
488
+ log = _log_ ;
489
+ deregister = $rootScope . $watchCollection ( 'obj' , function logger ( newVal , oldVal ) {
490
+ var msg = { newVal : newVal , oldVal : oldVal } ;
491
+
492
+ if ( newVal === oldVal ) {
493
+ msg . identical = true ;
494
+ }
495
+
496
+ log ( msg ) ;
491
497
} ) ;
492
498
} ) ) ;
493
499
494
500
495
501
it ( 'should not trigger if nothing change' , inject ( function ( $rootScope ) {
496
502
$rootScope . $digest ( ) ;
497
- expect ( log ) . toEqual ( [ undefined ] ) ;
503
+ expect ( log ) . toEqual ( [ { newVal : undefined , oldVal : undefined , identical : true } ] ) ;
504
+ log . reset ( ) ;
498
505
499
506
$rootScope . $digest ( ) ;
500
- expect ( log ) . toEqual ( [ undefined ] ) ;
507
+ expect ( log ) . toEqual ( [ ] ) ;
501
508
} ) ) ;
502
509
503
510
504
- it ( 'should allow deregistration' , inject ( function ( $rootScope ) {
511
+ it ( 'should allow deregistration' , function ( ) {
505
512
$rootScope . obj = [ ] ;
506
513
$rootScope . $digest ( ) ;
507
-
508
- expect ( log ) . toEqual ( [ '[]' ] ) ;
514
+ expect ( log . toArray ( ) . length ) . toBe ( 1 ) ;
515
+ log . reset ( ) ;
509
516
510
517
$rootScope . obj . push ( 'a' ) ;
511
518
deregister ( ) ;
512
519
513
520
$rootScope . $digest ( ) ;
514
- expect ( log ) . toEqual ( [ '[]' ] ) ;
515
- } ) ) ;
521
+ expect ( log ) . toEqual ( [ ] ) ;
522
+ } ) ;
516
523
517
524
518
525
describe ( 'array' , function ( ) {
526
+
527
+ it ( 'should return oldCollection === newCollection only on the first listener call' ,
528
+ inject ( function ( $rootScope , log ) {
529
+
530
+ // first time should be identical
531
+ $rootScope . obj = [ 'a' , 'b' ] ;
532
+ $rootScope . $digest ( ) ;
533
+ expect ( log ) . toEqual ( [ { newVal : [ 'a' , 'b' ] , oldVal : [ 'a' , 'b' ] , identical : true } ] ) ;
534
+ log . reset ( ) ;
535
+
536
+ // second time should be different
537
+ $rootScope . obj [ 1 ] = 'c' ;
538
+ $rootScope . $digest ( ) ;
539
+ expect ( log ) . toEqual ( [ { newVal : [ 'a' , 'c' ] , oldVal : [ 'a' , 'b' ] } ] ) ;
540
+ } ) ) ;
541
+
542
+
519
543
it ( 'should trigger when property changes into array' , function ( ) {
520
544
$rootScope . obj = 'test' ;
521
545
$rootScope . $digest ( ) ;
522
- expect ( log ) . toEqual ( [ ' "test"' ] ) ;
546
+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : "test" , oldVal : "test" , identical : true } ] ) ;
523
547
524
548
$rootScope . obj = [ ] ;
525
549
$rootScope . $digest ( ) ;
526
- expect ( log ) . toEqual ( [ '"test"' , '[]' ] ) ;
550
+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : [ ] , oldVal : "test" } ] ) ;
527
551
528
552
$rootScope . obj = { } ;
529
553
$rootScope . $digest ( ) ;
530
- expect ( log ) . toEqual ( [ '"test"' , '[]' , '{}' ] ) ;
554
+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : { } , oldVal : [ ] } ] ) ;
531
555
532
556
$rootScope . obj = [ ] ;
533
557
$rootScope . $digest ( ) ;
534
- expect ( log ) . toEqual ( [ '"test"' , '[]' , '{}' , '[]' ] ) ;
558
+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : [ ] , oldVal : { } } ] ) ;
535
559
536
560
$rootScope . obj = undefined ;
537
561
$rootScope . $digest ( ) ;
538
- expect ( log ) . toEqual ( [ '"test"' , '[]' , '{}' , '[]' , undefined ] ) ;
562
+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : undefined , oldVal : [ ] } ] ) ;
539
563
} ) ;
540
564
541
565
542
566
it ( 'should not trigger change when object in collection changes' , function ( ) {
543
567
$rootScope . obj = [ { } ] ;
544
568
$rootScope . $digest ( ) ;
545
- expect ( log ) . toEqual ( [ ' [{}]' ] ) ;
569
+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : [ { } ] , oldVal : [ { } ] , identical : true } ] ) ;
546
570
547
571
$rootScope . obj [ 0 ] . name = 'foo' ;
548
572
$rootScope . $digest ( ) ;
549
- expect ( log ) . toEqual ( [ '[{}]' ] ) ;
573
+ expect ( log ) . toEqual ( [ ] ) ;
550
574
} ) ;
551
575
552
576
553
577
it ( 'should watch array properties' , function ( ) {
554
578
$rootScope . obj = [ ] ;
555
579
$rootScope . $digest ( ) ;
556
- expect ( log ) . toEqual ( [ '[]' ] ) ;
580
+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : [ ] , oldVal : [ ] , identical : true } ] ) ;
557
581
558
582
$rootScope . obj . push ( 'a' ) ;
559
583
$rootScope . $digest ( ) ;
560
- expect ( log ) . toEqual ( [ '[]' , '["a"]' ] ) ;
584
+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : [ 'a' ] , oldVal : [ ] } ] ) ;
561
585
562
586
$rootScope . obj [ 0 ] = 'b' ;
563
587
$rootScope . $digest ( ) ;
564
- expect ( log ) . toEqual ( [ '[]' , '["a"]' , '["b"]' ] ) ;
588
+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : [ 'b' ] , oldVal : [ 'a' ] } ] ) ;
565
589
566
590
$rootScope . obj . push ( [ ] ) ;
567
591
$rootScope . obj . push ( { } ) ;
568
- log = [ ] ;
569
592
$rootScope . $digest ( ) ;
570
- expect ( log ) . toEqual ( [ '["b", [],{}]' ] ) ;
593
+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : [ 'b' , [ ] , { } ] , oldVal : [ 'b' ] } ] ) ;
571
594
572
595
var temp = $rootScope . obj [ 1 ] ;
573
596
$rootScope . obj [ 1 ] = $rootScope . obj [ 2 ] ;
574
597
$rootScope . obj [ 2 ] = temp ;
575
598
$rootScope . $digest ( ) ;
576
- expect ( log ) . toEqual ( [ '["b",[],{}]' , '["b",{},[]]' ] ) ;
599
+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : [ 'b' , { } , [ ] ] , oldVal : [ 'b' , [ ] , { } ] } ] ) ;
577
600
578
601
$rootScope . obj . shift ( ) ;
579
- log = [ ] ;
580
602
$rootScope . $digest ( ) ;
581
- expect ( log ) . toEqual ( [ ' [{},[]]' ] ) ;
603
+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : [ { } , [ ] ] , oldVal : [ 'b' , { } , [ ] ] } ] ) ;
582
604
} ) ;
583
605
606
+
584
607
it ( 'should watch array-like objects like arrays' , function ( ) {
585
608
var arrayLikelog = [ ] ;
586
609
$rootScope . $watchCollection ( 'arrayLikeObject' , function logger ( obj ) {
@@ -601,57 +624,72 @@ describe('Scope', function() {
601
624
602
625
603
626
describe ( 'object' , function ( ) {
627
+
628
+ it ( 'should return oldCollection === newCollection only on the first listener call' ,
629
+ inject ( function ( $rootScope , log ) {
630
+
631
+ $rootScope . obj = { 'a' : 'b' } ;
632
+ // first time should be identical
633
+ $rootScope . $digest ( ) ;
634
+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : { 'a' : 'b' } , oldVal : { 'a' : 'b' } , identical : true } ] ) ;
635
+
636
+ // second time not identical
637
+ $rootScope . obj . a = 'c' ;
638
+ $rootScope . $digest ( ) ;
639
+ expect ( log ) . toEqual ( [ { newVal : { 'a' : 'c' } , oldVal : { 'a' : 'b' } } ] ) ;
640
+ } ) ) ;
641
+
642
+
604
643
it ( 'should trigger when property changes into object' , function ( ) {
605
644
$rootScope . obj = 'test' ;
606
645
$rootScope . $digest ( ) ;
607
- expect ( log ) . toEqual ( [ '" test"' ] ) ;
646
+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : ' test' , oldVal : 'test' , identical : true } ] ) ;
608
647
609
648
$rootScope . obj = { } ;
610
649
$rootScope . $digest ( ) ;
611
- expect ( log ) . toEqual ( [ '"test"' , '{}' ] ) ;
650
+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : { } , oldVal : 'test' } ] ) ;
612
651
} ) ;
613
652
614
653
615
654
it ( 'should not trigger change when object in collection changes' , function ( ) {
616
655
$rootScope . obj = { name : { } } ;
617
656
$rootScope . $digest ( ) ;
618
- expect ( log ) . toEqual ( [ '{" name": {}}' ] ) ;
657
+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : { name : { } } , oldVal : { name : { } } , identical : true } ] ) ;
619
658
620
659
$rootScope . obj . name . bar = 'foo' ;
621
660
$rootScope . $digest ( ) ;
622
- expect ( log ) . toEqual ( [ '{"name":{}}' ] ) ;
661
+ expect ( log . empty ( ) ) . toEqual ( [ ] ) ;
623
662
} ) ;
624
663
625
664
626
665
it ( 'should watch object properties' , function ( ) {
627
666
$rootScope . obj = { } ;
628
667
$rootScope . $digest ( ) ;
629
- expect ( log ) . toEqual ( [ '{}' ] ) ;
668
+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : { } , oldVal : { } , identical : true } ] ) ;
630
669
631
670
$rootScope . obj . a = 'A' ;
632
671
$rootScope . $digest ( ) ;
633
- expect ( log ) . toEqual ( [ '{}' , '{"a":"A"}' ] ) ;
672
+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : { a : 'A' } , oldVal : { } } ] ) ;
634
673
635
674
$rootScope . obj . a = 'B' ;
636
675
$rootScope . $digest ( ) ;
637
- expect ( log ) . toEqual ( [ '{}' , '{"a":"A"}' , '{"a":"B"}' ] ) ;
676
+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : { a : 'B' } , oldVal : { a : 'A' } } ] ) ;
638
677
639
678
$rootScope . obj . b = [ ] ;
640
679
$rootScope . obj . c = { } ;
641
- log = [ ] ;
642
680
$rootScope . $digest ( ) ;
643
- expect ( log ) . toEqual ( [ '{"a":"B","b": [],"c": {}}' ] ) ;
681
+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : { a : 'B' , b : [ ] , c : { } } , oldVal : { a : 'B' } } ] ) ;
644
682
645
683
var temp = $rootScope . obj . a ;
646
684
$rootScope . obj . a = $rootScope . obj . b ;
647
685
$rootScope . obj . c = temp ;
648
686
$rootScope . $digest ( ) ;
649
- expect ( log ) . toEqual ( [ '{"a":"B","b":[],"c":{}}' , '{"a":[],"b":[],"c":"B"}' ] ) ;
687
+ expect ( log . empty ( ) ) .
688
+ toEqual ( [ { newVal : { a : [ ] , b : { } , c : 'B' } , oldVal : { a : 'B' , b : [ ] , c : { } } } ] ) ;
650
689
651
690
delete $rootScope . obj . a ;
652
- log = [ ] ;
653
691
$rootScope . $digest ( ) ;
654
- expect ( log ) . toEqual ( [ '{"b": [],"c":"B"}' ] ) ;
692
+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : { b : { } , c : 'B' } , oldVal : { a : [ ] , b : { } , c : 'B' } } ] ) ;
655
693
} ) ;
656
694
} ) ;
657
695
} ) ;
0 commit comments