我尝试在the following article(以及SO上的a previous question)的帮助下在Angular 2中设置身份验证,我设法创建了自己的扩展RouterOutlet:

export class LoggedInRouterOutlet extends RouterOutlet {
    publicRoutes: any;
    private parentRouter: Router;
    private loginService: LoginService;

    constructor(_viewContainerRef: ViewContainerRef, _loader: DynamicComponentLoader,
        _parentRouter: Router, @Attribute('name') nameAttr: string,
        private loginService: LoginService) {
        super(_viewContainerRef, _loader, _parentRouter, nameAttr);

        this.parentRouter = _parentRouter;
        this.publicRoutes = {
            'login': true
        };
    }

    _canActivate(url: string, admin: boolean) {
        => Checks with my loginService if user is authenticated
    }


    activate(instruction: ComponentInstruction) {
            if (this._canActivate(url, isAdmin)) {
                => Go to desired URL
            } else {
                => Go to login page
            }
    }
}


此代码的问题是我的打字稿生成以下错误:


  “重复标识符'loginService'”


我的代码确实按预期运行,只是将打字稿解析为javascript时不喜欢打字稿错误。但是,如果我重命名第二个loginService,我的代码就会中断,我可以找到一个


  TypeError:this.loginService未定义


在我的控制台中。我想知道是否有人知道如何解决这个问题?

最佳答案

您在课堂上两次声明loginService

export class LoggedInRouterOutlet extends RouterOutlet {
    publicRoutes: any;
    private parentRouter: Router;
    // private loginService: LoginService; // <== remove this


并将参数命名为loginService而不是loginService2

constructor(_viewContainerRef: ViewContainerRef, _loader: DynamicComponentLoader,
    _parentRouter: Router, @Attribute('name') nameAttr: string,
    private loginService: LoginService) {
    super(_viewContainerRef, _loader, _parentRouter, nameAttr);


构造函数参数上的privatepublic修饰符已经使用该名称声明了一个类属性。无需再次显式声明该属性。

关于javascript - 在Angular 2的扩展RouterOutlet中导入自定义服务以进行身份​​验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37077626/

10-09 19:01