Angular 带ngrx的角度2路由器v3可观察防护装置

Angular 带ngrx的角度2路由器v3可观察防护装置,angular,angular2-routing,ngrx,angular2-router3,Angular,Angular2 Routing,Ngrx,Angular2 Router3,我正在尝试使用redux(ngrx)创建一个“auth应用程序”,并尝试在secret guard中使用我的应用程序状态。在这里您可以看到我的github: 这就是我的警卫的样子: @Injectable() export class SecretGuard implements CanActivate { constructor(private store: Store<AppState>, private router: Router) { } canActivate

我正在尝试使用redux(ngrx)创建一个“auth应用程序”,并尝试在secret guard中使用我的应用程序状态。在这里您可以看到我的github: 这就是我的警卫的样子:

@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)
  }
}
在redux中,我接收到init状态,因此我也尝试跳过我的observable中的第一个发射,但它都不起作用。 以下是跳过的代码:

@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)
  }
}
@Injectable()
导出类SecretGuard实现CanActivate{
构造函数(专用存储:存储,专用路由器:路由器){
}
canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观察{
返回此.store.let(getLoginState())
.skip(1)
.map(state$=>state$.isLoggedIn)
}
}

如果我使用AuthService的auth函数,它工作正常,但该解决方案不是“redux-like”。你能帮助我如何使它与ngrx一起工作吗?或者我无法在guards中使用我的appstate?

您可以从存储中同步获取价值,而无需“流式传输一切”(:

导入'rxjs/add/operator/take';
函数getState(存储:存储):状态{
让国家:国家;
store.take(1).subscribe(s=>state=s);
返回状态;
}
@可注射()
导出类SecretGuard实现CanActivate{
构造函数(私有存储:存储,私有路由器:路由器){}
canActivate():布尔值{
返回getState(this.store).login.isLoggedIn;
}
}

谢谢,它正在工作,但是如果我添加了一些错误处理逻辑(如果防护失败,则重定向到auth),我会被重定向到auth页面。我想这是因为初始状态的isLoggedIn属性为false。如果我跳过(1)重新加载时可以,但在尝试从导航栏导航时不起作用,因为它会跳过每一个导航栏。你知道如何解决这个问题吗?如果我使用debounceTime,它会起作用,但不确定这是否是最佳解决方案。我没有这个问题,因为我很早就决定使用两个还原程序-
auth
user
。我使用
auth
仅用于真/假/挂起和
user
用于用户配置文件数据,然后在guards中使用
auth
,在组件中使用
user
进行重定向。在登录/注销期间,这项工作会稍微多一些-我正在调度
LoginUserAction
LoginAuthAction
,但以后会更容易处理。我预计这项工作会更轻松对于延迟加载也很有用,我可以在AppModule中打包
auth
,在AdminModule中打包“user”…谢谢。我会尝试一下。听起来更好。
auth
的初始值是多少,是挂起的还是假的?如果你没有初始值问题,我认为是挂起的,你不会重定向到它不“稳定”(真的还是假的).我说得对吗?我实际上使用了
null
true
false
“挂起”
setTimeout
将其设置为稳定状态(:设置有点奇怪(甚至可能会更改),但现在就可以了。类似于。
@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)
  }
}
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;
  }
}