首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有ngrx的角2路由器v3可观测保护

带有ngrx的角2路由器v3可观测保护
EN

Stack Overflow用户
提问于 2016-10-04 09:43:16
回答 1查看 1.5K关注 0票数 5

我正试图用redux(ngrx)创建一个"auth应用程序“,并试图在秘密守卫中使用我的应用程序状态。在这里,您可以看到我的github:https://github.com/tamasfoldi/ngrx-auth/tree/router,这就是我的守卫的样子:

代码语言:javascript
复制
@Injectable()
export class SecretGuard implements CanActivate {
  constructor(private store: Store<AppState>, private router: Router) {
  }
  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
    return this.store.let(getLoginState())
      .map(state$ => state$.isLoggedIn)
  }
}

它返回的isLoggedIn属性应该是OK的,因为路由器解析了承诺并可以观察到,但是当我导航到秘密部分时,路由器会阻塞它。以下是我的路线:

代码语言:javascript
复制
export const appRoutes: Routes = [
  {
    path: '',
    redirectTo: 'auth',
    pathMatch: 'full'
  },
  {
    path: 'auth',
    children: [
      { path: '', redirectTo: 'login', pathMatch: 'full' },
      { path: 'login', component: LoginComponent },
      { path: 'register', component: RegisterComponent }
    ]
  },
  {
    path: 'secret',
    canActivate: [SecretGuard],
    children: [
      { path: '', redirectTo: 'default', pathMatch: 'full' },
      { path: 'default', component: DefaultSecretComponent }
    ]
  }
];

在redux中,我接收init状态,所以我也尝试跳过我可观察到的第一次发射,但是它都不起作用。下面是跳过的代码:

代码语言:javascript
复制
@Injectable()
export class SecretGuard implements CanActivate {
  constructor(private store: Store<AppState>, private router: Router) {
  }
  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
    return this.store.let(getLoginState())
      .skip(1)
      .map(state$ => state$.isLoggedIn)
  }
}

如果我使用AuthService的auth函数,它工作正常,但该解决方案不是“redux样”。你能帮我把它和ngrx一起用吗?还是我不能用我的名字当警卫?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-04 15:33:35

您可以从商店中同步获取值,不需要“流所有东西”(:

https://github.com/ngrx/store#getstate-getvalue-and-value

代码语言:javascript
复制
import 'rxjs/add/operator/take';

function getState(store: Store<State>): State {
    let state: State;
    store.take(1).subscribe(s => state = s);
    return state;
}

@Injectable()
export class SecretGuard implements CanActivate {
  constructor(private store: Store<AppState>, private router: Router) { }

  canActivate():boolean {
    return getState(this.store).login.isLoggedIn;
  }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39849060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档