You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击确认弹窗取消按钮时重置PrimeNg inputSwitch状态的问题

解决PrimeNg InputSwitch取消确认后状态回滚问题

问题核心:点击InputSwitch时UI会立即切换状态,取消确认后未将状态回滚到原始值。通过临时状态变量单独控制开关显示,确认后再同步到业务模型即可解决。

步骤1:修改HTML绑定

将原单向绑定改为绑定到临时状态变量,用双向绑定[(ngModel)]确保UI与临时变量同步:

<!-- 若在*ngFor循环中渲染多个quote,给每个quote绑定对应临时状态 -->
<p-inputSwitch [(ngModel)]="tempChecked[quote.id]" 
  (onChange)="onChangeMainQuote($event, opportunity, quote.id)"> 
</p-inputSwitch>

步骤2:初始化临时状态变量

在组件类中定义临时状态对象,并在获取业务数据后初始化每个quote的选中状态:

// 临时存储每个quote的开关状态
tempChecked: { [quoteId: string]: boolean } = {};

// 在获取opportunity和quotes数据后执行初始化
initTempChecked() {
  this.quotes.forEach(quote => {
    this.tempChecked[quote.id] = this.opportunity.mainQuoteId === quote.id;
  });
}

步骤3:调整确认逻辑

在onChangeMainQuote方法中,先将开关状态回滚到原始值,再根据确认结果决定是否更新业务模型:

onChangeMainQuote(event, opportunity: Opportunity, mainQuoteId: string) {
  // 立即回滚开关状态到原始值(点击后UI已切换,先还原)
  this.tempChecked[mainQuoteId] = !event.checked;

  this.confirmationDialogService.confirm('Changement de devis principal',
      'Etes-vous sur de vouloir changer de devis principal ?', 'LABEL_CONFIRM_DELETION', 'LABEL_CANCEL')
      .then((confirmed) => {
          if (confirmed) {
              // 确认后更新业务模型
              opportunity.mainQuoteId = mainQuoteId;
              // 同步当前quote选中状态,同时取消其他quote的选中(单选场景)
              Object.keys(this.tempChecked).forEach(id => {
                this.tempChecked[id] = id === mainQuoteId;
              });
              this.cdr.detectChanges();
          }
      })
      .catch(() => {
          // 异常时确保状态与业务模型一致
          this.tempChecked[mainQuoteId] = opportunity.mainQuoteId === mainQuoteId;
      });
}

补充说明

  • 临时状态变量tempChecked用于隔离UI显示与业务模型,避免直接操作业务模型导致的状态不一致。
  • 若业务不要求单选,可移除“取消其他quote选中状态”的循环代码。

内容的提问来源于stack exchange,提问作者R.Walid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 06:56:54