175
175
* by calling the `localFn` as `localFn({amount: 22})`.
176
176
*
177
177
*
178
- * #### `bindToController`
179
- * When an isolate scope is used for a component (see above), and `controllerAs` is used, `bindToController` will
180
- * allow a component to have its properties bound to the controller, rather than to scope. When the controller
181
- * is instantiated, the initial values of the isolate scope bindings are already available.
182
178
*
183
179
* #### `controller`
184
180
* Controller constructor function. The controller is instantiated before the
@@ -894,7 +890,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
894
890
895
891
if ( transcludeControllers ) {
896
892
for ( var controllerName in transcludeControllers ) {
897
- $linkNode . data ( '$' + controllerName + 'Controller' , transcludeControllers [ controllerName ] . instance ) ;
893
+ $linkNode . data ( '$' + controllerName + 'Controller' , transcludeControllers [ controllerName ] ) ;
898
894
}
899
895
}
900
896
@@ -1225,7 +1221,6 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
1225
1221
var terminalPriority = - Number . MAX_VALUE ,
1226
1222
newScopeDirective ,
1227
1223
controllerDirectives = previousCompileContext . controllerDirectives ,
1228
- controllers ,
1229
1224
newIsolateScopeDirective = previousCompileContext . newIsolateScopeDirective ,
1230
1225
templateDirective = previousCompileContext . templateDirective ,
1231
1226
nonTlbTranscludeDirective = previousCompileContext . nonTlbTranscludeDirective ,
@@ -1463,9 +1458,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
1463
1458
value = null ;
1464
1459
1465
1460
if ( elementControllers && retrievalMethod === 'data' ) {
1466
- if ( value = elementControllers [ require ] ) {
1467
- value = value . instance ;
1468
- }
1461
+ value = elementControllers [ require ] ;
1469
1462
}
1470
1463
value = value || $element [ retrievalMethod ] ( '$' + require + 'Controller' ) ;
1471
1464
@@ -1497,62 +1490,22 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
1497
1490
attrs = new Attributes ( $element , templateAttrs ) ;
1498
1491
}
1499
1492
1500
- if ( newIsolateScopeDirective ) {
1501
- isolateScope = scope . $new ( true ) ;
1502
- }
1503
-
1504
- transcludeFn = boundTranscludeFn && controllersBoundTransclude ;
1505
- if ( controllerDirectives ) {
1506
- // TODO: merge `controllers` and `elementControllers` into single object.
1507
- controllers = { } ;
1508
- elementControllers = { } ;
1509
- forEach ( controllerDirectives , function ( directive ) {
1510
- var locals = {
1511
- $scope : directive === newIsolateScopeDirective || directive . $$isolateScope ? isolateScope : scope ,
1512
- $element : $element ,
1513
- $attrs : attrs ,
1514
- $transclude : transcludeFn
1515
- } , controllerInstance ;
1516
-
1517
- controller = directive . controller ;
1518
- if ( controller == '@' ) {
1519
- controller = attrs [ directive . name ] ;
1520
- }
1521
-
1522
- controllerInstance = $controller ( controller , locals , true , directive . controllerAs ) ;
1523
-
1524
- // For directives with element transclusion the element is a comment,
1525
- // but jQuery .data doesn't support attaching data to comment nodes as it's hard to
1526
- // clean up (http://bugs.jquery.com/ticket/8335).
1527
- // Instead, we save the controllers for the element in a local hash and attach to .data
1528
- // later, once we have the actual element.
1529
- elementControllers [ directive . name ] = controllerInstance ;
1530
- if ( ! hasElementTranscludeDirective ) {
1531
- $element . data ( '$' + directive . name + 'Controller' , controllerInstance . instance ) ;
1532
- }
1533
-
1534
- controllers [ directive . name ] = controllerInstance ;
1535
- } ) ;
1536
- }
1537
-
1538
1493
if ( newIsolateScopeDirective ) {
1539
1494
var LOCAL_REGEXP = / ^ \s * ( [ @ = & ] ) ( \? ? ) \s * ( \w * ) \s * $ / ;
1540
1495
1496
+ isolateScope = scope . $new ( true ) ;
1497
+
1541
1498
if ( templateDirective && ( templateDirective === newIsolateScopeDirective ||
1542
1499
templateDirective === newIsolateScopeDirective . $$originalDirective ) ) {
1543
1500
$element . data ( '$isolateScope' , isolateScope ) ;
1544
1501
} else {
1545
1502
$element . data ( '$isolateScopeNoTemplate' , isolateScope ) ;
1546
1503
}
1547
1504
1505
+
1506
+
1548
1507
safeAddClass ( $element , 'ng-isolate-scope' ) ;
1549
1508
1550
- var isolateScopeController = controllers && controllers [ newIsolateScopeDirective . name ] ;
1551
- var isolateBindingContext = isolateScope ;
1552
- if ( isolateScopeController && isolateScopeController . identifier &&
1553
- newIsolateScopeDirective . bindToController === true ) {
1554
- isolateBindingContext = isolateScopeController . instance ;
1555
- }
1556
1509
forEach ( newIsolateScopeDirective . scope , function ( definition , scopeName ) {
1557
1510
var match = definition . match ( LOCAL_REGEXP ) || [ ] ,
1558
1511
attrName = match [ 3 ] || scopeName ,
@@ -1573,7 +1526,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
1573
1526
if ( attrs [ attrName ] ) {
1574
1527
// If the attribute has been provided then we trigger an interpolation to ensure
1575
1528
// the value is there for use in the link fn
1576
- isolateBindingContext [ scopeName ] = $interpolate ( attrs [ attrName ] ) ( scope ) ;
1529
+ isolateScope [ scopeName ] = $interpolate ( attrs [ attrName ] ) ( scope ) ;
1577
1530
}
1578
1531
break ;
1579
1532
@@ -1589,21 +1542,21 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
1589
1542
}
1590
1543
parentSet = parentGet . assign || function ( ) {
1591
1544
// reset the change, or we will throw this exception on every $digest
1592
- lastValue = isolateBindingContext [ scopeName ] = parentGet ( scope ) ;
1545
+ lastValue = isolateScope [ scopeName ] = parentGet ( scope ) ;
1593
1546
throw $compileMinErr ( 'nonassign' ,
1594
1547
"Expression '{0}' used with directive '{1}' is non-assignable!" ,
1595
1548
attrs [ attrName ] , newIsolateScopeDirective . name ) ;
1596
1549
} ;
1597
- lastValue = isolateBindingContext [ scopeName ] = parentGet ( scope ) ;
1550
+ lastValue = isolateScope [ scopeName ] = parentGet ( scope ) ;
1598
1551
var unwatch = scope . $watch ( $parse ( attrs [ attrName ] , function parentValueWatch ( parentValue ) {
1599
- if ( ! compare ( parentValue , isolateBindingContext [ scopeName ] ) ) {
1552
+ if ( ! compare ( parentValue , isolateScope [ scopeName ] ) ) {
1600
1553
// we are out of sync and need to copy
1601
1554
if ( ! compare ( parentValue , lastValue ) ) {
1602
1555
// parent changed and it has precedence
1603
- isolateBindingContext [ scopeName ] = parentValue ;
1556
+ isolateScope [ scopeName ] = parentValue ;
1604
1557
} else {
1605
1558
// if the parent can be assigned then do so
1606
- parentSet ( scope , parentValue = isolateBindingContext [ scopeName ] ) ;
1559
+ parentSet ( scope , parentValue = isolateScope [ scopeName ] ) ;
1607
1560
}
1608
1561
}
1609
1562
return lastValue = parentValue ;
@@ -1613,7 +1566,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
1613
1566
1614
1567
case '&' :
1615
1568
parentGet = $parse ( attrs [ attrName ] ) ;
1616
- isolateBindingContext [ scopeName ] = function ( locals ) {
1569
+ isolateScope [ scopeName ] = function ( locals ) {
1617
1570
return parentGet ( scope , locals ) ;
1618
1571
} ;
1619
1572
break ;
@@ -1626,11 +1579,37 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
1626
1579
}
1627
1580
} ) ;
1628
1581
}
1629
- if ( controllers ) {
1630
- forEach ( controllers , function ( controller ) {
1631
- controller ( ) ;
1582
+ transcludeFn = boundTranscludeFn && controllersBoundTransclude ;
1583
+ if ( controllerDirectives ) {
1584
+ elementControllers = { } ;
1585
+ forEach ( controllerDirectives , function ( directive ) {
1586
+ var locals = {
1587
+ $scope : directive === newIsolateScopeDirective || directive . $$isolateScope ? isolateScope : scope ,
1588
+ $element : $element ,
1589
+ $attrs : attrs ,
1590
+ $transclude : transcludeFn
1591
+ } , controllerInstance ;
1592
+
1593
+ controller = directive . controller ;
1594
+ if ( controller == '@' ) {
1595
+ controller = attrs [ directive . name ] ;
1596
+ }
1597
+
1598
+ controllerInstance = $controller ( controller , locals ) ;
1599
+ // For directives with element transclusion the element is a comment,
1600
+ // but jQuery .data doesn't support attaching data to comment nodes as it's hard to
1601
+ // clean up (http://bugs.jquery.com/ticket/8335).
1602
+ // Instead, we save the controllers for the element in a local hash and attach to .data
1603
+ // later, once we have the actual element.
1604
+ elementControllers [ directive . name ] = controllerInstance ;
1605
+ if ( ! hasElementTranscludeDirective ) {
1606
+ $element . data ( '$' + directive . name + 'Controller' , controllerInstance ) ;
1607
+ }
1608
+
1609
+ if ( directive . controllerAs ) {
1610
+ locals . $scope [ directive . controllerAs ] = controllerInstance ;
1611
+ }
1632
1612
} ) ;
1633
- controllers = null ;
1634
1613
}
1635
1614
1636
1615
// PRELINKING
0 commit comments