代码之家  ›  专栏  ›  技术社区  ›  AlbertMunichMar

角防护服务注入服务

  •  0
  • AlbertMunichMar  · 技术社区  · 6 年前

    我需要给警卫注入服务。这个守卫检查用户是否被邀请,如果被邀请,他可以访问路由。

    为了检查这个条件,我需要调用一个从数据库中获取这个信息的服务。

    我有一个周期性的依赖关系错误,我理解我们不应该在保护中注入服务,但在这种情况下,我需要这样做:

      providers: [AuthService, HackService, HacksStorageService, AuthGuard, EmailGuard],
    

    还有警卫:

    import { ActivatedRouteSnapshot, RouterStateSnapshot, CanActivate } from "../../../node_modules/@angular/router";
    import { HacksStorageService } from "../shared/hacks-storage.service";
    
    export class EmailGuard implements CanActivate {
    
      constructor(
        private hacksStorageService: HacksStorageService,
      ) {}
    
      canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
        this.hacksStorageService.fetchHack();
        // check if user was invited. should be in the participants array
        return true;
      }
    }
    

    我很困惑。通常我使用保护来查看用户是否登录,所以我通常从FireBase导入内容,而不是从我自己的服务导入内容,所以不是循环依赖关系。

    现在,我想根据我自己的数据检查是否发生了某个条件。如果由于循环依赖关系而不允许我注入服务,我如何在emailguard中注入自己的数据?

    谢谢。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Poly Bug    6 年前

    你可以给警卫注入服务。 如果您的服务同步返回,那么您可以立即返回,就像在示例代码中一样。 否则,我就这样做了(使用firebase auth)

    import { Injectable } from '@angular/core';
    import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router';
    import { Observable, of } from 'rxjs';
    import { map, first } from 'rxjs/operators';
    import { AngularFireAuth } from '@angular/fire/auth';
    import { Paths } from './paths';
    
    @Injectable({
      providedIn: 'root'
    })
    export class SignInGuard implements CanActivate {
    
      constructor(private afAuth: AngularFireAuth, private router: Router) { }
    
      canActivate(
        next: ActivatedRouteSnapshot,
        state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
          return this.afAuth.user.pipe(
            first(),
            map(user => {
              if (user) {
                this.router.navigate([Paths.MAIN_PATH]);
                return false;
              } else {
                return true;
              }
            })
          );
      }
    }
    
        2
  •  0
  •   Akj    6 年前

    试试这个。

    在routing.module.ts中:

    import { EmailGuard } from 'path_to_email_guard/email.guard';
    
    
    const routes: Routes = [
    
        {
            path: 'path_to_email', component: EmailAccessComponent, canActivate: [EmailGuard]
    }
    

    在email.guard.ts中:

    constructor(private hacksStorageService: HacksStorageService){
      }
            canActivate(next: ActivatedRouteSnapshot,
                state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
    
                return this.isValidate();
            }
    
    isValidate() {
    //write your verification logic in hasAccess Method.
            if (this.hacksStorageService.hasAccess()) {
                return true;
            } else {
                console.log("dont have access")
                return false;
            }
    
        }