Реализация NbRoleProvider - PullRequest
       14

Реализация NbRoleProvider

0 голосов
/ 10 марта 2019

Я реализую NbRoleProvider в моем Angular приложении с Nebular.

Я реализовал его следующим образом:

@Injectable()
export class RoleProvider implements NbRoleProvider {

    constructor(private store: Store<IAppStore>) {
    }

    getRole(): Observable<string[]> {

        const loggedUser = this.store.select<IUser>(x => x.loggedUserStore.loggedUser);

        let result = [];
        loggedUser.subscribe(data => {
            if (data != null) {
                result = data.roles; // returns ['admin']
            }
        });
        return of(result);

        // this works!!
        // return of(['admin']);
    }
}

Если я верну фиксированныйРоль массива вроде ['admin'] все работает как положено.Если я попытаюсь подписать значение из магазина, оно не будет работать.Отладка Я вижу, что метод getRole вызывается несколько раз, когда объект data по-прежнему null, а затем несколько раз, когда он загружен с соответствующим списком массивов.

Кажется, что *nbIsGrantedДиректива отображается в первый момент, когда подписка все еще ждет данных из хранилища.

Что мне не хватает?

1 Ответ

2 голосов
/ 10 марта 2019

Я бы попытался вернуть Observable напрямую из магазина, как:

import { map } from 'rxjs/operators';

@Injectable()
export class RoleProvider implements NbRoleProvider {

    constructor(private store: Store<IAppStore>) {}

    getRole(): Observable<string[]> {
      const loggedUser = this.store.select<IUser>(x => x.loggedUserStore.loggedUser);

      return loggedUser.pipe(map(data => data ? data.roles : []));
    }
}
...