Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角度路由只能通过路由器访问。导航_Angular - Fatal编程技术网

Angular 角度路由只能通过路由器访问。导航

Angular 角度路由只能通过路由器访问。导航,angular,Angular,是否可以创建一个角形CanActivate防护装置,仅当我通过路由器导航到它时,它才允许用户访问路由。导航 例如: 用户创建一个帐户,可以显示两个组件:RegistrationForm和ConfirmationForm。它们都将其特定路由配置为“registrationForm”、“confirmationForm”。我希望确认表单只有在用户通过注册表单时才可访问,并且在成功注册时我使用路由器。导航('ConfirmationForm')。我希望在用户将www.someURL.com/confi

是否可以创建一个角形CanActivate防护装置,仅当我通过
路由器导航到它时,它才允许用户访问路由。导航

例如:
用户创建一个帐户,可以显示两个组件:RegistrationForm和ConfirmationForm。它们都将其特定路由配置为“registrationForm”、“confirmationForm”。我希望确认表单只有在用户通过注册表单时才可访问,并且在成功注册时我使用
路由器。导航('ConfirmationForm')
。我希望在用户将www.someURL.com/confirmationForm放入浏览器地址栏时阻止它。

为什么不将这两个表单合并到一个组件中,并根据注册结果使用
*ngIf
隐藏/显示部分

灵感来自jacekbj对原始问题的评论, 我就是这样做的:

首先,我创建了类CanShowConfirmationForm:

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

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

    constructor(private router: Router) { }

    canActivate(
        next: ActivatedRouteSnapshot,
        state: RouterStateSnapshot): boolean {
        const url: string = state.url;
        alert("current url" + this.router.url);

        return this.checkLogin(url);
    }

    checkLogin(url: string): boolean {
        if (this.router.url === "/register") { return true; }

        this.router.navigate(['/login']);
    return false;
    }
}
然后我修改了app-routing模块app-routing.module.ts 导入刚创建的类

import { CanShowConfirmationForm } from './can.show.confirmation.form';
然后我通过添加属性修改了组件注册SuccessComponent的路由(在您的示例中,该组件命名为ConfirmationForm) 可以使用值[CanShowConfirmationForm]激活:

{
 path: 'registration-success',
 canActivate: [ CanShowConfirmationForm],
 component: RegistrationSuccessComponent,
 data: { title: 'RegistrationSucess' }
}
(在您的示例中,成功注册被重定向到url/confirmationForm,在我的示例中重定向到url/registration success。)


现在,如果我尝试直接访问url,浏览器将指向url,并且在成功注册后,将显示注册成功视图。我想,这也是你想要的。

你有没有考虑过使用一个服务来存储一个标志,即“代码> CANEngestRealfMyStase<代码>?然后你可以在注册表单中设置它,并在Guard中使用。我想我会这样做,因为这是迄今为止我发现的最好的解决方案,我需要两个组件的不同路径。