You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Angular中实现仅展品创建者可见删除按钮的问题求助

问题分析

你的代码里有两个关键问题导致删除按钮显示不符合预期:

  1. 错误的比较逻辑:你把exhibitsUserIds(一个数组)和currentUserId(单个ID值)做比较,数组和单个值永远不会相等,这会导致canDelete的判断完全错误。
  2. 全局变量覆盖问题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

火山引擎 最新活动