@@ -2788,10 +2788,6 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
27882788 } ;
27892789 }
27902790
2791- if ( controllerDirectives ) {
2792- elementControllers = setupControllers ( $element , attrs , transcludeFn , controllerDirectives , isolateScope , scope , newIsolateScopeDirective ) ;
2793- }
2794-
27952791 if ( newIsolateScopeDirective ) {
27962792 // Initialize isolate scope bindings for new isolate scope directive.
27972793 compile . $$addScopeInfo ( $element , isolateScope , true , ! ( templateDirective && ( templateDirective === newIsolateScopeDirective ||
@@ -2807,53 +2803,69 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
28072803 }
28082804 }
28092805
2810- // Initialize bindToController bindings
2811- for ( var name in elementControllers ) {
2812- var controllerDirective = controllerDirectives [ name ] ;
2813- var controller = elementControllers [ name ] ;
2814- var bindings = controllerDirective . $$bindings . bindToController ;
2806+ if ( controllerDirectives ) {
2807+ elementControllers = createMap ( ) ;
2808+ for ( var name in controllerDirectives ) {
2809+ var directive = controllerDirectives [ name ] ;
2810+ var locals = {
2811+ $scope : directive === newIsolateScopeDirective || directive . $$isolateScope ? isolateScope : scope ,
2812+ $element : $element ,
2813+ $attrs : attrs ,
2814+ $transclude : transcludeFn
2815+ } ;
28152816
2816- controller . instance = controller ( ) ;
2817- $element . data ( '$' + controllerDirective . name + 'Controller' , controller . instance ) ;
2818- controller . bindingInfo =
2819- initializeDirectiveBindings ( controllerScope , attrs , controller . instance , bindings , controllerDirective ) ;
2820- }
2817+ var controllerConstructor = directive . controller ;
2818+ if ( controllerConstructor === '@' ) {
2819+ controllerConstructor = attrs [ name ] ;
2820+ }
28212821
2822- // Bind the required controllers to the controller, if `require` is an object and `bindToController` is truthy
2823- forEach ( controllerDirectives , function ( controllerDirective , name ) {
2824- var require = controllerDirective . require ;
2825- if ( controllerDirective . bindToController && ! isArray ( require ) && isObject ( require ) ) {
2826- extend ( elementControllers [ name ] . instance , getControllers ( name , require , $element , elementControllers ) ) ;
2822+ var instance = $controller ( controllerConstructor , locals , false , directive . controllerAs ) ;
2823+
2824+ $element . data ( '$' + name + 'Controller' , instance ) ;
2825+
2826+ // Initialize bindToController bindings
2827+ var bindings = directive . $$bindings . bindToController ;
2828+ var bindingInfo = initializeDirectiveBindings ( controllerScope , attrs , instance , bindings , directive ) ;
2829+
2830+ elementControllers [ name ] = { instance : instance , bindingInfo : bindingInfo } ;
28272831 }
2828- } ) ;
28292832
2830- // Handle the init and destroy lifecycle hooks on all controllers that have them
2831- forEach ( elementControllers , function ( controller ) {
2832- var controllerInstance = controller . instance ;
2833- if ( isFunction ( controllerInstance . $onChanges ) ) {
2834- try {
2835- controllerInstance . $onChanges ( controller . bindingInfo . initialChanges ) ;
2836- } catch ( e ) {
2837- $exceptionHandler ( e ) ;
2833+ // Bind the required controllers to the controller, if `require` is an object and `bindToController` is truthy
2834+ forEach ( controllerDirectives , function ( controllerDirective , name ) {
2835+ var require = controllerDirective . require ;
2836+ if ( controllerDirective . bindToController && ! isArray ( require ) && isObject ( require ) ) {
2837+ extend ( elementControllers [ name ] . instance , getControllers ( name , require , $element , elementControllers ) ) ;
28382838 }
2839- }
2840- if ( isFunction ( controllerInstance . $onInit ) ) {
2841- try {
2842- controllerInstance . $onInit ( ) ;
2843- } catch ( e ) {
2844- $exceptionHandler ( e ) ;
2839+ } ) ;
2840+
2841+ // Handle the init and destroy lifecycle hooks on all controllers that have them
2842+ forEach ( elementControllers , function ( controller ) {
2843+ var controllerInstance = controller . instance ;
2844+ if ( isFunction ( controllerInstance . $onChanges ) ) {
2845+ try {
2846+ controllerInstance . $onChanges ( controller . bindingInfo . initialChanges ) ;
2847+ } catch ( e ) {
2848+ $exceptionHandler ( e ) ;
2849+ }
28452850 }
2846- }
2847- if ( isFunction ( controllerInstance . $doCheck ) ) {
2848- controllerScope . $watch ( function ( ) { controllerInstance . $doCheck ( ) ; } ) ;
2849- controllerInstance . $doCheck ( ) ;
2850- }
2851- if ( isFunction ( controllerInstance . $onDestroy ) ) {
2852- controllerScope . $on ( '$destroy' , function callOnDestroyHook ( ) {
2853- controllerInstance . $onDestroy ( ) ;
2854- } ) ;
2855- }
2856- } ) ;
2851+ if ( isFunction ( controllerInstance . $onInit ) ) {
2852+ try {
2853+ controllerInstance . $onInit ( ) ;
2854+ } catch ( e ) {
2855+ $exceptionHandler ( e ) ;
2856+ }
2857+ }
2858+ if ( isFunction ( controllerInstance . $doCheck ) ) {
2859+ controllerScope . $watch ( function ( ) { controllerInstance . $doCheck ( ) ; } ) ;
2860+ controllerInstance . $doCheck ( ) ;
2861+ }
2862+ if ( isFunction ( controllerInstance . $onDestroy ) ) {
2863+ controllerScope . $on ( '$destroy' , function callOnDestroyHook ( ) {
2864+ controllerInstance . $onDestroy ( ) ;
2865+ } ) ;
2866+ }
2867+ } ) ;
2868+ }
28572869
28582870 // PRELINKING
28592871 for ( i = 0 , ii = preLinkFns . length ; i < ii ; i ++ ) {
@@ -2981,34 +2993,6 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
29812993 return value || null ;
29822994 }
29832995
2984- function setupControllers ( $element , attrs , transcludeFn , controllerDirectives , isolateScope , scope , newIsolateScopeDirective ) {
2985- var elementControllers = createMap ( ) ;
2986- for ( var controllerKey in controllerDirectives ) {
2987- var directive = controllerDirectives [ controllerKey ] ;
2988- var locals = {
2989- $scope : directive === newIsolateScopeDirective || directive . $$isolateScope ? isolateScope : scope ,
2990- $element : $element ,
2991- $attrs : attrs ,
2992- $transclude : transcludeFn
2993- } ;
2994-
2995- var controller = directive . controller ;
2996- if ( controller === '@' ) {
2997- controller = attrs [ directive . name ] ;
2998- }
2999-
3000- var controllerInstance = $controller ( controller , locals , true , directive . controllerAs ) ;
3001-
3002- // For directives with element transclusion the element is a comment.
3003- // In this case .data will not attach any data.
3004- // Instead, we save the controllers for the element in a local hash and attach to .data
3005- // later, once we have the actual element.
3006- elementControllers [ directive . name ] = controllerInstance ;
3007- $element . data ( '$' + directive . name + 'Controller' , controllerInstance . instance ) ;
3008- }
3009- return elementControllers ;
3010- }
3011-
30122996 // Depending upon the context in which a directive finds itself it might need to have a new isolated
30132997 // or child scope created. For instance:
30142998 // * if the directive has been pulled into a template because another directive with a higher priority
0 commit comments