Как заставить dataservice с BehaviourSubject Angular возвращать последнее значение, установленное с помощью next () - PullRequest
0 голосов
/ 19 января 2019

Я пишу Angular Guards из моего заявления. После того, как пользователь входит в мой AuthService, я меняю значение переменной BehaviourSubject в моем userService, используя next (). В моем GuardService я хочу получить последнее значение из переменной, но я всегда получаю начальное значение.

UserService

export class UserService {

private isAdmin = new BehaviorSubject<boolean>(true);
isCurrentUserAdmin = this.isAdmin.asObservable();

changeAdminRole(isAdmin: boolean) {
    // change the BehaviourSubject value
    this.isAdmin.next(isAdmin);
  }
}

AdminGuard

export class AdminGuard implements CanActivate {

  constructor(private userService: UserService) { }

  canActivate() {
    this.userService.isCurrentUserAdmin
      .subscribe((response: boolean) => {
        console.log('working here', response);
        if(response) return true;
      });

    return false;
  }
}

appModule

app.module.ts
imports: [
    BrowserModule,
    AppRoutingModule,
    BsDropdownModule.forRoot(),
    RouterModule.forRoot([
      {path: '', component: HomeComponent},
      {path: 'products', component: ProductsListComponent, canActivate: [AuthGuard, AdminGuard]},
      {path: 'shopping-cart', component: ShoppingCartComponent},
      {path: 'my-orders', component: MyOrdersComponent, canActivate: [AuthGuard, AdminGuard]},
      {path: 'check-out', component: CheckOutComponent, canActivate: [AuthGuard, AdminGuard]},
      {path: 'order-success', component: OrderSuccessComponent, canActivate: [AuthGuard, AdminGuard]},
      {path: 'login', component: LoginComponent},
      {path: 'admin/products', component: AdminProductsListComponent, canActivate: [AuthGuard, AdminGuard]},
      {path: 'admin/orders', component: AdminOrdersListComponent, canActivate: [AuthGuard, AdminGuard]},
      {path: '**', component: HomeComponent}
    ])
],
  providers: [AuthService, UserService, AuthGuard, AdminGuard]

Я ожидаю отклика в наблюдаемой моей AdminGuard, когда я перехожу к маршруту, который я хочу защитить, чтобы было установлено последнее значение в UserService.changeAdminRole () при вызове из моего AuthService, но я всегда получаю ноль.

1 Ответ

0 голосов
/ 19 января 2019

Вы пытаетесь вернуть true от подписки, а не от охраны.Ваш охранник всегда возвращает ложь. CanActivate может возвращать также наблюдаемое, которое в конечном итоге разрешается в логическое значение, которое идеально подходит для вашей ситуации:

canActivate() {
  return this.userService.isCurrentUserAdmin;
}
...