mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-03-16 23:30:23 +00:00
fix(ngTransclude): detect ngTranslude usage without a transclusion directive
Closes #3759
This commit is contained in:
parent
742271ffa3
commit
5a1a6b86a8
3 changed files with 37 additions and 1 deletions
12
docs/content/error/ngTransclude/orphan.ngdoc
Normal file
12
docs/content/error/ngTransclude/orphan.ngdoc
Normal file
|
|
@ -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.
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
Loading…
Reference in a new issue