Показать параметры по пользователям

У меня 3 пользователя Admin, Supervisor и Student. Я хочу, чтобы администратор и руководитель могли редактировать и удалять данные студентов, в то время как студент может удалять и редактировать только свои собственные данные. Он может только просматривать чужие данные.

Я получаю роли для пользователя в json, как показано ниже:

Admin: ["Administrator"]
Supervisor: ["Supervisor", "Guest"]
Student: ["Student", "Guest"]

Вот что я пытаюсь сделать:

Exhibits.component.ts

   getCurrentUser() {
     this.userService.getCurrent()
       .then(
         (response) => {
           this.currentUserId = response.id;
            for (let role of response.roles) {
             if (role === 'Administrator') {
               this.canEdit = true;
             } else if (role === 'Supervisor') {
               this.canEdit = true;
             } else if (role === 'Student') {
               this.canEdit = false;
             }
          }
        }
      ).catch(
        (error) => console.info(error)
      );
  }

Exhibits.component.html

  <div *ngIf = "canEdit && this.currentUserId === exhibit.userId">
    <button md-icon-button click-stop-propagation color = "primary" [routerLink] = "['/mobile-content/exhibits/edit', exhibit.id]"
      title = "{{ 'edit' | translate }}">
      <md-icon>{{ !inDeletedPage ? 'edit' : 'remove_red_eye'}}</md-icon>
    </button>
    <button md-icon-button click-stop-propagation color = "warn" (click) = "deleteExhibit(exhibit)" *ngIf = "!exhibit.used && !inDeletedPage"
      title = "{{ 'delete' | translate }}">
      <md-icon>delete_forever</md-icon>
    </button>
  </div>

Я пытаюсь показать экспонаты, которые я получил в массиве в соответствии с userId. Это означает, что в ответах json я получаю «userId», который я пытаюсь сопоставить с userId текущего пользователя. Очень важно, что ученик может видеть только опции удаления и редактирования для созданной им выставки, но администратор и руководитель могут видеть опции редактирования и удаления для всех созданных пользователями выставок.

Может ли кто-нибудь помочь мне разобраться в этом?

Я до сих пор не совсем понимаю, в чем твоя проблема. Пожалуйста, сформулируйте вопрос еще раз?

Rohlex32 21.05.2018 22:33

используйте ngif else, чтобы показать / скрыть кнопки в соответствии с ролями пользователя

yer 21.05.2018 22:44
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
2
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, я бы предложил преобразовать это в перечисление как на передней, так и на задней стороне, а не полагаться на сопоставление строк.

Но, судя по вашему коду, если я правильно читаю, ни один студент никогда не сможет иметь кнопку редактирования и удаления, потому что вы всегда устанавливаете значение false для этого типа пользователя.

Ваша вторая проблема будет в вашем *ngIf, в котором указано следующее:

*ngIf = "canEdit && this.currentUserId === exhibit.userId"

Это приведет к тому, что эти кнопки всегда будут скрыты в нежелательное время, потому что даже для администраторов и других пользователей вам нужно, чтобы условное совпадение идентификаторов пользователей оценивалось как истинное. Вам также не нужно указывать this в шаблоне.

Лично я бы сделал нечто подобное.

getCurrentUser() {
  this.userService.getCurrent()
    .then(
      (response) => {
        this.currentUserId = response.id;
         for (let role of response.roles) {
          if (role === 'Administrator') {
            this.canEdit = true;
          } else if (role === 'Supervisor') {
            this.canEdit = true;
          } else if (role === 'Student') {
            if (this.currentUserId === this.exhibit.userId) {
             this.canEdit = true;
            } else {
             this.canEdit = false;
            }
          }
       }
     }
   ).catch(
     (error) => console.info(error)
   );
}

Тогда вы сможете просто изменить свой шаблон * ngIf на:

*ngIf = "canEdit"

Кроме того, вы также можете изменить свою проверку роли на оператор switch, он будет более производительным и сделает ваш код более чистым.

ИЛИ вы можете сделать это, что приведет к тому же результату.

getCurrentUser() {
  this.userService.getCurrent()
    .then(
      (response) => {
        this.currentUserId = response.id;
         for (let role of response.roles) {
          if (role === 'Administrator') {
            this.canEdit = true;
          } else if (role === 'Supervisor') {
            this.canEdit = true;
          }
       }
     }
   ).catch(
     (error) => console.info(error)
   );
}

Код шаблона будет:

*ngIf = "canEdit || this.currentUserId === exhibit.userId"

Другие вопросы по теме