延迟加载:可观察的未订阅

one*_*dkr 4 lazy-loading rxjs angular

在我的Angular App中,我有一个父组件:

console.component.html

<div class="main">
  <ibe-snackbar></ibe-snackbar>
  <router-outlet></router-outlet>
</div>
Run Code Online (Sandbox Code Playgroud)

routler-outlet可以加载两个子组件。一个被热切加载,另一个被延迟加载。这是路线文件

console.component.routes

const ConsoleRoutes: Routes = [
  { path: 'console', component: ConsoleComponent, data: {context : CONSOLE_CONTEXT},
    children: [
      { path: "projects", component: ProjectsListComponent, data : {context : PROJECT_CONTEXT}}, --> Loaded eagerly
      { path: "projects/:projectId/users", loadChildren: "./users/users.module#UsersModule" }, ---> Loaded laziness
      { path: '', redirectTo: "projects", pathMatch: "full" },
    ]
  }
];

export const ConsoleRouting: ModuleWithProviders = RouterModule.forChild(ConsoleRoutes);
Run Code Online (Sandbox Code Playgroud)

快餐栏组件将初始化一个可观察对象,该对象将在调用时在组件上显示一条消息。

Snackbar.service.ts

export class SnackbarService {
  private subject = new Subject<any>();
  constructor() { }

  showSnackbar(message, type) {
    // Treatment
    this.subject.next(snackbarInfos);
  }

  getSnackbarObservable(): Observable<any> {
    return this.subject.asObservable();
  }
}
Run Code Online (Sandbox Code Playgroud)

sanckbar.component.ts

export class SnackbarComponent implements OnInit {

  constructor(private snackbarService: SnackbarService, private translate: TranslateService) { }

  ngOnInit() {
    this.snackbarService.getSnackbarObservable()
    .subscribe(snackbar => {
      this.snackbar = snackbar;
      this.display();
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,子组件调用小吃店服务,该服务将信息发送到可观察对象。

我注意到当我的子组件加载延迟加载时,snackbar.component.ts中的可观察变量初始化从未被订阅(从未调用)。

但是,当子组件早已加载时,它可以完美工作

您知道为什么不调用RxJS observable吗?

Fan*_*ung 5

我怀疑这是因为延迟加载的模块具有自己的单例服务范围,这意味着您的SnackbarService有两个实例。尝试将服务移至最高级别的模块(例如应用模块),看看是否可以解决问题。