@@ -708,6 +708,74 @@ describe('Scope', function() {
708
708
} ) ;
709
709
710
710
711
+ it ( 'should allow removing event listener inside a listener on $emit' , function ( ) {
712
+ var spy1 = jasmine . createSpy ( '1st listener' ) ;
713
+ var spy2 = jasmine . createSpy ( '2nd listener' ) ;
714
+ var spy3 = jasmine . createSpy ( '3rd listener' ) ;
715
+
716
+ var remove1 = child . $on ( 'evt' , spy1 ) ;
717
+ var remove2 = child . $on ( 'evt' , spy2 ) ;
718
+ var remove3 = child . $on ( 'evt' , spy3 ) ;
719
+
720
+ spy1 . andCallFake ( remove1 ) ;
721
+
722
+ expect ( child . $$listeners [ 'evt' ] . length ) . toBe ( 3 ) ;
723
+
724
+ // should call all listeners and remove 1st
725
+ child . $emit ( 'evt' ) ;
726
+ expect ( spy1 ) . toHaveBeenCalledOnce ( ) ;
727
+ expect ( spy2 ) . toHaveBeenCalledOnce ( ) ;
728
+ expect ( spy3 ) . toHaveBeenCalledOnce ( ) ;
729
+ expect ( child . $$listeners [ 'evt' ] . length ) . toBe ( 3 ) ; // cleanup will happen on next $emit
730
+
731
+ spy1 . reset ( ) ;
732
+ spy2 . reset ( ) ;
733
+ spy3 . reset ( ) ;
734
+
735
+ // should call only 2nd because 1st was already removed and 2nd removes 3rd
736
+ spy2 . andCallFake ( remove3 ) ;
737
+ child . $emit ( 'evt' ) ;
738
+ expect ( spy1 ) . not . toHaveBeenCalled ( ) ;
739
+ expect ( spy2 ) . toHaveBeenCalledOnce ( ) ;
740
+ expect ( spy3 ) . not . toHaveBeenCalled ( ) ;
741
+ expect ( child . $$listeners [ 'evt' ] . length ) . toBe ( 1 ) ;
742
+ } ) ;
743
+
744
+
745
+ it ( 'should allow removing event listener inside a listener on $broadcast' , function ( ) {
746
+ var spy1 = jasmine . createSpy ( '1st listener' ) ;
747
+ var spy2 = jasmine . createSpy ( '2nd listener' ) ;
748
+ var spy3 = jasmine . createSpy ( '3rd listener' ) ;
749
+
750
+ var remove1 = child . $on ( 'evt' , spy1 ) ;
751
+ var remove2 = child . $on ( 'evt' , spy2 ) ;
752
+ var remove3 = child . $on ( 'evt' , spy3 ) ;
753
+
754
+ spy1 . andCallFake ( remove1 ) ;
755
+
756
+ expect ( child . $$listeners [ 'evt' ] . length ) . toBe ( 3 ) ;
757
+
758
+ // should call all listeners and remove 1st
759
+ child . $broadcast ( 'evt' ) ;
760
+ expect ( spy1 ) . toHaveBeenCalledOnce ( ) ;
761
+ expect ( spy2 ) . toHaveBeenCalledOnce ( ) ;
762
+ expect ( spy3 ) . toHaveBeenCalledOnce ( ) ;
763
+ expect ( child . $$listeners [ 'evt' ] . length ) . toBe ( 3 ) ; //cleanup will happen on next $broadcast
764
+
765
+ spy1 . reset ( ) ;
766
+ spy2 . reset ( ) ;
767
+ spy3 . reset ( ) ;
768
+
769
+ // should call only 2nd because 1st was already removed and 2nd removes 3rd
770
+ spy2 . andCallFake ( remove3 ) ;
771
+ child . $broadcast ( 'evt' ) ;
772
+ expect ( spy1 ) . not . toHaveBeenCalled ( ) ;
773
+ expect ( spy2 ) . toHaveBeenCalledOnce ( ) ;
774
+ expect ( spy3 ) . not . toHaveBeenCalled ( ) ;
775
+ expect ( child . $$listeners [ 'evt' ] . length ) . toBe ( 1 ) ;
776
+ } ) ;
777
+
778
+
711
779
describe ( 'event object' , function ( ) {
712
780
it ( 'should have methods/properties' , function ( ) {
713
781
var event ;
0 commit comments