有没有办法将多个(和不同的)参数从闪电网络组件(LWC)中的 JS 传递给 Apex 控制器类?

Posted

技术标签:

【中文标题】有没有办法将多个(和不同的)参数从闪电网络组件(LWC)中的 JS 传递给 Apex 控制器类?【英文标题】:Is there a way to pass multiple (and different) parameters to an Apex Controller class from JS in Lightning Web Components (LWC)? 【发布时间】:2020-08-13 02:06:50 【问题描述】:

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

我正在尝试在触发事件时创建自定义发票记录及其对应的发票行记录。我已经有一些逻辑来收集 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...

          );
    

控制器

@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());
            
        
      

【问题讨论】:

原来是区分大小写的问题。将“this.invId = invoice.Id”更改为“this.invId = invoice.id”解决了该问题。在没有任何帮助的情况下,我这辈子都不会想到这一点。我已经标记了 eyecream 的答案,因为这样写肯定会更好,并且将来会这样做。 【参考方案1】:

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

您的偏好会更清洁。我倾向于使用包装器。如果您有一个可重用的类似服务的功能,并且您想稍后添加一些可选参数 - 您只需将新字段放入包装类并完成工作。在其他 apex 代码中使用的函数中添加新参数可能并不容易,有点混乱。

(在您的情况下,我肯定会尝试将发票和行项目创建为 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; 

【讨论】:

【参考方案2】:

问题是插入是异步的,而您正在同步触发它们。因此,这意味着您正在尝试在父记录完成之前插入行。

// CREATE THE INVOICE RECORD
    createRecord(recordInput)
        .then(invoice => 
                **this.invId = invoice.Id;**
                // Call the next function here

                   // CREATE THE INVOICE LINE RECORDS
                **createInvLines( lstConIds : this.selectedRecords, invoiceId : this.invId)**
                 .then(result => 
                   ...some codes here...
                  )
                 .catch(error => 
                   ...some codes here...

                 ); 
              );
            

【讨论】:

以上是关于有没有办法将多个(和不同的)参数从闪电网络组件(LWC)中的 JS 传递给 Apex 控制器类?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将雷鸟/闪电连接到 redmine 的日历?

区块链 分片技术和闪电网络区别

将闪电页面从沙盒部署到生产环境

用Liquid网络学习比特币闪电支付

Laravel(Livewire)中的组件拆分和保留参数

区块链的闪电网络是什么