【问题标题】:Angular2 detect router change attempt BEFORE route is changeAngular2在路由更改之前检测路由器更改尝试
【发布时间】:2016-09-01 09:40:15
【问题描述】:

我有延迟加载的组件,当我们从服务器加载组件内容/第三方库等时,我想显示预加载器。

我如何尝试这样做: 创建具有显示/隐藏加载器可能性的组件,我想在有人尝试更改路由(在组件加载之前)时显示它,并在加载组件时隐藏它。

我还想避免为每个组件包含一个加载器服务,并在 ngOnInit 上隐藏加载器(例如)。现在我尝试将它放在顶层(app.js)

但我不知道怎么做,因为

首先:不知道如何正确检测更改路由器和显示加载程序的尝试(现在我让它变得非常丑陋 - 当我们点击导航链接时触发事件......这很糟糕,因为当我尝试导航时编程方法 - 不会显示加载程序)。在路由器渲染新组件之前可能存在某种方法来检测更改?

我看到了:topic 1topic 2 router.subscribe(path => {/hide loader action/})

无法正常工作,因为
1:它在组件渲染后工作并且仅在加载所有组件内容时触发,我想在加载之前显示加载器。 2:当组件被加载并且我们尝试在组件之间导航并返回加载的组件时——这个订阅将立即被触发。所以这意味着在我们返回到一个 laded 组件后,第一个订阅将在此之后被触发 - 加载器将被显示:) 并且永远不会隐藏。我不知道为什么(因为某些组件 router.next 不会被触发并且不会触发取消订阅

这是我的代码

private showPreloader() {
    let a;
    this._loadingService.controlledLoaderShow();

    a = this._router.subscribe((val) => {
      console.log("Hide preloader");
      this._loadingService.controlledLoaderHide();

      a.unsubscribe();
    },
      (err) => {console.log(`Error in app.ts showPrealoder ${err}`)});



  }

【问题讨论】:

    标签: angular router loader


    【解决方案1】:

    我没有为您的目的尝试过,但我认为CanActivate 值得一试。在路由激活之前调用它。

    有关如何将数据传递给共享服务,请参阅https://github.com/angular/angular/issues/4112(这将或已经在 Angulars RC.x 版本的路由器中更改)。

    【讨论】:

    • 你好,冈特!非常感谢您的回答,但您能举一些 CanActivate 的例子吗?因为我看到它并尝试使用它,但它对我不起作用,也许我做错了什么。 @CanActivate((next, previous) => { console.log(next, previous); }) export MyClass ....... 什么都没有显示给我,不是当前路线或上一条路线跨度>
    • Angular2 版本是什么?
    • 它应该在beta.x 中工作,但我无法弄清楚如何在rc.1 中使用它
    • plnkr.co/edit/Bim8OGO7oddxBaa26WzR?p=preview(来自我的回答中链接的问题中的讨论)见src/Parent.ts。他们使用一种变通方法使 DI 在@CanActivate() 中可用。这应该在 rc.1 中得到改进,但如前所述,我还没有弄清楚如何在这里使用它。
    • 感谢您的回答冈特。我会尽力做到这一点。但是我还是不明白我们在is-logged.ts中哪里使用export const isLoggedIn = (to: ComponentInstruction, from: ComponentInstruction, target = ['/Home']) => {这个参数- tofrom 像那些从未使用过的参数一样锁定
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    相关资源
    最近更新 更多