javascript - Angular 4 : cannot subscribe observable value from CanActivate AccessGuard

标签 javascript angular typescript

我遵循了很多教程并尝试了很多组合,但无法完成这项工作。

我需要在用户登录时让路由可用。如果他不是,我需要将他重定向到主页 (this._popupService.setCallbackRoute(route.url.join('/'))) 并显示弹出窗口 (this._popupService.showPopUp ()) 让他登录或注册。

我无法从 authService 获取同步值。这是我的代码:

app.module.ts

imports: [
    BrowserModule,
    FormsModule,
    HttpModule,
    RouterModule.forRoot(
        {path: '', component: HomepageComponent},
        {
            path: 'protectedRoute',
            component: SubmitComponent,
            data: {requiresLogin: true},
            canActivate: [AccessGuard]
        }
    ),
    ...
]

auth.service.ts

 @Injectable()
export class AuthService {

    private loggedIn: Subject<boolean> = new Subject<boolean>();

    get isLoggedIn() {
        return this.loggedIn.asObservable();
    }

    login(user: IUser) {
        return this._http.get('assets/api/responseSuccess.json?email=' + user.email + '&password=' + user.password)
            .map((responseLogin => {
                const jsonResponse = responseLogin.json();
                if (jsonResponse.response === 'success') {
                    const userResponse: IUser = jsonResponse.user;
                    this._sessionService.setUserSession(userResponse);
                    this.loggedIn.next(true);
                    return true;
                } else {
                    this._customFlashMessages.show('Got error login, please check your credentials and try again!');
                    return false;
                }
            }));
    }
}

accessGuard.service.ts

import {Injectable} from '@angular/core';
import {ActivatedRouteSnapshot, CanActivate, Router} from '@angular/router';
import {Observable} from 'rxjs/Observable';
import {AuthService} from './auth.service';
import {PopUpService} from './popup.service';

@Injectable()
export class AccessGuard implements CanActivate {
    loggedIn$: Observable<boolean>;

    constructor(private authService: AuthService, private _popupService: PopUpService, private router: Router) {
        this.loggedIn$ = this.authService.isLoggedIn;
    }

    canActivate(route: ActivatedRouteSnapshot): Observable<boolean> | Promise<boolean> | boolean {
        const requiresLogin = route.data.requiresLogin || false;
        if (requiresLogin) {
            this.authService.isLoggedIn.subscribe( // even tried with .map()
                result => {
                    console.log(result); // Logs a promise object
                    if (!result) {
                        console.log("protected route"); // Never reached
                        // If not logged in shop popup and stay on that page
                        this._popupService.showPopUp();
                        this._popupService.setCallbackRoute(route.url.join('/'));
                        return false;
                    }
                    console.log('logged in'); // Never reached
                    return true;
                });
        }
        return true;
    }
}

我尝试了几件事。如果我直接检查 sessionStorage('user') 但不使用 observable,我的代码就可以工作。

感谢任何帮助。

谢谢!

最佳答案

这是正确的答案,问题出在订阅方法内部的逻辑中。

这是正确的accessGuard.service.ts

@Injectable()
export class AccessGuard implements CanActivate {

    constructor(private authService: AuthService, private _popupService: PopUpService, private router: Router) {
    }

    canActivate(route: ActivatedRouteSnapshot): Observable<boolean> | Promise<boolean> | boolean {
        const requiresLogin = route.data.requiresLogin || false;
        if (requiresLogin) {
            this.authService.isLoggedIn.subscribe(
                result => {
                    if (!result) {
                        // If not logged in shop popup and stay on that page
                        this._popupService.showPopUp();
                        this._popupService.setCallbackRoute(route.url.join('/'));
                        this.router.navigate(['/']);
                        return false;
                    }
                    return true;
                });

            return true;
        }else{

        return true;
       }
    }
}

关于javascript - Angular 4 : cannot subscribe observable value from CanActivate AccessGuard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45888002/

相关文章:

javascript - 递归获取数组所有数字的阶乘

将 dist 文件夹部署到 tomcat 服务器时,angular2 路由不起作用

javascript - Node.js/Express.js/Angular2 中的 ForBiddenError

Typescript 原始类型 : any difference between the types "number" and "Number" (is TSC case-insensitive)?

javascript - 如何检查类然后替换每个元素的 data-id

javascript - 获取动态元素的顶部位置,不涉及任何事件

typescript - 使用属性装饰器对属性类型进行严格类型检查

testing - 在生产模式下隐藏 angular2 组件的最佳解决方案?

javascript - 如何将字符串点符号转换为对象引用,而不是嵌套

Angular - [(ngModel)] vs [ngModel] vs (ngModel)