Значение угловой проверки в массиве непосредственно в шаблоне

#angular

#angular

Вопрос:

в моем приложении ng я работаю с ролями. Все роли хранятся в массиве. Как я могу проверить, существует ли роль в моем HTML-шаблоне, не делая ничего подобного:

   <div class="customer-entry" *ngFor="role of userRoles">
    <div *ngIf="role == 'Admin' || role == 'Superuser'">
      <span class="badge badge-warning">allowed</span>
    </div>
  </div>
  

На мой взгляд, должно быть решение для этого без ngFor.

Ответ №1:

Я бы определил структурную директиву для этого:

 import { Directive, TemplateRef, ViewContainerRef, Input } from '@angular/core';

@Directive({ 
     selector: '[hasRole]' 
})
export class HasRoleDirective {

    constructor( private templateRef: TemplateRef<any>,
                 private viewContainer: ViewContainerRef,
                 private userService: UserService) { }
    @Input() set hasRole(role: string) {
       if (this.userService.getRole() === role) {
          this.viewContainer.createEmbeddedView(this.templateRef);
       } else {
          this.viewContainer.clear();
      } 
    }
}
  

Теперь вы можете использовать директиву следующим образом:

 <div *hasRole="'Admin'">
  <span class="badge badge-warning">allowed</span>
</div>
  

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

Ответ №2:

Одним из способов было бы использование канала, это также быстрее (если оно чистое), чем использование сервиса

 @Pipe({ name: 'hasPermission' })
export class HasPermission implements PipeTransform {

  transform(permissions: string[], required: string[]): boolean {
    return permissions.some((current) => required.some((req) => current === req));
  }
}
  

Используйте его как

  <div class="customer-entry" *ngIf="userRoles | hasPermission: ['Admin', 'Superuser']">
    <div>
      <span class="badge badge-warning">allowed</span>
    </div>
  </div>
  

Или

   <div class="customer-entry" *ngFor="lot role of userRoles">
    <div *ngIf="[role] | hasPermission: ['Admin', 'Superuser']">
      <span class="badge badge-warning">allowed</span>
    </div>
  </div>
  

Не тестировал, это всего лишь прототип