#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. Пожалуйста, обратите внимание, что всякий раз, когда угловой проверяет наличие изменений, весь метод будет выполнен повторно.