diff options
| author | jankuca | 2013-08-08 16:04:11 -0700 | 
|---|---|---|
| committer | Igor Minar | 2013-08-08 22:58:51 -0700 | 
| commit | 9c51d503188efae14b81bd4d6dd7d5a3363f050f (patch) | |
| tree | ade744f2afbc0720302938ce87966097bcb735c6 | |
| parent | 1c3a46adda358df21e6383113e0ddc499f2cac0c (diff) | |
| download | angular.js-9c51d503188efae14b81bd4d6dd7d5a3363f050f.tar.bz2 | |
fix($compile): always instantiate controllers before pre-link fns run
Controllers should be always instantiated after compile fn runs, but before
pre-link fn runs. This way, controllers are available to pre-link fns that
request them.
Previously this was broken for async directives (directives with templateUrl).
Closes #3493
Closes #3482
Closes #3514
| -rw-r--r-- | src/ng/compile.js | 16 | ||||
| -rwxr-xr-x | test/ng/compileSpec.js | 64 | 
2 files changed, 72 insertions, 8 deletions
| diff --git a/src/ng/compile.js b/src/ng/compile.js index 04689268..8b7a7674 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -621,13 +621,6 @@ function $CompileProvider($provide) {          directiveName = directive.name; -        if (directiveValue = directive.controller) { -          controllerDirectives = controllerDirectives || {}; -          assertNoDuplicate("'" + directiveName + "' controller", -              controllerDirectives[directiveName], directive, $compileNode); -          controllerDirectives[directiveName] = directive; -        } -          if (directiveValue = directive.transclude) {            assertNoDuplicate('transclusion', transcludeDirective, directive, $compileNode);            transcludeDirective = directive; @@ -705,6 +698,13 @@ function $CompileProvider($provide) {            }          } +        if (!directive.templateUrl && directive.controller) { +          controllerDirectives = controllerDirectives || {}; +          assertNoDuplicate("'" + directiveName + "' controller", +              controllerDirectives[directiveName], directive, $compileNode); +          controllerDirectives[directiveName] = directive; +        } +          if (directive.terminal) {            nodeLinkFn.terminal = true;            terminalPriority = Math.max(terminalPriority, directive.priority); @@ -962,7 +962,7 @@ function $CompileProvider($provide) {            origAsyncDirective = directives.shift(),            // The fact that we have to copy and patch the directive seems wrong!            derivedSyncDirective = extend({}, origAsyncDirective, { -            controller: null, templateUrl: null, transclude: null, scope: null +            templateUrl: null, transclude: null, scope: null            });        $compileNode.html(''); diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 12b51fb4..93fe6ced 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -2305,6 +2305,70 @@ describe('$compile', function() {          expect(element.text()).toBe('parentTemplateText;childTemplateText;childContentText;babyTemplateText;')        });      }); + + +    it('should allow controller usage in pre-link directive functions with templateUrl', function () { +      module(function () { +        var Ctrl = function (log) { +          log('instance'); +        }; + +        directive('myDirective', function () { +          return { +            scope: true, +            templateUrl: 'hello.html', +            controller: Ctrl, +            compile: function () { +              return { +                pre: function (scope, template, attr, ctrl) {}, +                post: function () {} +              }; +            } +          }; +        }); +      }); + +      inject(function ($templateCache, $compile, $rootScope, log) { +        $templateCache.put('hello.html', '<p>Hello</p>'); + +        element = $compile('<div my-directive></div>')($rootScope); +        $rootScope.$apply(); + +        expect(log).toEqual('instance'); +        expect(element.text()).toBe('Hello'); +      }); +    }); + + +    it('should allow controller usage in pre-link directive functions with a template', function () { +      module(function () { +        var Ctrl = function (log) { +          log('instance'); +        }; + +        directive('myDirective', function () { +          return { +            scope: true, +            template: '<p>Hello</p>', +            controller: Ctrl, +            compile: function () { +              return { +                pre: function (scope, template, attr, ctrl) {}, +                post: function () {} +              }; +            } +          }; +        }); +      }); + +      inject(function ($templateCache, $compile, $rootScope, log) { +        element = $compile('<div my-directive></div>')($rootScope); +        $rootScope.$apply(); + +        expect(log).toEqual('instance'); +        expect(element.text()).toBe('Hello'); +      }); +    });    }); | 
