Angular中实现仅展品创建者可见删除按钮的问题求助
问题分析
你的代码里有两个关键问题导致删除按钮显示不符合预期:
- 错误的比较逻辑:你把
exhibitsUserIds(一个数组)和currentUserId(单个ID值)做比较,数组和单个值永远不会相等,这会导致canDelete的判断完全错误。 - 全局变量覆盖问题:
canDelete是一个组件级的全局变量,在循环遍历展品时,它会被最后一个展品的判断结果覆盖,最终所有展品的删除按钮都会显示同一个状态(要么全显示,要么全隐藏)。
解决方案
我们需要给每个展品单独判断是否可删除,而不是用一个全局变量。这里有两种简单的实现方式:
方式一:在TS中给每个展品添加可删除标记
修改你的getCurrentUser函数,去掉exhibitsUserIds数组和全局canDelete,直接给每个展品添加canDelete属性:
getCurrentUser() { this.userService.getCurrent() .then( (response) => { this.currentUserId = response.id; this.exhibitService.getAllExhibits(1, this.maxNumberOfMarkers) .then( (data) => { this.allExhibits = data.items.map(exhibit => { // 给每个展品添加canDelete属性,判断当前用户是创建者或管理员 return { ...exhibit, canDelete: exhibit.userId === this.currentUserId || this.isSupervisor }; }); } ); } ); }
注意:这里结合了
isSupervisor,如果管理员也需要删除权限的话,这样处理更合理;如果不需要,去掉|| this.isSupervisor即可。
然后修改HTML模板,直接判断当前展品的canDelete属性:
<div *ngIf="exhibit.canDelete"> <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>
方式二:直接在HTML模板中判断(更简洁)
如果不想修改TS代码,也可以直接在模板里做判断,省去给展品加属性的步骤:
<div *ngIf="exhibit.userId === currentUserId || isSupervisor"> <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>
同样,不需要管理员权限的话,去掉
|| isSupervisor即可。
额外注意点
- 确保
currentUserId和展品的userId类型一致(比如都是字符串或都是数字),如果类型不同,比较时会出错,可以用String(exhibit.userId) === String(this.currentUserId)来统一类型后比较。 - 因为
isSupervisor是异步获取的,可能会存在初始值为false的情况,导致管理员一开始看不到删除按钮。可以在getIsSupervisor的回调里,重新处理展品的可删除状态,或者在模板里加上*ngIf="currentUserId"确保用户信息加载完成后再渲染列表。
内容的提问来源于stack exchange,提问作者Radiant




