如何在不使用组件的情况下从 angular2 路由重定向到外部 URL?

IT技术 javascript angular angular2-routing
2021-02-04 13:38:19

我想创建一个外部重定向,但为了使所有路由保持一致,我认为在路由器状态配置下执行所有操作(包括外部重定向)会很好。

所以:

const appRoutes: Routes = [
  {path: '', component: HomeComponent},
  {path: 'first', component: FirstComponent},
  {path: 'second', component: SecondComponent},
  {path: 'external-link', /*would like to have redirect here*/}      
];

UPD我不想像@koningdavid建议的那样在这种情况下使用空组件这个解决方案对我来说看起来很奇怪。对于这种情况,没有虚拟组件,它应该很容易实现。

6个回答

您可以使用路由的解析选项通过技巧来实现您想要的。Resolve 是 Angular2 将为要初始化的路由获取的一些数据值。更多详细信息,你可以找到这里的官方文档。

我已经尝试过这种方法,它确实有效。例子:

将此添加到提供程序部分(加上从路由导入所需的类)

@NgModule({
    providers: [
        {
            provide: 'externalUrlRedirectResolver',
            useValue: (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) =>
            {
                window.location.href = (route.data as any).externalUrl;
            }
        }
    ]
})

然后你可以像这样定义你的路线:

{
        path: 'test',
        component: AnyRandomComponent,
        resolve: {
            url: 'externalUrlRedirectResolver'
        },
        data: {
            externalUrl: 'http://www.google.com'
        }
    }

这将重定向到外部 URL。这确实有点像黑客的方式。我试图在不使用组件的情况下实现结果,但您必须使用redirectToorcomponentchildrenor loadChildrenredirectTo不会触发决心,我不确定孩子们,但你可以尝试。

您可以在一个不错的类中实现它,而不是在提供程序中直接实现。文档中的更多信息(参见上面的参考)。

PS 我真的宁愿自己使用重定向组件。只需使用数据的技巧并从路由器获取状态externalUrl即可将其作为参数。

我可以看到 AnyRandomComponent 在重定向之前闪烁。我更喜欢使用 NavigationEnd 事件代替
2021-03-20 13:38:19
也许它有点 hacky,但是这个解决方案适用于 AOT 编译,而 Sam 没有(我试过了)
2021-03-26 13:38:19
state重定向功能中是否有任何需要没有它似乎工作正常。
2021-04-05 13:38:19
还可以考虑使用 CanActivate Router 防护。( stackoverflow.com/a/51059505/111243 ) 这很有用,因此您可以在新窗口中打开并阻止角度导航,多次点击链接,而不显示 AnyRandomComponent。
2021-04-10 13:38:19

您可以创建一个 RedirectGuard:

import {Injectable} from '@angular/core';
import {CanActivate, ActivatedRouteSnapshot, Router, RouterStateSnapshot} from '@angular/router';

@Injectable({
    providedIn: 'root'
})
export class RedirectGuard implements CanActivate {

  constructor(private router: Router) {}

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {

      window.location.href = route.data['externalUrl'];
      return true;

  }
}

在 app.module 中导入:

providers: [RedirectGuard],

并定义您的路线:

{
     path: 'youtube',
     canActivate: [RedirectGuard],
     component: RedirectGuard,
     data: {
       externalUrl: 'https://www.youtube.com/'
     }
 }
可能return false是更合乎逻辑的返回语句?
2021-03-13 13:38:19
太棒了,对我来说很好用。但我想在标题中放置一个不记名令牌,因为我需要它到另一边,谢谢?
2021-03-21 13:38:19
如果 externalUrl 依赖于配置变量怎么办?即 yoursitedev.com 与 yoursitestage.com?你能可靠地导入动态配置变量以在 app.module 中使用吗?
2021-04-02 13:38:19
关于component: RedirectGuard这会导致错误,VM422 vendor.js:75026 ERROR Error: Uncaught (in promise): Error: No component factory found for RedirectGuard Did you add it to @NgModule.entryComponents?所以最好在这里使用真正的组件而不是RedirectGuard
2021-04-02 13:38:19
这实际上比公认的答案要好得多。使用 Guard/CanActivate 意味着您可以取消角度导航。如果您在新窗口中打开外部链接,这很重要,因为您可以多次点击链接,而不必显示空/noop 组件。完整示例:gist.github.com/SimplGy/64f9e64afd4d7af2e6e9befced7878c1
2021-04-06 13:38:19

据我所知,NG2 路由器不支持外部重定向。您可以创建重定向组件作为解决方法。

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'redirect',
  template: 'redirecting...'
})
export class RedirectComponent implements OnInit {
  constructor() { }

  ngOnInit() {
    window.location.href = 'http://www.redirecturl.com'
  }
}

并在您的路由中使用它

{ path: 'login', component: RedirectComponent, pathmath: 'full'},
谢谢,但我不需要使用组件。创建的主要思想没有组件。
2021-04-05 13:38:19
为什么不让它保持一致?您可以通过路由器配置管理所有重定向。你不应该在组件级别关心它。例如:我们像应用程序的状态一样登录,然后将其迁移到另一个应用程序
2021-04-07 13:38:19
@stepan-suvorov Angular 2为单页应用程序提供客户端组件路由器始终重定向到组件是一致的。当您重定向到组件 Angular 路由器时,会将 URL 片段添加到原始 URL,而重定向到外部 URL 将不允许这样做。
2021-04-07 13:38:19
路由器无法从外部重定向。这是没有意义的,因为外部资源实际上不能成为应用程序的状态。
2021-04-08 13:38:19

唔...

我认为您可以简单地请求 URL 而不是调用 ng2 路由器...


例如...

<a href="http://example.com">External</a>

代替

<a routerLink="/someRoute" routerLinkActive="active">External</a>

或者

window.location.href = 'http://www.example.com'

代替

this.router.navigate( [ '/someRoute', 'someParam' ] );

对...?

请阅读问题的这一部分“但要使所有路线保持一致”。我们希望在路由器配置下保留所有 URL/状态更改
2021-04-11 13:38:19

路由器无法从外部重定向。外部资源不能是应用程序的状态。

如果只是为了清楚起见,将所有路由保持在一个位置可见,您可以定义另一个常量数组,其中包含与路由相同的文件中的所有外部路径。