Есть ли способ передать несколько (и разные) параметры в класс контроллера Apex из JS в Lightning Web Components (LW C)? - PullRequest
1 голос
/ 29 апреля 2020

В данный момент я застрял в проблеме и надеялся, что кто-то здесь сможет мне помочь. Я также, конечно, надеюсь, что это правильное место, чтобы спросить это.

Я пытаюсь создать собственную запись счета-фактуры с соответствующими записями строки счета-фактуры после запуска события. У меня уже есть логи c для сбора идентификаторов выбранных строк в JS.

Я зашел так далеко, что смог создать запись счета-фактуры (используя LDS) и записи строки счета-фактуры (используя Apex), но не могу передать идентификатор счета-фактуры для записей строки счета-фактуры , Я знаю, что могу создавать записи, потому что это работает, когда я проверял это с жестко закодированным идентификатором счета.

Можно ли передать несколько параметров List и String методу Apex в LW C ?

Буду признателен за любую помощь. Заранее спасибо!

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

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Да, вы можете передавать сложные параметры методам, помеченным как @AuraEnabled. На стороне клиента это будет JSON объект с правильными именами полей, как у вас уже есть { lstConIds : this.selectedRecords, invoiceId : this.invId}. На стороне Apex это может быть функция с несколькими аргументами или просто с 1 аргументом (некоторый вспомогательный класс-обертка, опять же с правильными именами полей). Salesforce «распакует» это JSON для вас и поместит в правильные поля перед тем, как будет вызван ваш код.

Ваше предпочтение будет более чистым. Я склонен использовать обертки. Если у вас есть многократно используемая сервис-подобная функция, и вы хотите добавить некоторые дополнительные параметры позже - вы просто поместите новое поле в класс-оболочку, и работа будет выполнена. Может быть не так просто добавить новый параметр в функцию, используемую в другом апекс-коде, немного сложнее.

(в вашем сценарии я бы определенно попытался создать счет-фактуру и отдельные позиции как один вызов, поэтому в случае неудачи - нормальный откат транзакции поможет вам. если один из пунктов не удастся - вы не хотите оставлять только заголовок счета, верно?)

Вы видели 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; }
}
0 голосов
/ 29 апреля 2020

Проблема в том, что вставки асинхронны, и вы запускаете их синхронно. Таким образом, это означает, что вы пытаетесь вставить строки до завершения родительской записи.

// 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...

                 }); 
              );
            }
...