Проверьте утверждения о роли и покажите элементы, если это правда

#javascript #html #angular

#язык JavaScript #HTML #угловой

Вопрос:

Я пишу приложение с угловым интерфейсом asp.net на бэкэнде. У меня есть 2 роли: пользователь и администратор. На моей панели навигации есть несколько кнопок, которые я хочу скрыть от роли пользователя. Моя функция для проверки того, является ли роль пользователя, зарегистрированного в данный момент, администратором:

 public isUserAdmin = (): boolean =gt; {  var token = localStorage.getItem("token");  const decodedToken = this._jwtHelper.decodeToken(token!);  const role = decodedToken['http://schemas.microsoft.com/ws/2008/06/identity/claims/role']  return role === 'Admin';  }   

Приведенный выше код протестирован и работает, в настоящее время я использую его для защиты.

Моя навигационная панель html:

 lt;li class="nav-item"gt;  lt;a class="nav-link" *ngIf="isUserAdmin" routerLink="manufacturers"gt;Manufacturerslt;/agt;  lt;/ligt;  

навигационная панель.ts:

 export class HeaderComponent implements OnInit {  public isUserAdmin: boolean = false;  ...  constructor(private userService: UserService, private _router: Router) {  this.userService.adminChanged  .subscribe(res =gt; this.isUserAdmin = res);   }  

Чтобы получить работу над кодом navbar.ts, я изменил пользовательский сервис:

 export class UserService {   private _adminChangeSub = new ReplaySubjectlt;booleangt;(1);  public adminChanged = this._adminChangeSub.asObservable();   constructor(private _http: HttpClient, private _envUrl: EnvironmentUrlService, private _jwtHelper: JwtHelperService) {   }   public isUserAdmin = (): boolean =gt; {  var token = localStorage.getItem("token");  const decodedToken = this._jwtHelper.decodeToken(token!);  const role = decodedToken['http://schemas.microsoft.com/ws/2008/06/identity/claims/role']  this._adminChangeSub.next(true);  return role === 'Admin';  }   

Но это просто не работает. Элемент в навигационной панели все еще здесь, даже если я войду в учетную запись администратора. Также, когда я пытаюсь console.log(это.isUserAdmin) в конструкторе сразу после подписки, он возвращает false. Как я могу скрыть кнопки с панели навигации, если пользователь не является администратором?

Комментарии:

1. Может быть this._adminChangeSub.next(role === 'Admin');

2. не работает :/

Ответ №1:

Нет необходимости в наблюдаемых, подписках на весь этот арсенал. Просто используйте это :

 lt;li class="nav-item"gt;  lt;a class="nav-link" *ngIf="userService.isUserAdmin" routerLink="manufacturers"gt;Manufacturerslt;/agt; lt;/ligt;  

И сделайте его добытчиком на службе :

 get isUserAdmin(): boolean =gt; {  var token = localStorage.getItem("token");  const decodedToken = this._jwtHelper?.decodeToken(token!) || {};  const role = decodedToken['http://schemas.microsoft.com/ws/2008/06/identity/claims/role']  return role === 'Admin'; }   

Комментарии:

1. Когда я использую ключевое слово get в методе, подобном приведенному выше, я получаю пару ошибок (и без ключевого слова get он все еще неправильно отображает элементы). Я понимаю, что это так. _jwtHelper, возможно, «не определен», и при получении isUserAdmin = () ожидается, что «(» и () является неожиданным.

2. Хорошо, ответ отредактирован. get isUserAdmin(): boolean и this._jwtHelper?

3. Пришлось удалить лямбду, чтобы заставить ее работать, но она работает! Спасибо

4. Пожалуйста, обратите внимание, что всякий раз, когда угловой проверяет наличие изменений, весь метод будет выполнен повторно.