175175 * by calling the `localFn` as `localFn({amount: 22})`.
176176 *
177177 *
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.
182178 *
183179 * #### `controller`
184180 * Controller constructor function. The controller is instantiated before the
@@ -894,7 +890,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
894890
895891 if ( transcludeControllers ) {
896892 for ( var controllerName in transcludeControllers ) {
897- $linkNode . data ( '$' + controllerName + 'Controller' , transcludeControllers [ controllerName ] . instance ) ;
893+ $linkNode . data ( '$' + controllerName + 'Controller' , transcludeControllers [ controllerName ] ) ;
898894 }
899895 }
900896
@@ -1225,7 +1221,6 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
12251221 var terminalPriority = - Number . MAX_VALUE ,
12261222 newScopeDirective ,
12271223 controllerDirectives = previousCompileContext . controllerDirectives ,
1228- controllers ,
12291224 newIsolateScopeDirective = previousCompileContext . newIsolateScopeDirective ,
12301225 templateDirective = previousCompileContext . templateDirective ,
12311226 nonTlbTranscludeDirective = previousCompileContext . nonTlbTranscludeDirective ,
@@ -1463,9 +1458,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
14631458 value = null ;
14641459
14651460 if ( elementControllers && retrievalMethod === 'data' ) {
1466- if ( value = elementControllers [ require ] ) {
1467- value = value . instance ;
1468- }
1461+ value = elementControllers [ require ] ;
14691462 }
14701463 value = value || $element [ retrievalMethod ] ( '$' + require + 'Controller' ) ;
14711464
@@ -1497,62 +1490,22 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
14971490 attrs = new Attributes ( $element , templateAttrs ) ;
14981491 }
14991492
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-
15381493 if ( newIsolateScopeDirective ) {
15391494 var LOCAL_REGEXP = / ^ \s * ( [ @ = & ] ) ( \? ? ) \s * ( \w * ) \s * $ / ;
15401495
1496+ isolateScope = scope . $new ( true ) ;
1497+
15411498 if ( templateDirective && ( templateDirective === newIsolateScopeDirective ||
15421499 templateDirective === newIsolateScopeDirective . $$originalDirective ) ) {
15431500 $element . data ( '$isolateScope' , isolateScope ) ;
15441501 } else {
15451502 $element . data ( '$isolateScopeNoTemplate' , isolateScope ) ;
15461503 }
15471504
1505+
1506+
15481507 safeAddClass ( $element , 'ng-isolate-scope' ) ;
15491508
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- }
15561509 forEach ( newIsolateScopeDirective . scope , function ( definition , scopeName ) {
15571510 var match = definition . match ( LOCAL_REGEXP ) || [ ] ,
15581511 attrName = match [ 3 ] || scopeName ,
@@ -1573,7 +1526,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
15731526 if ( attrs [ attrName ] ) {
15741527 // If the attribute has been provided then we trigger an interpolation to ensure
15751528 // the value is there for use in the link fn
1576- isolateBindingContext [ scopeName ] = $interpolate ( attrs [ attrName ] ) ( scope ) ;
1529+ isolateScope [ scopeName ] = $interpolate ( attrs [ attrName ] ) ( scope ) ;
15771530 }
15781531 break ;
15791532
@@ -1589,21 +1542,21 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
15891542 }
15901543 parentSet = parentGet . assign || function ( ) {
15911544 // reset the change, or we will throw this exception on every $digest
1592- lastValue = isolateBindingContext [ scopeName ] = parentGet ( scope ) ;
1545+ lastValue = isolateScope [ scopeName ] = parentGet ( scope ) ;
15931546 throw $compileMinErr ( 'nonassign' ,
15941547 "Expression '{0}' used with directive '{1}' is non-assignable!" ,
15951548 attrs [ attrName ] , newIsolateScopeDirective . name ) ;
15961549 } ;
1597- lastValue = isolateBindingContext [ scopeName ] = parentGet ( scope ) ;
1550+ lastValue = isolateScope [ scopeName ] = parentGet ( scope ) ;
15981551 var unwatch = scope . $watch ( $parse ( attrs [ attrName ] , function parentValueWatch ( parentValue ) {
1599- if ( ! compare ( parentValue , isolateBindingContext [ scopeName ] ) ) {
1552+ if ( ! compare ( parentValue , isolateScope [ scopeName ] ) ) {
16001553 // we are out of sync and need to copy
16011554 if ( ! compare ( parentValue , lastValue ) ) {
16021555 // parent changed and it has precedence
1603- isolateBindingContext [ scopeName ] = parentValue ;
1556+ isolateScope [ scopeName ] = parentValue ;
16041557 } else {
16051558 // if the parent can be assigned then do so
1606- parentSet ( scope , parentValue = isolateBindingContext [ scopeName ] ) ;
1559+ parentSet ( scope , parentValue = isolateScope [ scopeName ] ) ;
16071560 }
16081561 }
16091562 return lastValue = parentValue ;
@@ -1613,7 +1566,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
16131566
16141567 case '&' :
16151568 parentGet = $parse ( attrs [ attrName ] ) ;
1616- isolateBindingContext [ scopeName ] = function ( locals ) {
1569+ isolateScope [ scopeName ] = function ( locals ) {
16171570 return parentGet ( scope , locals ) ;
16181571 } ;
16191572 break ;
@@ -1626,11 +1579,37 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
16261579 }
16271580 } ) ;
16281581 }
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+ }
16321612 } ) ;
1633- controllers = null ;
16341613 }
16351614
16361615 // PRELINKING
0 commit comments