UIRouter 转换挂钩未在 angular 通用中触发

UIRouter transition Hooks not fired in angular universal

当 angular universal 执行时,我在 UI-路由器挂钩中遇到了一个奇怪的行为。

对于在 UI-Router' 状态中声明的钩子(即 onEnteronExit),它们在 angular(在浏览器)和 angular 通用。

但是,例如在 angular 单例服务中监视 TransitionService 钩子,它们只在 angular 中触发(在浏览器上);它们在 angular 通用中被忽略。

这是一个错误还是我遗漏了什么?

我使用的单例服务:

@Injectable()
export class SingletonService {
  constructor(transitionService: TransitionService) {
    transitionService.onEnter({}, this.onEnterStateChange.bind(this));
  }

  private onEnterStateChange(transition: Transition, state?: StateDeclaration): void {
    // something here

    // ✓ called on browser
    // ✗ ignored on universal
  }
}

库版本:

我们找到了问题的根源,这不是bug,而是对通用环境下UIRouter交互的误解。

在server-side渲染过程中,组件渲染是在ui-router完成路由后进行的,在最后删除。在我们的代码中,单例是在 app-module 中提供的,甚至为时已晚;钩子注册得太晚了。

关于这个标志:deferInitialRender: true

解决方案是在一开始就注册并强制创建单例服务,方法是将其注入 app-module 的构造函数中。

希望这对其他人有帮助。