As Reno has already mentioned, you can use an injector to inject values.
For the sake of completeness, here is an example with a dynamic "title" value:
export const TITLE = new InjectionToken<string>('app.title');
@Component({
selector: 'app-item',
template: '<p>{{title}}</p>'
})
export class TitleComponent implements OnInit {
@Input() title:string;
constructor(@Inject(TITLE) private titleInjected: string){
}
ngOnInit() {
this.title = this.title || this.titleInjected;
}
}
@Component({
selector: 'app-foo',
template: '<ng-container *ngComponentOutlet="outlet; injector: myInjector"></ng-container>'
})
export class FooComponent {
outlet = TitleComponent;
myInjector: Injector;
constructor(injector: Injector){
let title = 'My dynamic title works!';
this.myInjector = ReflectiveInjector.resolveAndCreate([{ provide: TITLE, useValue: title }], injector);
}
}
@NgModule({
providers: [
{ provide: TITLE, useValue: '' }
]
})
export class AppModule { }