Angular 通过服务打开对话框
问题是:Angular 通过服务打开对话框,angular,dialog,angular-material2,Angular,Dialog,Angular Material2,问题是: 我有一个nav栏,有一些nav选项,包括登录按钮,它位于app.component.html 这是AppComponent的结构: export class AppComponent { logInDialogRef: MdDialogRef<LoginComponent>; public constructor(public http: Http, private viewContainerRef: ViewContainerRef, publi
我有一个
nav
栏,有一些nav选项
,包括登录按钮,它位于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);
}
}
假设我在某条路线上,比如说解决方案
。从这里我登录,我将jwt令牌
存储在localstorage
中。然后我点击产品
。因为用户已经登录,所以它应该导航,或者如果没有用户登录,它应该弹出窗口但我什么也得不到。获取以下错误:
EXCEPTION: Uncaught (in promise): Error: No provider for ViewContainerRef!
CanActivate
Auth.Guard.ts的方法
canActivate() {
if (tokenNotExpired()) {
return true;
}
this.loginService
.loginUser(this.viewContainerRef)
.subscribe(res => this.result = res);
return false;
}
LoginService
具有与上述app.component
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();
}
公共登录用户(viewContainerRef:viewContainerRef):可观察{
让dialogRef:MdDialogRef;
让config=newMDDialogConfig();
config.viewContainerRef=viewContainerRef;
config.role='dialog';
config.width='40%';
dialogRef=this.dialog.open(LoginComponent,config);
返回对话框ref.afterClosed();
}
我希望信息是清楚的。请告知是否需要进一步澄清问题是通过服务从不同的组件打开
对话框
,而从单个组件也可以轻松打开对话框,即在这种情况下,应用组件
。您可以尝试以下操作:
Auth.Guard.ts
@Injectable()
export class AuthGuard implements CanActivate {
viewContainerRef: ViewContainerRef;
constructor(private appRef: ApplicationRef) {
this.viewContainerRef = appRef.components[0].instance.viewContainerRef;
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
...
}
}
另请检查我的(在产品模块中使用了延迟加载)您能否向我们显示AuthGuard
的完整代码?这或多或少是AuthGuard
中的代码。我正在使用angular2 jwt
库进行身份验证,在不使用dialogbox
的情况下,该库工作正常,即有单独的登录路径。您在AuthGuard的构造函数中是否有private viewContainerRef:viewContainerRef
?这就是问题所在。此服务没有看到您的InjectingMake是公共的,但不起作用。这无关紧要。Angular找不到itError的提供程序关于ViewContainerRef
的错误已消失。但是现在它找不到MdDialogRef
。出现另一个错误错误:没有MdDialogRef的提供程序
@Injectable()
export class AuthGuard implements CanActivate {
viewContainerRef: ViewContainerRef;
constructor(private appRef: ApplicationRef) {
this.viewContainerRef = appRef.components[0].instance.viewContainerRef;
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
...
}
}