我的项目中有一种情况,必须根据为特定登录用户指定的角色权限来隐藏内容。
因此,我们制作了一个名为<app-authorise>
的全局组件,它将根据用户的权限启用子级。
Component.ts
import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
import { GlobalService } from '../../../core/global/global.service';
@Component({
selector: 'app-authorise',
templateUrl: './app-authorise.component.html',
styleUrls: ['./app-authorise.component.scss'],
changeDetection: ChangeDetectionStrategy.Default
})
export class AuthoriseComponent {
@Input() public module: string;
@Input() public permission: string;
@Input() public field: string;
@Input() public role: string;
public currentUser: any = {};
public currentUserRoles = [];
constructor(private globalService: GlobalService) {
this.globalService.subscribeToUserSource((updatedUser: any) => {
this.currentUser = updatedUser;
this.currentUserRoles = updatedUser.rolePermissions;
});
}
get enable() {
const {
currentUser,
currentUserRoles,
module,
permission,
role
} = this;
if (currentUser && currentUserRoles) {
return role ? this.hasRole(currentUserRoles, role) :
this.globalService.hasPermissionForModule({
currentUserRoles,
module,
permission,
});
}
return false;
}
public hasRole(currentUserRoles: any, role: string) {
return Boolean(currentUserRoles[role]);
}
}
Component.html
<ng-container>
<ng-content *ngIf="enable"></ng-content>
</ng-container>
UseCase
<app-authorise [module]="properties.modules.project" [permission]="properties.permissions.CREATE">
<app-psm-list></app-psm-list>
</app-authorise>
我们面临的实际问题是,即使在父组件中启用了子组件,子组件的 onInit()方法也会被调用。
任何想法,对此的建议将非常有帮助。
答案 0 :(得分:1)
您可以在将<app-psm-list>
组件投影到<app-authorise>
之前检查条件,以便在条件失败时不会调用app-psm-list
组件ngOnInit()
。
为此,您需要针对#authorise
组件的一些参考,例如app-authorise
<app-authorise #authorise [module]="properties.modules.project" [permission]="properties.permissions.CREATE">
<ng-conatiner *ngIf="authorise.enable">
<app-psm-list></app-psm-list>
</ng-conatiner>
</app-authorise>
app-authorise
内又不需要条件
应用授权
<ng-container>
<ng-content></ng-content>
</ng-container>
答案 1 :(得分:0)
发现此custom-permission-directive确实很有帮助。 可以使用指令代替组件。