Skip to content

Dependency Injection not working for Components/Directives inherited from Angular2 Components/Directives. #8700

@sergeykhomyuk

Description

@sergeykhomyuk

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

  1. Define DatePicker directive inherited from DefaultValueAccessor.
  2. Add any additional parameter to DatePicker constructor (e.g. logger: Logger).
  3. Compile source code with TypeScript Compiler.
  4. 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.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions