【发布时间】:2017-05-06 10:23:28
【问题描述】:
问题来了:
我有一个nav 栏,其中有一些nav options,包括位于app.component.html 中的登录 按钮
这是AppComponent的结构:
export class AppComponent {
logInDialogRef: MdDialogRef<LoginComponent>;
public constructor(public http: Http, private viewContainerRef: ViewContainerRef,
public dialog: MdDialog) {}
loginUser(){
let config = new MdDialogConfig();
config.viewContainerRef = this.viewContainerRef;
config.role = 'dialog';
config.width = '40%';
this.logInDialogRef = this.dialog.open(LoginComponent, config);
}
}
当我点击 login 时,我会弹出登录页面。我有另一个 nav 选项,它是受保护的路线。
{path: 'products', component: ProductsComponent, canActivate: [AuthGuard]}
假设我在某条路线上说solutions。从这里我登录,我将jwt token 存储在localstorage 中。然后我点击Products。由于用户已登录,它应该导航,或者如果没有用户登录,它应该弹出。
但我什么也得不到。出现以下错误:
EXCEPTION: Uncaught (in promise): Error: No provider for ViewContainerRef!
CanActivateAuth.Guard.ts 方法
canActivate() {
if (tokenNotExpired()) {
return true;
}
this.loginService
.loginUser(this.viewContainerRef)
.subscribe(res => this.result = res);
return false;
}
LoginService 与上述app.component 中的loginUser 方法相同
app/login/login.service.ts
public loginUser(viewContainerRef: ViewContainerRef): Observable<any> {
let dialogRef: MdDialogRef<LoginComponent>;
let config = new MdDialogConfig();
config.viewContainerRef = viewContainerRef;
config.role = 'dialog';
config.width = '40%';
dialogRef = this.dialog.open(LoginComponent, config);
return dialogRef.afterClosed();
}
我希望信息清楚。请告知是否需要进一步澄清。
问题是通过服务从不同组件打开dialog,而可以从单个组件轻松完成相同操作,即在这种情况下为app.component。
【问题讨论】:
-
你能告诉我们
AuthGuard的完整代码吗? -
这或多或少存在于
AuthGuard中。我正在使用angular2-jwt库进行身份验证并且在没有dialogbox的情况下使用它可以正常工作,即有单独的登录路径 -
AuthGuard 的构造函数中有
private viewContainerRef: ViewContainerRef吗?那是问题。此服务看不到您的注入 -
Made 是公开的,但没有用
-
没关系。 Angular 找不到它的提供者
标签: angular dialog angular-material2