我在角度2中建立模态服务。我解决了大多数问题但是我有问题将模态组件以一种很好的角度方式放置在body元素中。我使用DynamicComponentLoader.loadNextToLocation
函数来获取模态组件,并将其放在ElementRef
函数中使用的DynamicComponentLoader.loadNextToLocation
旁边。但是当我不想将创建的模态放在某个组件中时,我必须操纵DOM来插入创建的模态。我的问题是我可以在模态服务中使用我的应用程序中的根元素吗?我希望在特定元素不作为模态的容器提供时实现这一点。
var elementRef = DOM.query('app');
this.componentLoader.loadNextToLocation(ModalBackdrop, elementRef, backdropBindings)
答案 0 :(得分:6)
要获取对根组件的引用,可以注入ApplicationRef:
constructor(private app:ApplicationRef)
{
let element: ElementRef = this._app['_rootComponents'][0].location;
}
答案 1 :(得分:5)
appElementRef: ElementRef;
constructor(private applicationRef:ApplicationRef, injector: Injector) {
this.appElementRef = injector.get(applicationRef.componentTypes[0]).elementRef;
}
AppComponent
需要提供返回elementRef
的{{1}}字段。
答案 2 :(得分:1)
问题是要获取根ElementRef,应该引导您的应用程序。在某些情况下(在服务中获取ElementRef)我们应该等待。 我的解决方案:
import {Injectable, ApplicationRef, ElementRef} from 'angular2/core';
@Injectable()
export class SomeService {
private _appElementRef: ElementRef;
constructor(appRef: ApplicationRef) {
appRef.registerBootstrapListener(appComponentRef => {
this._appElementRef = appComponentRef.location;
});
}
}
答案 3 :(得分:1)
这适用于Angular 5.2.9
在根组件的构造函数中添加一个公共ElementRef:
export class AppComponent {
constructor (public eltRef: ElementRef) { }
在要访问root的组件中,执行以下操作:
private rootRef: ElementRef;
constructor(private appRef: ApplicationRef) {
this.rootRef = (this.appRef.components[0].instance as AppComponent).eltRef;
}
答案 4 :(得分:0)
可用的答案对我不起作用:
在我的情况下,我正在开发一个第三方库,因此我无法做出任何假设,称其根名为 AppComponent 或已注入 ElementRef 。这就是对我有用的(Angular 6.1)
private readonly rootRef: ElementRef;
constructor(private appRef: ApplicationRef) {
this.rootRef = appRef.components[0].injector.get(ElementRef);
}