@@ -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,31 @@ 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
+
3579
3621
describe ( 'bind-once' , function ( ) {
3580
3622
3581
3623
function countWatches ( scope ) {
@@ -4437,6 +4479,64 @@ describe('$compile', function() {
4437
4479
childScope . theCtrl . test ( ) ;
4438
4480
} ) ;
4439
4481
} ) ;
4482
+
4483
+ describe ( 'should not overwrite @-bound property each digest when not present' , function ( ) {
4484
+ it ( 'when creating new scope' , function ( ) {
4485
+ module ( function ( $compileProvider ) {
4486
+ $compileProvider . directive ( 'testDir' , valueFn ( {
4487
+ scope : true ,
4488
+ bindToController : {
4489
+ prop : '@'
4490
+ } ,
4491
+ controller : function ( ) {
4492
+ var self = this ;
4493
+ this . prop = this . prop || 'default' ;
4494
+ this . getProp = function ( ) {
4495
+ return self . prop ;
4496
+ } ;
4497
+ } ,
4498
+ controllerAs : 'ctrl' ,
4499
+ template : '<p></p>'
4500
+ } ) ) ;
4501
+ } ) ;
4502
+ inject ( function ( $compile , $rootScope ) {
4503
+ element = $compile ( '<div test-dir></div>' ) ( $rootScope ) ;
4504
+ var scope = element . scope ( ) ;
4505
+ expect ( scope . ctrl . getProp ( ) ) . toBe ( 'default' ) ;
4506
+
4507
+ $rootScope . $digest ( ) ;
4508
+ expect ( scope . ctrl . getProp ( ) ) . toBe ( 'default' ) ;
4509
+ } ) ;
4510
+ } ) ;
4511
+
4512
+ it ( 'when creating isolate scope' , function ( ) {
4513
+ module ( function ( $compileProvider ) {
4514
+ $compileProvider . directive ( 'testDir' , valueFn ( {
4515
+ scope : { } ,
4516
+ bindToController : {
4517
+ prop : '@'
4518
+ } ,
4519
+ controller : function ( ) {
4520
+ var self = this ;
4521
+ this . prop = this . prop || 'default' ;
4522
+ this . getProp = function ( ) {
4523
+ return self . prop ;
4524
+ } ;
4525
+ } ,
4526
+ controllerAs : 'ctrl' ,
4527
+ template : '<p></p>'
4528
+ } ) ) ;
4529
+ } ) ;
4530
+ inject ( function ( $compile , $rootScope ) {
4531
+ element = $compile ( '<div test-dir></div>' ) ( $rootScope ) ;
4532
+ var scope = element . isolateScope ( ) ;
4533
+ expect ( scope . ctrl . getProp ( ) ) . toBe ( 'default' ) ;
4534
+
4535
+ $rootScope . $digest ( ) ;
4536
+ expect ( scope . ctrl . getProp ( ) ) . toBe ( 'default' ) ;
4537
+ } ) ;
4538
+ } ) ;
4539
+ } ) ;
4440
4540
} ) ;
4441
4541
4442
4542
0 commit comments