如何在Angular中的同一模块上重定向

Posted

技术标签:

【中文标题】如何在Angular中的同一模块上重定向【英文标题】:How to redirect on the same module in the Angular 【发布时间】:2022-01-24 02:58:49 【问题描述】:

我需要 3 个组件在同一路由上(例如,我有 /registration 路由;在 /registration 路由上我需要 firstStepRegistrationComponent、secondStepRegistrationComponent、thirdStepRegistrationComponent)。我为每个模块创建了一个模块。我跟着这个教程https://medium.com/@german.quinteros/angular-use-the-same-route-path-for-different-modules-or-components-11db75cac455

下一步-handler.module.ts

import  NgModule  from '@angular/core';
import  CommonModule  from '@angular/common';
import  RouterModule, ROUTES, Routes  from '@angular/router';
import  NextStepService  from '../service/next-step.service';

@NgModule(
declarations: [],
imports: [
CommonModule,
RouterModule
],
providers: [

  provide: ROUTES,
  useFactory: configNextStepHandlerRoutes,
  deps: [NextStepService],
  multi: true

]
)

export class NextStepHandlerModule  

export function configNextStepHandlerRoutes(nextStepService: NextStepService) 

let routes: Routes = [];

if (nextStepService.isNextStep()) 
console.log("value 1");

routes = [
  
    path: '', loadChildren: () => import('../../registration-page2/module/registration- 
page2.module').then(mod => mod.RegistrationPage2Module)
  
]
 else 
console.log("value 2");

routes = [
  
    path: '', loadChildren: () => import('../../registration-page1/module/registration- 
page1.module').then(mod => mod.RegistrationPage1Module)
  
]


return routes

next-step.service.ts

import  Injectable  from '@angular/core';
import  Router  from '@angular/router';
import  BehaviorSubject, Observable  from 'rxjs';

@Injectable(
providedIn: 'root'
)
export class NextStepService 

public next$: Observable<boolean>
private nextSource: BehaviorSubject<boolean>

constructor(private router: Router) 

this.nextSource = new BehaviorSubject<boolean>(false)
this.next$ = this.nextSource.asObservable()


isNextStep(): boolean 
return this.nextSource.value


public setNextStep(value: boolean): void 
const previous = this.nextSource.value
this.nextSource.next(value)
if (previous === this.nextSource.value)
  return

const i = this.router.config.findIndex(x => x.path === 'registration')
this.router.config.splice(i, 1)
this.router.config.push(
   path: 'registration', loadChildren: () => import('../module/next-step- 
handler.module').then(mod => mod.NextStepHandlerModule) 
)


在 app-routing.module.ts 我有它

import  NgModule  from '@angular/core';
import  RouterModule, Routes  from '@angular/router';

export const routes: Routes = [
 path: '', redirectTo: '/login', pathMatch: 'full' ,
 path: 'login', loadChildren: () => import("../app/login/module/login.module").then(mod => 
mod.LoginModule) ,
 path: 'home', loadChildren: () => import("../app/home/module/home.module").then(mod => 
mod.HomeModule) ,
 path: 'registration', loadChildren: () => import("../app/registration/next-step- 
handler/module/next-step-handler.module").then(mod => mod.NextStepHandlerModule) 
];

@NgModule(
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
)
export class AppRoutingModule  

在registration-page1.component.ts我有它

constructor(private nextStepService: NextStepService, private route: Router)  
ngOnInit(): void 
this.isTheNextStep = this.nextStepService.isNextStep()

step2()
this.nextStepService.setNextStep(true)
this.route.navigate(['/registration'])

在 registration-page1.component.html 我有这个按钮调用 step2() 方法,需要将我重定向到registration-page2.module.ts(或registration-page2组件上)

<button (click)="step2()">Go to step 2</button>

但是当我点击按钮时什么都没有发生

【问题讨论】:

我建议您在stackblitz.com 创建一个片段,并使用您的部分代码来模拟错误。这样您可能会得到更好的帮助 所以,我尝试了以下两种解决方案,并且都有效。谢谢大家。你节省了我的时间 【参考方案1】:

您可以通过为所有三个步骤制作 1 个父组件来做到这一点。

step1、step2、step3 有 3 个单独的组件。

子组件发出步骤完成事件,并在父组件中处理。

在儿童中

@Output() step1CompleteEvent = new EventEmitter<boolean>();
step1Complete() 
    this.step1CompleteEvent.emit(true);

在父母中

step = 1; // default step
<app-step-1-component *ngIf="step == 1" (step1CompleteEvent)="handleStep1CompleteEvt($event)"></app-step-1-component>
<app-step-2-component *ngIf="step == 2" (step2CompleteEvent)="handleStep2CompleteEvt($event)"></app-step-2-component>
<app-step-3-component *ngIf="step == 3" (step3CompleteEvent)="handleStep3CompleteEvt($event)"></app-step-3-component>

handleStep1CompleteEvt(event)
  this.step = 2;

对第 3 步执行相同操作。

【讨论】:

【参考方案2】:

这不是角度路由器的预期行为,所以我认为它不工作的原因是您的角度版本与文章作者的版本不同。如果需要,我建议您添加 /step1 /step2 和其他子路径,或者,如果您真的关心用户的 url,您可以将 step2 隐藏在 /step2hidden 路径下并通过调用 router.navigate(['step2hidden'], skipLocationChange: true) 导航到它

【讨论】:

但我需要 step2 是相同的路线/注册 正如我在答案中所写,我会在您的位置使用不同的子路径,但是有一种方法可以创建一个隐藏路径,用户将看不到该路径,并在不更改 url 的情况下导航到它跨度>

以上是关于如何在Angular中的同一模块上重定向的主要内容,如果未能解决你的问题,请参考以下文章

使用查询字符串在新服务器上重定向的角度路由

客户登录后,Amazon Pay 使用 php SDK 在同一页面上重定向

我希望我的 php 表单提交数据并在同一页面但不同的选项卡上重定向

钩子在 wordpress 上重定向

如何在另一个页面上重定向并从表中传递 url 中的参数?

如何在AD上重定向电脑加域后默认保存位置?