@@ -2543,10 +2543,17 @@ describe('$compile', function() {
2543
2543
} ;
2544
2544
2545
2545
expect ( func ) . not . toThrow ( ) ;
2546
- expect ( element . find ( 'span' ) . scope ( ) ) . toBe ( element . isolateScope ( ) ) ;
2547
- expect ( element . isolateScope ( ) ) . not . toBe ( $rootScope ) ;
2548
- expect ( element . isolateScope ( ) [ 'constructor' ] ) . toBe ( $rootScope . constructor ) ;
2549
- expect ( element . isolateScope ( ) [ 'valueOf' ] ) . toBeUndefined ( ) ;
2546
+ var scope = element . isolateScope ( ) ;
2547
+ expect ( element . find ( 'span' ) . scope ( ) ) . toBe ( scope ) ;
2548
+ expect ( scope ) . not . toBe ( $rootScope ) ;
2549
+
2550
+ // Not shadowed because optional
2551
+ expect ( scope . constructor ) . toBe ( $rootScope . constructor ) ;
2552
+ expect ( scope . hasOwnProperty ( 'constructor' ) ) . toBe ( false ) ;
2553
+
2554
+ // Shadowed with undefined because not optional
2555
+ expect ( scope . valueOf ) . toBeUndefined ( ) ;
2556
+ expect ( scope . hasOwnProperty ( 'valueOf' ) ) . toBe ( true ) ;
2550
2557
} )
2551
2558
) ;
2552
2559
@@ -2561,10 +2568,13 @@ describe('$compile', function() {
2561
2568
} ;
2562
2569
2563
2570
expect ( func ) . not . toThrow ( ) ;
2564
- expect ( element . find ( 'span' ) . scope ( ) ) . toBe ( element . isolateScope ( ) ) ;
2565
- expect ( element . isolateScope ( ) ) . not . toBe ( $rootScope ) ;
2566
- expect ( element . isolateScope ( ) [ 'constructor' ] ) . toBe ( 'constructor' ) ;
2567
- expect ( element . isolateScope ( ) [ 'valueOf' ] ) . toBe ( 'valueOf' ) ;
2571
+ var scope = element . isolateScope ( ) ;
2572
+ expect ( element . find ( 'span' ) . scope ( ) ) . toBe ( scope ) ;
2573
+ expect ( scope ) . not . toBe ( $rootScope ) ;
2574
+ expect ( scope . constructor ) . toBe ( 'constructor' ) ;
2575
+ expect ( scope . hasOwnProperty ( 'constructor' ) ) . toBe ( true ) ;
2576
+ expect ( scope . valueOf ) . toBe ( 'valueOf' ) ;
2577
+ expect ( scope . hasOwnProperty ( 'valueOf' ) ) . toBe ( true ) ;
2568
2578
} )
2569
2579
) ;
2570
2580
@@ -2575,10 +2585,17 @@ describe('$compile', function() {
2575
2585
} ;
2576
2586
2577
2587
expect ( func ) . not . toThrow ( ) ;
2578
- expect ( element . find ( 'span' ) . scope ( ) ) . toBe ( element . isolateScope ( ) ) ;
2579
- expect ( element . isolateScope ( ) ) . not . toBe ( $rootScope ) ;
2580
- expect ( element . isolateScope ( ) [ 'constructor' ] ) . toBe ( $rootScope . constructor ) ;
2581
- expect ( element . isolateScope ( ) [ 'valueOf' ] ) . toBeUndefined ( ) ;
2588
+ var scope = element . isolateScope ( ) ;
2589
+ expect ( element . find ( 'span' ) . scope ( ) ) . toBe ( scope ) ;
2590
+ expect ( scope ) . not . toBe ( $rootScope ) ;
2591
+
2592
+ // Does not shadow value because optional
2593
+ expect ( scope . constructor ) . toBe ( $rootScope . constructor ) ;
2594
+ expect ( scope . hasOwnProperty ( 'constructor' ) ) . toBe ( false ) ;
2595
+
2596
+ // Shadows value because not optional
2597
+ expect ( scope . valueOf ) . toBeUndefined ( ) ;
2598
+ expect ( scope . hasOwnProperty ( 'valueOf' ) ) . toBe ( true ) ;
2582
2599
} )
2583
2600
) ;
2584
2601
@@ -3576,6 +3593,58 @@ describe('$compile', function() {
3576
3593
} ) ) ;
3577
3594
3578
3595
3596
+ it ( 'should not overwrite @-bound property each digest when not present' , function ( ) {
3597
+ module ( function ( $compileProvider ) {
3598
+ $compileProvider . directive ( 'testDir' , valueFn ( {
3599
+ scope : { prop : '@' } ,
3600
+ controller : function ( $scope ) {
3601
+ $scope . prop = $scope . prop || 'default' ;
3602
+ this . getProp = function ( ) {
3603
+ return $scope . prop ;
3604
+ } ;
3605
+ } ,
3606
+ controllerAs : 'ctrl' ,
3607
+ template : '<p></p>'
3608
+ } ) ) ;
3609
+ } ) ;
3610
+ inject ( function ( $compile , $rootScope ) {
3611
+ element = $compile ( '<div test-dir></div>' ) ( $rootScope ) ;
3612
+ var scope = element . isolateScope ( ) ;
3613
+ expect ( scope . ctrl . getProp ( ) ) . toBe ( 'default' ) ;
3614
+
3615
+ $rootScope . $digest ( ) ;
3616
+ expect ( scope . ctrl . getProp ( ) ) . toBe ( 'default' ) ;
3617
+ } ) ;
3618
+ } ) ;
3619
+
3620
+
3621
+ it ( 'should ignore optional "="-bound property if value is the emptry string' , function ( ) {
3622
+ module ( function ( $compileProvider ) {
3623
+ $compileProvider . directive ( 'testDir' , valueFn ( {
3624
+ scope : { prop : '=?' } ,
3625
+ controller : function ( $scope ) {
3626
+ $scope . prop = $scope . prop || 'default' ;
3627
+ this . getProp = function ( ) {
3628
+ return $scope . prop ;
3629
+ } ;
3630
+ } ,
3631
+ controllerAs : 'ctrl' ,
3632
+ template : '<p></p>'
3633
+ } ) ) ;
3634
+ } ) ;
3635
+ inject ( function ( $compile , $rootScope ) {
3636
+ element = $compile ( '<div test-dir></div>' ) ( $rootScope ) ;
3637
+ var scope = element . isolateScope ( ) ;
3638
+ expect ( scope . ctrl . getProp ( ) ) . toBe ( 'default' ) ;
3639
+ $rootScope . $digest ( ) ;
3640
+ expect ( scope . ctrl . getProp ( ) ) . toBe ( 'default' ) ;
3641
+ scope . prop = 'foop' ;
3642
+ $rootScope . $digest ( ) ;
3643
+ expect ( scope . ctrl . getProp ( ) ) . toBe ( 'foop' ) ;
3644
+ } ) ;
3645
+ } ) ;
3646
+
3647
+
3579
3648
describe ( 'bind-once' , function ( ) {
3580
3649
3581
3650
function countWatches ( scope ) {
@@ -4437,6 +4506,64 @@ describe('$compile', function() {
4437
4506
childScope . theCtrl . test ( ) ;
4438
4507
} ) ;
4439
4508
} ) ;
4509
+
4510
+ describe ( 'should not overwrite @-bound property each digest when not present' , function ( ) {
4511
+ it ( 'when creating new scope' , function ( ) {
4512
+ module ( function ( $compileProvider ) {
4513
+ $compileProvider . directive ( 'testDir' , valueFn ( {
4514
+ scope : true ,
4515
+ bindToController : {
4516
+ prop : '@'
4517
+ } ,
4518
+ controller : function ( ) {
4519
+ var self = this ;
4520
+ this . prop = this . prop || 'default' ;
4521
+ this . getProp = function ( ) {
4522
+ return self . prop ;
4523
+ } ;
4524
+ } ,
4525
+ controllerAs : 'ctrl' ,
4526
+ template : '<p></p>'
4527
+ } ) ) ;
4528
+ } ) ;
4529
+ inject ( function ( $compile , $rootScope ) {
4530
+ element = $compile ( '<div test-dir></div>' ) ( $rootScope ) ;
4531
+ var scope = element . scope ( ) ;
4532
+ expect ( scope . ctrl . getProp ( ) ) . toBe ( 'default' ) ;
4533
+
4534
+ $rootScope . $digest ( ) ;
4535
+ expect ( scope . ctrl . getProp ( ) ) . toBe ( 'default' ) ;
4536
+ } ) ;
4537
+ } ) ;
4538
+
4539
+ it ( 'when creating isolate scope' , function ( ) {
4540
+ module ( function ( $compileProvider ) {
4541
+ $compileProvider . directive ( 'testDir' , valueFn ( {
4542
+ scope : { } ,
4543
+ bindToController : {
4544
+ prop : '@'
4545
+ } ,
4546
+ controller : function ( ) {
4547
+ var self = this ;
4548
+ this . prop = this . prop || 'default' ;
4549
+ this . getProp = function ( ) {
4550
+ return self . prop ;
4551
+ } ;
4552
+ } ,
4553
+ controllerAs : 'ctrl' ,
4554
+ template : '<p></p>'
4555
+ } ) ) ;
4556
+ } ) ;
4557
+ inject ( function ( $compile , $rootScope ) {
4558
+ element = $compile ( '<div test-dir></div>' ) ( $rootScope ) ;
4559
+ var scope = element . isolateScope ( ) ;
4560
+ expect ( scope . ctrl . getProp ( ) ) . toBe ( 'default' ) ;
4561
+
4562
+ $rootScope . $digest ( ) ;
4563
+ expect ( scope . ctrl . getProp ( ) ) . toBe ( 'default' ) ;
4564
+ } ) ;
4565
+ } ) ;
4566
+ } ) ;
4440
4567
} ) ;
4441
4568
4442
4569
0 commit comments