diff options
| author | jankuca | 2013-09-25 16:37:59 -0700 |
|---|---|---|
| committer | Brian Ford | 2013-09-30 16:44:19 -0700 |
| commit | 5a1a6b86a8dbcd8aa4fe9c59fad8d005eead686c (patch) | |
| tree | 451269b873ad3a603dcc414b6bcc637ff9c89bd1 | |
| parent | 742271ffa3a518d9e8ef2cb97c24b45b44e3378d (diff) | |
| download | angular.js-5a1a6b86a8dbcd8aa4fe9c59fad8d005eead686c.tar.bz2 | |
fix(ngTransclude): detect ngTranslude usage without a transclusion directive
Closes #3759
| -rw-r--r-- | docs/content/error/ngTransclude/orphan.ngdoc | 12 | ||||
| -rw-r--r-- | src/ng/directive/ngTransclude.js | 10 | ||||
| -rwxr-xr-x | test/ng/compileSpec.js | 16 |
3 files changed, 37 insertions, 1 deletions
diff --git a/docs/content/error/ngTransclude/orphan.ngdoc b/docs/content/error/ngTransclude/orphan.ngdoc new file mode 100644 index 00000000..5ac25432 --- /dev/null +++ b/docs/content/error/ngTransclude/orphan.ngdoc @@ -0,0 +1,12 @@ +@ngdoc error +@name ngTransclude:orphan +@fullName Orphan ngTransclude Directive +@description + +Occurs when an `ngTransclude` occurs without a transcluded ancesstor element. + +This error often occurs when you have forgotten to set `transclude: true` in some directive definition, and then used `ngTranslude` in the driective's template. + +To resolve, either remove the offending `ngTransclude` or check that `transclude: true` is included in the intended directive definition. + +Consult the API documentation for {@link guide/directive writing directives} to learn more. diff --git a/src/ng/directive/ngTransclude.js b/src/ng/directive/ngTransclude.js index d7c9cd44..490ea21f 100644 --- a/src/ng/directive/ngTransclude.js +++ b/src/ng/directive/ngTransclude.js @@ -52,7 +52,15 @@ * */ var ngTranscludeDirective = ngDirective({ - controller: ['$transclude', function($transclude) { + controller: ['$element', '$transclude', function($element, $transclude) { + if (!$transclude) { + throw minErr('ngTransclude')('orphan', + 'Illegal use of ngTransclude directive in the template! ' + + 'No parent directive that requires a transclusion found. ' + + 'Element: {0}', + startingTag($element)); + } + // remember the transclusion fn but call it during linking so that we don't process transclusion before directives on // the parent element even when the transclusion replaces the current element. (we can't use priority here because // that applies only to compile fns and not controllers diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index c6ba5480..580d51c3 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -2834,6 +2834,22 @@ describe('$compile', function() { }); + it('should throw on an ng-translude element inside no transclusion directive', function() { + inject(function ($rootScope, $compile) { + // we need to do this because different browsers print empty attributres differently + try { + $compile('<div><div ng-transclude></div></div>')($rootScope); + } catch(e) { + expect(e.message).toMatch(new RegExp( + '^\\\[ngTransclude:orphan\\\] ' + + 'Illegal use of ngTransclude directive in the template! ' + + 'No parent directive that requires a transclusion found\. ' + + 'Element: <div ng-transclude.+')); + } + }); + }); + + it('should make the result of a transclusion available to the parent directive in post-linking phase (template)', function() { module(function() { |
