-
Notifications
You must be signed in to change notification settings - Fork 26.5k
Description
Dependency Injection not working for Components/Directives inherited from Angular2 Components/Directives if using TypeScript Compiler instead of Angular Template Compiler.
Steps to reproduce and a minimal demo of the problem
- Define DatePicker directive inherited from DefaultValueAccessor.
- Add any additional parameter to DatePicker constructor (e.g.
logger: Logger
). - Compile source code with TypeScript Compiler.
- Run application.
@Injectable()
class Logger {}
@Directive({
selector: '[datePicker]'
})
class DatePicker extends DefaultValueAccessor {
constructor(renderer: Renderer, element: ElementRef, logger: Logger) {
super(renderer, element);
if (!logger) {
console.error('Logger is undefined');
} else {
console.info('Logger is defined');
}
}
}
Minimal demo: http://plnkr.co/edit/UIybCDlayhXRO7x0Y7Lk?p=preview
Current behavior
DatePicker resolved using ctorParameters from DefaultValueAccessor (renderer, element) instead of metadata from DatePicker constructor (renderer, element, logger).
(see ReflectionCapabilities.parameters(typeOrFunc: Type): any[][]
implementation for details)
Expected/desired behavior
DatePicker resolved using parameters from its constructor metadata (renderer, element, logger).
Other information
Current implementation of ReflectionCapabilities.parameters(typeOrFunc: Type): any[][]
work properly only if code was compiled using Angular Template Compiler, otherwise it will never check metadata, because ctorParameters decorator data inherited from parent hides it.