Skip to content

Commit b4de9ed

Browse files
committed
feat($compile): show module name during multidir error
Code cleanup as angular team suggested. Closes angular#11775
1 parent 817091b commit b4de9ed

File tree

3 files changed

+86
-26
lines changed

3 files changed

+86
-26
lines changed

src/auto/injector.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -846,7 +846,7 @@ function createInjector(modulesToLoad, strictDi) {
846846
has: function(name) {
847847
return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name);
848848
},
849-
_namedModulesLoaded: namedModulesLoaded
849+
$$namedModulesLoaded: namedModulesLoaded
850850
};
851851
}
852852
}

src/ng/compile.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -2304,7 +2304,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
23042304
function getModuleNameByDirectiveName(directive) {
23052305
var moduleName = '';
23062306

2307-
forEach($injector._namedModulesLoaded, function(loadedModuleName) {
2307+
forEach($injector.$$namedModulesLoaded, function(loadedModuleName) {
23082308
var loadedModule = angularModule(loadedModuleName);
23092309
forEach(loadedModule._invokeQueue, function(invokeItem) {
23102310
var invocationParams = invokeItem[2];

test/ng/compileSpec.js

+84-24
Original file line numberDiff line numberDiff line change
@@ -2127,11 +2127,9 @@ describe('$compile', function() {
21272127
describe('scope', function() {
21282128
var iscope;
21292129

2130-
var fakeScopeMdl = angular.module('fakeScopeMdl', []);
2131-
2132-
forEach(['', 'a', 'b'], function(name) {
2133-
fakeScopeMdl
2134-
.directive('scope' + uppercase(name), function(log) {
2130+
beforeEach(module(function() {
2131+
forEach(['', 'a', 'b'], function(name) {
2132+
directive('scope' + uppercase(name), function(log) {
21352133
return {
21362134
scope: true,
21372135
restrict: 'CA',
@@ -2142,8 +2140,8 @@ describe('$compile', function() {
21422140
}};
21432141
}
21442142
};
2145-
})
2146-
.directive('iscope' + uppercase(name), function(log) {
2143+
});
2144+
directive('iscope' + uppercase(name), function(log) {
21472145
return {
21482146
scope: {},
21492147
restrict: 'CA',
@@ -2155,8 +2153,8 @@ describe('$compile', function() {
21552153
};
21562154
}
21572155
};
2158-
})
2159-
.directive('tscope' + uppercase(name), function(log) {
2156+
});
2157+
directive('tscope' + uppercase(name), function(log) {
21602158
return {
21612159
scope: true,
21622160
restrict: 'CA',
@@ -2168,8 +2166,8 @@ describe('$compile', function() {
21682166
};
21692167
}
21702168
};
2171-
})
2172-
.directive('stscope' + uppercase(name), function(log) {
2169+
});
2170+
directive('stscope' + uppercase(name), function(log) {
21732171
return {
21742172
scope: true,
21752173
restrict: 'CA',
@@ -2181,8 +2179,8 @@ describe('$compile', function() {
21812179
};
21822180
}
21832181
};
2184-
})
2185-
.directive('trscope' + uppercase(name), function(log) {
2182+
});
2183+
directive('trscope' + uppercase(name), function(log) {
21862184
return {
21872185
scope: true,
21882186
replace: true,
@@ -2195,8 +2193,8 @@ describe('$compile', function() {
21952193
};
21962194
}
21972195
};
2198-
})
2199-
.directive('tiscope' + uppercase(name), function(log) {
2196+
});
2197+
directive('tiscope' + uppercase(name), function(log) {
22002198
return {
22012199
scope: {},
22022200
restrict: 'CA',
@@ -2209,8 +2207,8 @@ describe('$compile', function() {
22092207
};
22102208
}
22112209
};
2212-
})
2213-
.directive('stiscope' + uppercase(name), function(log) {
2210+
});
2211+
directive('stiscope' + uppercase(name), function(log) {
22142212
return {
22152213
scope: {},
22162214
restrict: 'CA',
@@ -2224,19 +2222,17 @@ describe('$compile', function() {
22242222
}
22252223
};
22262224
});
2227-
});
2228-
2229-
fakeScopeMdl
2230-
.directive('log', function(log) {
2225+
});
2226+
directive('log', function(log) {
22312227
return {
22322228
restrict: 'CA',
22332229
link: {pre: function(scope) {
22342230
log('log-' + scope.$id + '-' + (scope.$parent && scope.$parent.$id || 'no-parent'));
22352231
}}
22362232
};
22372233
});
2234+
}));
22382235

2239-
beforeEach(module('fakeScopeMdl'));
22402236

22412237
it('should allow creation of new scopes', inject(function($rootScope, $compile, log) {
22422238
element = $compile('<div><span scope><a log></a></span></div>')($rootScope);
@@ -2339,7 +2335,7 @@ describe('$compile', function() {
23392335
function($rootScope, $compile) {
23402336
expect(function() {
23412337
$compile('<div class="iscope-a; scope-b"></div>');
2342-
}).toThrowMinErr('$compile', 'multidir', 'Multiple directives [iscopeA (module: fakeScopeMdl), scopeB (module: fakeScopeMdl)] asking for new/isolated scope on: ' +
2338+
}).toThrowMinErr('$compile', 'multidir', 'Multiple directives [iscopeA, scopeB] asking for new/isolated scope on: ' +
23432339
'<div class="iscope-a; scope-b">');
23442340
})
23452341
);
@@ -2358,7 +2354,7 @@ describe('$compile', function() {
23582354
inject(function($compile) {
23592355
expect(function() {
23602356
$compile('<div class="iscope-a; high-priority-scope"></div>');
2361-
}).toThrowMinErr('$compile', 'multidir', 'Multiple directives [highPriorityScope, iscopeA (module: fakeScopeMdl)] asking for new/isolated scope on: ' +
2357+
}).toThrowMinErr('$compile', 'multidir', 'Multiple directives [highPriorityScope, iscopeA] asking for new/isolated scope on: ' +
23622358
'<div class="iscope-a; high-priority-scope">');
23632359
});
23642360
});
@@ -2518,6 +2514,70 @@ describe('$compile', function() {
25182514
);
25192515
});
25202516
});
2517+
2518+
describe('multidir isolated scope error messages', function() {
2519+
angular.module('fakeIsoledScopeModule', [])
2520+
.directive('fakeScope', function(log) {
2521+
return {
2522+
scope: true,
2523+
restrict: 'CA',
2524+
compile: function() {
2525+
return {pre: function(scope, element) {
2526+
log(scope.$id);
2527+
expect(element.data('$scope')).toBe(scope);
2528+
}};
2529+
}
2530+
};
2531+
})
2532+
.directive('fakeIScope', function(log) {
2533+
return {
2534+
scope: {},
2535+
restrict: 'CA',
2536+
compile: function() {
2537+
return function(scope, element) {
2538+
iscope = scope;
2539+
log(scope.$id);
2540+
expect(element.data('$isolateScopeNoTemplate')).toBe(scope);
2541+
};
2542+
}
2543+
};
2544+
});
2545+
2546+
beforeEach(module('fakeIsoledScopeModule', function() {
2547+
directive('anonymModuleScopeDirective', function(log) {
2548+
return {
2549+
scope: true,
2550+
restrict: 'CA',
2551+
compile: function() {
2552+
return {pre: function(scope, element) {
2553+
log(scope.$id);
2554+
expect(element.data('$scope')).toBe(scope);
2555+
}};
2556+
}
2557+
};
2558+
});
2559+
}));
2560+
2561+
it('should add module name to multidir isolated scope message if directive defined through module', inject(
2562+
function($rootScope, $compile) {
2563+
expect(function() {
2564+
$compile('<div class="fake-scope; fake-i-scope"></div>');
2565+
}).toThrowMinErr('$compile', 'multidir',
2566+
'Multiple directives [fakeIScope (module: fakeIsoledScopeModule), fakeScope (module: fakeIsoledScopeModule)] ' +
2567+
'asking for new/isolated scope on: <div class="fake-scope; fake-i-scope">');
2568+
})
2569+
);
2570+
2571+
it('sholdn\'t add module name to multidir isolated scope message if directive is defined directly with $compileProvider', inject(
2572+
function($rootScope, $compile) {
2573+
expect(function() {
2574+
$compile('<div class="anonym-module-scope-directive; fake-i-scope"></div>');
2575+
}).toThrowMinErr('$compile', 'multidir',
2576+
'Multiple directives [anonymModuleScopeDirective, fakeIScope (module: fakeIsoledScopeModule)] ' +
2577+
'asking for new/isolated scope on: <div class="anonym-module-scope-directive; fake-i-scope">');
2578+
})
2579+
);
2580+
});
25212581
});
25222582
});
25232583
});

0 commit comments

Comments
 (0)