Как показать/скрыть элемент в зависимости от роли пользователя Angular 4

Я работаю над проектом, который имеет более одного типа пользователя (SuperUser - SchoolAdmin - Teacher)

И каждая роль имеет право видеть некоторые элементы.

Как скрыть элементы в зависимости от роли зарегистрированного пользователя, используя *ngIf?

Это проект ссылка на Stack-blitz, я загрузил некоторые из них, чтобы помочь мне с предварительный просмотр в реальном времени.

Внутри приложения вы найдете общие службы >> auth, это папка, в которой есть служба входа в систему и защита аутентификации.

Внутри моделей >> enum вы найдете тип пользователя enum.

Внутри входа в компонент вы найдете форму, которая определяет тип пользователя.

Внутри маршрутов вы увидите ожидаемые роли, созданные для каждого компонента.

Пользователи, которых я сделал для тестирования:

Это должно направить вас к школьному списку

Администратор (с ролью суперпользователя): [email protected] Пароль: 12345

Это должно направить вас к приборной панели

Студент (имеющий роль студента): [email protected] Пароль: 12345

Например, я хочу скрыть элемент на приборной панели, чтобы он отображался только для роли суперпользователя, как я могу это сделать?

Я знаю, что есть способ с ngIf, но я застрял на правильном способе написать его внутри NgIf, мне нужны примеры моего кода, а не фиктивный код.

Обновление: проблема решена, поэтому я удалил пользователей, созданных для тестирования.


person Mohamed Wahshey    schedule 01.03.2018    source источник


Ответы (3)


В вашем проекте, когда пользователь регистрируется, вы спрашиваете, является ли он «Учителем», «Родителем» или «Студентом». Вот вам и ваше состояние.

Когда вы входите в систему или регистрируетесь, вы должны где-то сохранить свои пользовательские данные (например, в службе, которую вы можете использовать с @инъекция.

Затем с этими данными вы должны выполнить некоторый тест в своей DOM следующим образом:

/* if type_id == id(student) */
 <div *ngIf="myService.currentUser.type_id">
   // your student display ...
 </div>

 /* if type_id == id(teacher) */
 <div *ngIf="myService.currentUser.type_id">
   // your teacher display ...
 </div>

Это помогает тебе? Вы должны прочитать эту документацию Услуги

[Пример в вашем случае]

Ваш сервис:

import { Injectable } from '@angular/core';
/*
   other import 
*/

 @Injectable()
 export class UserService {

      public currentUser: any;

      constructor(){}

      public login(loginData: LoginModel): any {
            const apiUrl: string = environment.apiBaseUrl + '/api/en/users/login';  
            let promise = new Promise((resolve, reject) => { // this is a  promise. learn what is a promise in Javascript. this one  is only more structured in TypeScript
  // a promise is returned to make sure that action is taken only after the response to the api is recieved
             this.http.post(apiUrl, loginData).subscribe((data: any) => {
                if(data.status)
                {
                  var userData = {
                      token: data.token,
                      user:data.user 
                     };
                this.currentUser = data.user // HERE SAVE YOUR user data
                return resolve(userData);
                }
                else {
                       return reject(data)
                 }
               }, (err: HttpErrorResponse) => {
               return reject(err);
            });
          });
     return promise;
      }
 }

Затем введите эту службу в свой конструктор и свою службу в

Компонент:

// Don't forgot to import UserService !!
constructor(public userService: UserService){}

ДОМ:

*ngIf="userService.currentUser.type_id == 1"
person carton    schedule 01.03.2018
comment
Да, это то, что я хочу сделать, чтобы проверить службу входа в папку общих служб в моей ссылке на проект, я сделал что-то похожее на это, но я не знаю, как вызвать функцию (мою функцию) внутри ngIf, я застрял на этом: D - person Mohamed Wahshey; 01.03.2018
comment
Просто поместите свое объявление в свой конструктор, как вы сделали это в public loginService: LoginService, затем сделайте это в dom *ngIf=loginService.currentUser.type_id , если у вас, конечно, есть переменная currentUser. - person carton; 01.03.2018
comment
нет, это не работает, я написал *ngIf=this.authService.setUser(loginData) == loginData.user.type_id == UserType.SuperUser - person Mohamed Wahshey; 01.03.2018
comment
Я знаю синтаксис, я просто застреваю, когда пишу его, я не знаю, как правильно вызвать идентификатор типа пользователя в ngif, мне нужен пример моего кода, пожалуйста :) - person Mohamed Wahshey; 01.03.2018
comment
Хорошо, я добавил эти строки в свою службу входа в систему, и в моем HTML написано *ngIf=loginService.currentUser.type_id == 1 говорит мне, что идентификатор «loginService» относится к частному члену компонента и дает ошибку - person Mohamed Wahshey; 01.03.2018
comment
пользовательская служба, названная службой входа в мой проект, и я добавил ее в конструктор - person Mohamed Wahshey; 01.03.2018
comment
Хм, переменная currentUser объявлена ​​как общедоступная и userService тоже? - person carton; 01.03.2018
comment
да, проблема была в том, что они были объявлены частными, я объявил их общедоступными, теперь сработало, спасибо :) - person Mohamed Wahshey; 01.03.2018

логическое значение true или false используется для сокрытия. В файле HTML <div *ngIf = !test>_contents to be printed_</div> В файле .ts инициализируйте test = false;, поэтому всякий раз, когда this.test = true; будет отображаться, div будет скрыт. Проверьте свое состояние и сделайте test = true;

person Sangeeth John    schedule 01.03.2018

Ты должен сделать:

<div *ngIf="superUserLogged">
   // your SuperUser display ...
 </div>
<div *ngIf="schoolAdminLogged">
       // your SuperUser display ...
</div>
<div *ngIf="teacherLogged">
       // your SuperUser display ...
</div>

и в файле *.ts, когда кто-то входит в систему, которую вы делаете:

onLogin(userrLogged: string) {
    this.superUserLogged  = false;
    this.schoolAdminLogged = false;
    this.teacherLogged = false;
    switch (userrLogged) {
        case 'SuperUser':
            this.superUserLogged = true;
            break;
        case 'SchoolAdmin':
            this.schoolAdminLogged = true;
            break;
        case 'Teacher':
            this.teacherLogged = true;
            break;
}
person Joe Belladonna    schedule 01.03.2018