diff options
| author | jankuca | 2013-08-08 16:04:11 -0700 |
|---|---|---|
| committer | Igor Minar | 2013-08-08 21:53:44 -0700 |
| commit | 5c560117425e7b3f7270389274476e843d6f69ec (patch) | |
| tree | d48608d5b668aff0e866dbcf501176f4c5519d29 | |
| parent | 4175377aaff9401f8b6c6f62ece71706ecb7f4ce (diff) | |
| download | angular.js-5c560117425e7b3f7270389274476e843d6f69ec.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 25d48313..39d3338f 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -782,13 +782,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; @@ -877,6 +870,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); @@ -1157,7 +1157,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, replace: null + templateUrl: null, transclude: null, scope: null, replace: null }), templateUrl = (isFunction(origAsyncDirective.templateUrl)) ? origAsyncDirective.templateUrl($compileNode, tAttrs) diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 7525806c..36a8b990 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -2502,6 +2502,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'); + }); + }); }); |
