mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-05-03 20:54:43 +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({
|
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
|
// 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
|
// 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
|
// 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)',
|
it('should make the result of a transclusion available to the parent directive in post-linking phase (template)',
|
||||||
function() {
|
function() {
|
||||||
module(function() {
|
module(function() {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue