首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绕开循环依赖

绕开循环依赖
EN

Stack Overflow用户
提问于 2021-02-07 08:18:45
回答 1查看 120关注 0票数 1

如果组件使用服务,并且服务初始化组件,那么是否有更好的方法来绕过循环依赖关系?我在这里所做的是,由于组件是由服务初始化的,所以我将服务本身注入组件,而不使用角度依赖注入。

工作区服务

代码语言:javascript
复制
@Injectable()
export class WorkspaceService {
  name = "John";
  constructor(
    private cfr: ComponentFactoryResolver,
    private appRef: ApplicationRef,
    private injector: Injector
  ) {
    this.appendWorkspaceToBody();
  }

  private appendWorkspaceToBody(): void {
    const workspaceRef = this.cfr
      .resolveComponentFactory(WorkspaceComponent)
      .create(this.injector);
    workspaceRef.instance.workspaceService = this;

    this.appRef.attachView(workspaceRef.hostView);

    const domElem: HTMLElement = (workspaceRef.hostView as EmbeddedViewRef<any>)
      .rootNodes[0] as HTMLElement;

    document.body.appendChild(domElem);
  }
}

工作区组件

代码语言:javascript
复制
@Component({
  selector: "app-workspace",
  template: "{{workspaceService.name}}"
})
export class WorkspaceComponent implements OnInit {
  public workspaceService: WorkspaceService

  ngOnInit() {}
}

要检查问题代码,请转到stackblitz

EN

回答 1

Stack Overflow用户

发布于 2021-02-07 18:10:57

我为这个问题找到的更好的解决方案是为组件初始化编写一个单独的服务,该服务是通过在APP_INITIALISER中提供的模块执行的。

模块

代码语言:javascript
复制
// @dynamic
@NgModule({
  imports: [BrowserModule, FormsModule],
  declarations: [AppComponent, HelloComponent, WorkspaceComponent],
  bootstrap: [AppComponent],
  providers: [
    WorkspaceService,
    WorkspaceInitializeService,
    {
      provide: APP_INITIALIZER,
      useFactory: (service: WorkspaceInitializeService) => () =>
        service.appendWorkspaceToBody(),
      multi: true,
      deps: [WorkspaceInitializeService]
    }
  ]
})
export class AppModule {}

服务

代码语言:javascript
复制
@Injectable()
export class WorkspaceService {
  name = "John";
  constructor() {
  }
}

Init服务

代码语言:javascript
复制
@Injectable()
export class WorkspaceInitializeService {
  constructor(
    private cfr: ComponentFactoryResolver,
    private injector: Injector
  ) {}
  appendWorkspaceToBody(): void {
    const workspaceRef = this.cfr
      .resolveComponentFactory(WorkspaceComponent)
      .create(this.injector);

    this.injector.get(ApplicationRef).attachView(workspaceRef.hostView);

    const domElem: HTMLElement = (workspaceRef.hostView as EmbeddedViewRef<any>)
      .rootNodes[0] as HTMLElement;

    document.body.appendChild(domElem);
  }
}

要检查解决方案代码,请转到stackblitz

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66085838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档