我尝试在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);
构造函数参数上的
private
或public
修饰符已经使用该名称声明了一个类属性。无需再次显式声明该属性。关于javascript - 在Angular 2的扩展RouterOutlet中导入自定义服务以进行身份验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37077626/