我有一个类似的组件:
@Component({
selector: 'app-item',
template: '<p>{{title}}</p>'
})
export class TitleComponent {
@Input() title:string;
}
@Component({
selector: 'app-foo',
template: '<ng-container *ngComponentOutlet="outlet"></ng-container>'
})
export class FooComponent {
outlet = TitleComponent;
}
如何在titleComponent的ng-container上传递输入标题值,或者如何设置此值?
答案 0 :(得分:10)
正如Reno已经提到的那样,您可以使用注入器来注入值。
为了完整起见,这里有一个动态&#34;标题&#34;值:
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 { }
答案 1 :(得分:5)
ngComponentOutlet documentation中显示了一个示例解决方案,特别是@Injectable
的第二个示例,同时也提到了titusfx。
以下是您的用例的样子:
@Injectable()
class Info {
title = 'a little hacky';
}
@Component({
selector: 'app-item',
template: '<p>{{info.title}}</p>'
})
export class TitleComponent {
// @Input() title:string;
constructor(public info: Info){ }
}
@Component({
selector: 'app-foo',
template: '<ng-container *ngComponentOutlet="outlet; injector: myInjector"></ng-container>'
})
export class FooComponent {
outlet = TitleComponent;
myInjector: Injector;
constructor(injector: Injector){
this.myInjector = ReflectiveInjector.resolveAndCreate([Info], injector);
}
}
答案 2 :(得分:0)
考虑使用ng-dynamic-component库来处理动态组件。