LWC模态框无法关闭求助(嵌套Aura作为Work Order快速动作)
问题描述
我开发了一个功能正常的LWC,想将其配置为Work Order对象的快速动作。由于Work Order无法直接使用LWC作为快速动作,我将该LWC嵌套在Aura组件中,再把Aura组件配置为快速动作按钮。目前遇到两个问题:
- 点击Cancel按钮时,模态框无法关闭
- 点击Submit按钮完成业务处理后,模态框也无法自动关闭
以下是相关代码,请帮忙排查原因:
LWC 模板代码
<template> <lightning-quick-action-panel> <div class="slds-grid slds-wrap"> <div class="slds-col slds-size_1-of-2 first-last-name"> <label class="slds-form-element__label slds-float_left your-info-label-field" for="otherSubject">Please enter the zip code</label> <lightning-input type="text" variant="label-hidden" label="Zip Code" value={zipCode} onchange={handleZipChange}></lightning-input> </div> </div> <div slot="footer"> <lightning-button variant="neutral" label="Cancel" onclick={closeAction}> </lightning-button> <lightning-button variant="brand" label="Add Order" onclick={saveAction} class="slds-m-left_x-small"> </lightning-button> </div> </lightning-quick-action-panel> </template>
LWC 逻辑代码
import { LightningElement, api, track } from 'lwc'; import {CloseActionScreenEvent} from 'lightning/actions'; import {getRecordNotifyChange} from 'lightning/uiRecordApi'; import getInfo from '@salesforce/apex/Order_QuickAction.getWipersInfo'; import addWoli from '@salesforce/apex/Order_QuickAction.addWipersToWO'; export default class OrderEntry extends LightningElement { @api recordId; @track zipCode; @track wResponse; @track wPartNumber; @track wPrice = 0.00; handleZipChange(event){ this.zipCode = event.target.value; } closeAction(event){ this.dispatchEvent(new CloseActionScreenEvent()); } saveAction(){ if(this.recordId){ getInfo({workOrderId: this.recordId, zipCode: this.zipCode}) .then(result => { console.log('the response is '+ this.result); this.wResponse = result; this.wPartNumber = result.PartNumber; this.wPrice = result.Price; this.wPrice = this.wipersPrice * 2; return addWoli({workOrderId: this.recordId, partNumber: this.wPartNumber, price: this.wPrice}) }).then(result => { getRecordNotifyChange( items [{recordId: this.recordId}]); this.closeAction(); }) .catch(error => { console.log('Error >>>> :: ' + JSON.stringify(error)); this.error = error; }); } } }
Aura 组件代码
<aura:component implements="force:lightningQuickActionWithoutHeader,force:hasRecordId"> <aura:html tag="style"> .slds-modal__container { min-width: 70vw; } </aura:html> <c:orderEntry recordId="{!v.recordId}"/> </aura:component>
Apex 控制器代码
public class Order_QuickAction { @AuraEnabled public static ResponseWrapp getWipersInfo (Id workOrderId, String zipCode){ WorkOrder wo = [SELECT Id, Vehicle__r.Car_Id__c FROM WorkOrder Where Id =:workOrderId]; System.debug('The card id is ' + wo.Vehicle__r.Car_Id__c); System.debug('The zipcode is ' + zipCode); System.debug('The response for wipers is ' + OrderCalls.getWipers(wo.Vehicle__r.Car_Id__c, zipCode)); return OrderCalls.getWipers(wo.Vehicle__r.Car_Id__c, zipCode); } @AuraEnabled public static Boolean addWipersToWO(Id workOrderId, String partNumber, Decimal price){ WorkOrderLineItem woli = new WorkOrderLineItem(); woli.WorkOrderId = workOrderId; woli.Part_Number__c = partNumber; woli.Type__c = 'Part'; //woli.Quantity = 2; //woli.UnitPrice = price; woli.Part_Type__c = 'Wipers'; insert woli; return true; } }
问题排查与修复方案
核心问题分析
- 事件传递失效:
lightning-quick-action-panel仅适用于直接注册为快速动作的LWC,嵌套在Aura组件中时,LWC抛出的CloseActionScreenEvent无法被Aura的快速动作容器识别。 - LJS代码错误:
- 未定义变量
this.wipersPrice,导致saveAction执行中断 getRecordNotifyChange调用语法错误,缺少正确的参数格式
- 未定义变量
- Aura组件未处理关闭逻辑:需要手动监听LWC的事件,触发Aura层面的快速动作关闭事件。
修复步骤
1. 修改LWC代码
- 移除
lightning-quick-action-panel(Aura已提供模态容器) - 修正变量和语法错误
- 自定义关闭事件,让Aura组件监听
修正后的LWC模板:
<template> <div class="slds-grid slds-wrap"> <div class="slds-col slds-size_1-of-2 first-last-name"> <label class="slds-form-element__label slds-float_left your-info-label-field" for="otherSubject">Please enter the zip code</label> <lightning-input type="text" variant="label-hidden" label="Zip Code" value={zipCode} onchange={handleZipChange}></lightning-input> </div> </div> <div class="slds-align_absolute-center slds-p-top_medium"> <lightning-button variant="neutral" label="Cancel" onclick={closeAction}> </lightning-button> <lightning-button variant="brand" label="Add Order" onclick={saveAction} class="slds-m-left_x-small"> </lightning-button> </div> </template>
修正后的LWC逻辑:
import { LightningElement, api, track } from 'lwc'; import { getRecordNotifyChange } from 'lightning/uiRecordApi'; import getInfo from '@salesforce/apex/Order_QuickAction.getWipersInfo'; import addWoli from '@salesforce/apex/Order_QuickAction.addWipersToWO'; export default class OrderEntry extends LightningElement { @api recordId; @track zipCode; @track wResponse; @track wPartNumber; @track wPrice = 0.00; handleZipChange(event) { this.zipCode = event.target.value; } closeAction() { // 自定义事件通知Aura关闭 this.dispatchEvent(new CustomEvent('closequickaction')); } saveAction() { if(this.recordId){ getInfo({workOrderId: this.recordId, zipCode: this.zipCode}) .then(result => { console.log('the response is '+ result); this.wResponse = result; this.wPartNumber = result.PartNumber; this.wPrice = result.Price; // 修正变量名错误 this.wPrice = this.wPrice * 2; return addWoli({workOrderId: this.recordId, partNumber: this.wPartNumber, price: this.wPrice}) }).then(() => { // 修正getRecordNotifyChange语法 getRecordNotifyChange([{recordId: this.recordId}]); this.closeAction(); }) .catch(error => { console.log('Error >>>> :: ' + JSON.stringify(error)); this.error = error; }); } } }
2. 修改Aura组件
- 监听LWC的自定义关闭事件,触发Aura的快速动作关闭事件
- 新增Aura控制器处理关闭逻辑
修正后的Aura组件:
<aura:component implements="force:lightningQuickActionWithoutHeader,force:hasRecordId"> <aura:html tag="style"> .slds-modal__container { min-width: 70vw; } </aura:html> <!-- 监听LWC的自定义关闭事件 --> <c:orderEntry recordId="{!v.recordId}" onclosequickaction="{!c.handleClose}"/> </aura:component>
新增Aura控制器(Controller.js):
({ handleClose : function(component, event, helper) { // 触发快速动作关闭 $A.get("e.force:closeQuickAction").fire(); } })
3. 可选:优化Apex代码
添加异常处理,避免未捕获的错误导致前端逻辑中断:
public class Order_QuickAction { @AuraEnabled public static ResponseWrapp getWipersInfo (Id workOrderId, String zipCode){ WorkOrder wo = [SELECT Id, Vehicle__r.Car_Id__c FROM WorkOrder Where Id =:workOrderId]; System.debug('The card id is ' + wo.Vehicle__r.Car_Id__c); System.debug('The zipcode is ' + zipCode); System.debug('The response for wipers is ' + OrderCalls.getWipers(wo.Vehicle__r.Car_Id__c, zipCode)); return OrderCalls.getWipers(wo.Vehicle__r.Car_Id__c, zipCode); } @AuraEnabled public static Boolean addWipersToWO(Id workOrderId, String partNumber, Decimal price){ try{ WorkOrderLineItem woli = new WorkOrderLineItem(); woli.WorkOrderId = workOrderId; woli.Part_Number__c = partNumber; woli.Type__c = 'Part'; woli.Quantity = 2; woli.UnitPrice = price; woli.Part_Type__c = 'Wipers'; insert woli; return true; } catch(Exception e){ System.debug('Error inserting WOLI: ' + e.getMessage()); throw new AuraHandledException('Failed to add item: ' + e.getMessage()); } } }
内容的提问来源于stack exchange,提问作者afzaaldeveloper1
相关产品推荐
相关产品推荐

