fix($compile): throw error when requestng new and isolate scopes (async)
While directives are not allowed to request both a new (normal) and an isolate scope on the same element, the relevant check was not performed correctly when the directive requesting the isolate scope had a lower priority and specified a `templateUrl`. In that case, the check was deferred until the template was fetched, but the info about other directives requesting a new (normal) scope was not properly preserved (in `previousCompileContext`). This commit fixes this, so now an error is thrown (as expected). Fixes #12215 Closes #12217
This commit is contained in:
+2
-1
@@ -1654,7 +1654,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
||||
previousCompileContext = previousCompileContext || {};
|
||||
|
||||
var terminalPriority = -Number.MAX_VALUE,
|
||||
newScopeDirective,
|
||||
newScopeDirective = previousCompileContext.newScopeDirective,
|
||||
controllerDirectives = previousCompileContext.controllerDirectives,
|
||||
newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective,
|
||||
templateDirective = previousCompileContext.templateDirective,
|
||||
@@ -1820,6 +1820,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
||||
nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode,
|
||||
templateAttrs, jqCollection, hasTranscludeDirective && childTranscludeFn, preLinkFns, postLinkFns, {
|
||||
controllerDirectives: controllerDirectives,
|
||||
newScopeDirective: (newScopeDirective !== directive) && newScopeDirective,
|
||||
newIsolateScopeDirective: newIsolateScopeDirective,
|
||||
templateDirective: templateDirective,
|
||||
nonTlbTranscludeDirective: nonTlbTranscludeDirective
|
||||
|
||||
+13
-1
@@ -2370,7 +2370,7 @@ describe('$compile', function() {
|
||||
})
|
||||
);
|
||||
|
||||
it('should not allow more then one isolate scope creation per element', inject(
|
||||
it('should not allow more than one isolate scope creation per element', inject(
|
||||
function($rootScope, $compile) {
|
||||
expect(function() {
|
||||
$compile('<div class="iscope-a; scope-b"></div>');
|
||||
@@ -2379,6 +2379,18 @@ describe('$compile', function() {
|
||||
})
|
||||
);
|
||||
|
||||
it('should not allow more than one isolate/new scope creation per element regardless of `templateUrl`',
|
||||
inject(function($httpBackend) {
|
||||
$httpBackend.expect('GET', 'tiscope.html').respond('<div>Hello, world !</div>');
|
||||
|
||||
expect(function() {
|
||||
compile('<div class="tiscope-a; scope-b"></div>');
|
||||
$httpBackend.flush();
|
||||
}).toThrowMinErr('$compile', 'multidir', 'Multiple directives [scopeB, tiscopeA] ' +
|
||||
'asking for new/isolated scope on: <div class="tiscope-a; scope-b ng-scope">');
|
||||
})
|
||||
);
|
||||
|
||||
it('should not allow more than one isolate scope creation per element regardless of directive priority', function() {
|
||||
module(function($compileProvider) {
|
||||
$compileProvider.directive('highPriorityScope', function() {
|
||||
|
||||
Reference in New Issue
Block a user