fix(core): allow module providers to overwrite providers from ModuleWithProviders
Fixes #10313 Closes #10317
This commit is contained in:
parent
367f0fd142
commit
553344739c
@ -210,18 +210,6 @@ export class CompileMetadataResolver {
|
|||||||
const entryComponents: cpl.CompileTypeMetadata[] = [];
|
const entryComponents: cpl.CompileTypeMetadata[] = [];
|
||||||
const schemas: SchemaMetadata[] = [];
|
const schemas: SchemaMetadata[] = [];
|
||||||
|
|
||||||
if (meta.providers) {
|
|
||||||
providers.push(...this.getProvidersMetadata(meta.providers, entryComponents));
|
|
||||||
}
|
|
||||||
if (meta.entryComponents) {
|
|
||||||
entryComponents.push(
|
|
||||||
...flattenArray(meta.entryComponents)
|
|
||||||
.map(type => this.getTypeMetadata(type, staticTypeModuleUrl(type))));
|
|
||||||
}
|
|
||||||
if (meta.schemas) {
|
|
||||||
schemas.push(...flattenArray(meta.schemas));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (meta.imports) {
|
if (meta.imports) {
|
||||||
flattenArray(meta.imports).forEach((importedType) => {
|
flattenArray(meta.imports).forEach((importedType) => {
|
||||||
let importedModuleType: Type;
|
let importedModuleType: Type;
|
||||||
@ -295,6 +283,20 @@ export class CompileMetadataResolver {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The providers of the module have to go last
|
||||||
|
// so that they overwrite any other provider we already added.
|
||||||
|
if (meta.providers) {
|
||||||
|
providers.push(...this.getProvidersMetadata(meta.providers, entryComponents));
|
||||||
|
}
|
||||||
|
if (meta.entryComponents) {
|
||||||
|
entryComponents.push(
|
||||||
|
...flattenArray(meta.entryComponents)
|
||||||
|
.map(type => this.getTypeMetadata(type, staticTypeModuleUrl(type))));
|
||||||
|
}
|
||||||
|
if (meta.schemas) {
|
||||||
|
schemas.push(...flattenArray(meta.schemas));
|
||||||
|
}
|
||||||
|
|
||||||
transitiveModule.entryComponents.push(...entryComponents);
|
transitiveModule.entryComponents.push(...entryComponents);
|
||||||
transitiveModule.providers.push(...providers);
|
transitiveModule.providers.push(...providers);
|
||||||
|
|
||||||
|
@ -960,6 +960,24 @@ function declareTests({useJit}: {useJit: boolean}) {
|
|||||||
expect(injector.get('token1')).toBe('direct');
|
expect(injector.get('token1')).toBe('direct');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should overwrite the providers of imported ModuleWithProviders', () => {
|
||||||
|
@NgModule()
|
||||||
|
class ImportedModule {
|
||||||
|
}
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
providers: [{provide: 'token1', useValue: 'direct'}],
|
||||||
|
imports: [
|
||||||
|
{ngModule: ImportedModule, providers: [{provide: 'token1', useValue: 'imported'}]}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
class SomeModule {
|
||||||
|
}
|
||||||
|
|
||||||
|
const injector = createModule(SomeModule).injector;
|
||||||
|
expect(injector.get('token1')).toBe('direct');
|
||||||
|
});
|
||||||
|
|
||||||
it('should overwrite the providers of imported modules on the second import level', () => {
|
it('should overwrite the providers of imported modules on the second import level', () => {
|
||||||
@NgModule({providers: [{provide: 'token1', useValue: 'imported'}]})
|
@NgModule({providers: [{provide: 'token1', useValue: 'imported'}]})
|
||||||
class ImportedModuleLevel2 {
|
class ImportedModuleLevel2 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user