javascript - 有没有办法将多个(和不同的)参数从 Lightning Web 组件 (LWC) 中的 JS 传递到 Apex Controller 类?

标签 javascript salesforce apex salesforce-lightning lwc

我目前遇到了一个问题,希望这里有人能帮助我。我当然也希望这是问它的正确地方。

我正在尝试在触发事件时创建一个自定义发票记录及其对应的发票行记录。我已经有了一些逻辑来收集 JS 中选定行的 ID。

我已经能够创建发票记录(使用 LDS)和发票行记录(使用 Apex),但似乎无法为发票行记录传递发票 ID。我知道我能够创建记录,因为当我使用硬编码的发票 ID 对其进行测试时它有效。

是否可以将 List 和 String 的多个参数传递给 LWC 中的 Apex 方法?

如果有任何帮助,我将不胜感激。提前致谢!

JS

    selectedRowsEvent(event) {

    ...some codes here...

    this.selectedRecords = Array.from(conIds);
    }


    handleSave() {

         **invId;**

         ...some codes here...

        createRecord(recordInput)
        .then(invoice => {
            **this.invId = invoice.Id;**  
            **createInvLines({ lstConIds : this.selectedRecords, invoiceId : this.invId})**
        }).catch(error => {

          ...some codes here...

          });
    }

Controller

@AuraEnabled
    public static void createInvLines(list<Id> lstConIds, string invoiceId){
        if(lstConIds.size() > 0){
            List<OpportunityLine__c> oppLst = new List<OpportunityLine__c>([SELECT Id, Description__c FROM OpportunityLine__c WHERE Id = :lstConIds]);
            try {
                List<InvoiceLine__c> lstInvLinesToInsert = new List<InvoiceLine__c>();
                for(OpportunityLine__c idCon : oppLst) {
                    lstInvLinesToInsert.add(new InvoiceLine__c(**InvoiceId__c = invoiceId**, Description__c = idCon.Description__c));
                }
                if(!lstInvLinesToInsert.isEmpty()) {
                    insert lstInvLinesToInsert;
                }
            }
            catch(Exception ex) {
                throw new AuraHandledException(ex.getMessage());
            }
        }
    }  

最佳答案

是的,您可以将复杂参数传递给标记为 @AuraEnabled 的方法。在客户端,它将是一个具有正确字段名称的 JSON 对象,就像您已经拥有 { lstConIds : this.selectedRecords, invoiceId : this.invId} 一样。在 Apex 端,它可以是一个具有多个参数或只有 1 个参数的函数(一些辅助包装类,同样具有正确的字段名称)。 Salesforce 会在调用您的代码之前为您“解压”该 JSON 并将其放入正确的字段中。

您喜欢哪个更干净。我倾向于使用 wrapper 。如果你有一个可重用的类似服务的函数,并且你想稍后添加一些可选参数 - 你只需将新字段放在包装类中并完成工作。向其他顶点代码中使用的函数添加新参数可能不那么容易,有点困惑。

(在您的场景中,我肯定会尝试将发票和订单项创建为 1 个调用,因此如果有任何失败 - 正常的事务回滚将帮助您。如果其中一个项目失败 - 您不想只剩下发票抬头,对吧?)

你见过https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.apex吗? ?这是一堵文字墙,但它提到了有趣的例子,在那里搜索“apexImperativeMethodWithParams”。

在这里查看 JS 文件:https://github.com/trailheadapps/lwc-recipes/tree/master/force-app/main/default/lwc/apexImperativeMethodWithComplexParams 看看它是如何调用的

ApexTypesController {
    @AuraEnabled(cacheable=true)
    public static String checkApexTypes(CustomWrapper wrapper) {
...

在哪里CustomWrapper

public with sharing class CustomWrapper {
    class InnerWrapper {
        @AuraEnabled
        public Integer someInnerInteger { get; set; }
        @AuraEnabled
        public String someInnerString { get; set; }
    }

    @AuraEnabled
    public Integer someInteger { get; set; }
    @AuraEnabled
    public String someString { get; set; }
    @AuraEnabled
    public List<InnerWrapper> someList { get; set; }
}

关于javascript - 有没有办法将多个(和不同的)参数从 Lightning Web 组件 (LWC) 中的 JS 传递到 Apex Controller 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61494118/

相关文章:

javascript - 从 iframe 调用 jquery 插件中的函数

javascript - 过滤数组中的重复值

salesforce - 从Apex/VisualForce检测Salesforce版本和/或功能

java - 从hybris平台获取数据

salesforce - Visualforce 电子邮件模板单元测试

java - 为什么 Apex 在这个集合上向后迭代?

javascript - 如何在动态元素上绑定(bind) bootstrap popover

javascript - 文本框中空白、制表符或空格的正则表达式

angular - 当提供商因缺少授权 header 而拒绝飞行前请求时,让客户端 CORS 工作

java - Camel Salesforce 组件 REST API salesforce :query cannot retrieve records