Регистрация  |  Вход

Как вызвать метод Apex в js, чтобы он корректно работал?

Есть файлы - html(представляет собой форму, в которой уже заполнены данные и эти данные должны заноситься во входные параметры метода Apex).
<template>
<lightning-card title="Send Invoice" icon-name="standard:contact" record-id={recordId}>
<template if:true={record}>
<div class="slds-m-around_medium">
<lightning-input readonly variant="standart" name="subject" label="Email Subject" value={record.Opportunity.Invoice_Number__c}></lightning-input>
<lightning-input readonly variant="standart" label="Recipient Name" value={record.Contact.FirstName}></lightning-input>
<lightning-input readonly variant="standart" name="address" label="Recipient Email" value={record.Contact.Email}></lightning-input>
<lightning-input variant="standart" name="body" label="Email Body"></lightning-input>
</div>
</template>
<template if:true={error}>
<c-error-panel errors={error}></c-error-panel>
</template>
<div slot="footer">
<lightning-button variant="destructive" label="Cancel" onclick={closeAction} ></lightning-button>
&nbsp; &nbsp;
<lightning-button variant="brand" label="Send" onclick={handleSend} ></lightning-button>
</div>
</lightning-card>
</template>

также есть js файл, в который я импортирую метод apex, но он не отрабатывает(

import { LightningElement, api, track, wire } from 'lwc';
import getOpportunityContactRoles from '@salesforce/apex/OpportunityDataHandler.getOpportunityContactRoles';
import {CloseActionScreenEvent} from 'lightning/actions';
import sendMail from '@salesforce/apex/EmailManager.sendMail';

export default class WireFunction extends LightningElement {
@api recordId;
@track record;
@track error;

@wire(getOpportunityContactRoles, { recordId: '$recordId'})
wiredContacts({ error, data }) {
if (data) {
this.record = data;
this.error = undefined;
} else if (error) {
this.error = error;
this.record = undefined;
}
}

closeAction(){
this.dispatchEvent(new CloseActionScreenEvent());
}

handleSend(){
this.sendMail();
this.dispatchEvent(new CloseActionScreenEvent());
}
}

и наконец Apex

public with sharing class EmailManager {
@AuraEnabled(cacheable = true)
public static void sendMail(String address, String subject, String body) {
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
String[] toAddresses = new String[] {address};
mail.setToAddresses(toAddresses);
mail.setSubject(subject);
mail.setPlainTextBody(body);
Messaging.SendEmailResult[] results = Messaging.sendEmail(
new Messaging.SingleEmailMessage[] { mail });
}
}


Логика заключается в том, что во входные параметры метода sendEmail() должны передаваться поля, которые уже заполнены данными в html, т.е. address - он же email, subject и body. Однако при нажатии на кнопку на почту не приходит никакое письмо
Есть файлы - html(представляет собой форму, в которой уже заполнены данные и эти данные должны заноситься во входные параметры метода Apex).
<template>
    <lightning-card title="Send Invoice" icon-name="standard:contact" record-id={recordId}>
        <template if:true={record}>
            <div class="slds-m-around_medium">
                <lightning-input readonly variant="standart" name="subject" label="Email Subject" value={record.Opportunity.Invoice_Number__c}></lightning-input>
                <lightning-input readonly variant="standart" label="Recipient Name" value={record.Contact.FirstName}></lightning-input>
                <lightning-input readonly variant="standart" name="address" label="Recipient Email" value={record.Contact.Email}></lightning-input>
                <lightning-input variant="standart" name="body" label="Email Body"></lightning-input>
            </div>
        </template>
        <template if:true={error}>
            <c-error-panel errors={error}></c-error-panel>
        </template>
        <div slot="footer">
            <lightning-button variant="destructive" label="Cancel" onclick={closeAction} ></lightning-button>
            &nbsp; &nbsp;
            <lightning-button  variant="brand" label="Send" onclick={handleSend} ></lightning-button>
        </div>
    </lightning-card>
</template>

также есть js файл, в который я импортирую метод apex, но он не отрабатывает(

import { LightningElement, api, track, wire } from 'lwc';
import getOpportunityContactRoles from '@salesforce/apex/OpportunityDataHandler.getOpportunityContactRoles';
import {CloseActionScreenEvent} from 'lightning/actions';
import sendMail from '@salesforce/apex/EmailManager.sendMail';

export default class WireFunction extends LightningElement {
    @api recordId;
    @track record;
    @track error;
    
    @wire(getOpportunityContactRoles, { recordId: '$recordId'})
    wiredContacts({ error, data }) {
        if (data) {
            this.record = data;
            this.error = undefined;
        } else if (error) {
            this.error = error;
            this.record = undefined;
        }
    }

    closeAction(){
        this.dispatchEvent(new CloseActionScreenEvent());
    }

    handleSend(){
     this.sendMail();
     this.dispatchEvent(new CloseActionScreenEvent());
    }
}

и наконец Apex 

public with sharing class EmailManager {
    @AuraEnabled(cacheable = true)
    public static void sendMail(String address, String subject, String body) {
        Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
        String[] toAddresses = new String[] {address};
        mail.setToAddresses(toAddresses);
        mail.setSubject(subject);
        mail.setPlainTextBody(body);
        Messaging.SendEmailResult[] results = Messaging.sendEmail(
                                 new Messaging.SingleEmailMessage[] { mail });
    }
}


Логика заключается в том, что во входные параметры метода sendEmail() должны передаваться поля, которые уже заполнены данными в html, т.е. address - он же email, subject и body. Однако при нажатии на кнопку на почту не приходит никакое письмо
Самый главный совет для решения подобных задач -
научиться пользоваться

console.log(...)

System.debug(...)

Пока этот простейший дзен не постигнут нечего делать в программировании.

А теперь по существу -
где параметры (address, subject, body) из JS передаются в Apex, я вижу только пустой вызов Apex метода без параметров.
Самый главный совет для решения подобных задач - 
научиться пользоваться 

[b]console.log(...)[/b]

[b]System.debug(...)[/b]

Пока этот простейший дзен не постигнут нечего делать в программировании.

А теперь по существу - 
где параметры (address, subject, body) из JS передаются в Apex, я вижу только пустой вызов Apex метода без параметров.
hoodie
Есть файлы - html(представляет собой форму, в которой уже заполнены данные и эти данные должны заноситься во входные параметры метода Apex).
<template>
<lightning-card title="Send Invoice" icon-name="standard:contact" record-id={recordId}>
<template if:true={record}>
<div class="slds-m-around_medium">
<lightning-input readonly variant="standart" name="subject" label="Email Subject" value={record.Opportunity.Invoice_Number__c}></lightning-input>
<lightning-input readonly variant="standart" label="Recipient Name" value={record.Contact.FirstName}></lightning-input>
<lightning-input readonly variant="standart" name="address" label="Recipient Email" value={record.Contact.Email}></lightning-input>
<lightning-input variant="standart" name="body" label="Email Body"></lightning-input>
</div>
</template>
<template if:true={error}>
<c-error-panel errors={error}></c-error-panel>
</template>
<div slot="footer">
<lightning-button variant="destructive" label="Cancel" onclick={closeAction} ></lightning-button>
&nbsp; &nbsp;
<lightning-button variant="brand" label="Send" onclick={handleSend} ></lightning-button>
</div>
</lightning-card>
</template>

также есть js файл, в который я импортирую метод apex, но он не отрабатывает(

import { LightningElement, api, track, wire } from 'lwc';
import getOpportunityContactRoles from '@salesforce/apex/OpportunityDataHandler.getOpportunityContactRoles';
import {CloseActionScreenEvent} from 'lightning/actions';
import sendMail from '@salesforce/apex/EmailManager.sendMail';

export default class WireFunction extends LightningElement {
@api recordId;
@track record;
@track error;

@wire(getOpportunityContactRoles, { recordId: '$recordId'})
wiredContacts({ error, data }) {
if (data) {
this.record = data;
this.error = undefined;
} else if (error) {
this.error = error;
this.record = undefined;
}
}

closeAction(){
this.dispatchEvent(new CloseActionScreenEvent());
}

handleSend(){
this.sendMail();
this.dispatchEvent(new CloseActionScreenEvent());
}
}

и наконец Apex

public with sharing class EmailManager {
@AuraEnabled(cacheable = true)
public static void sendMail(String address, String subject, String body) {
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
String[] toAddresses = new String[] {address};
mail.setToAddresses(toAddresses);
mail.setSubject(subject);
mail.setPlainTextBody(body);
Messaging.SendEmailResult[] results = Messaging.sendEmail(
new Messaging.SingleEmailMessage[] { mail });
}
}


Логика заключается в том, что во входные параметры метода sendEmail() должны передаваться поля, которые уже заполнены данными в html, т.е. address - он же email, subject и body. Однако при нажатии на кнопку на почту не приходит никакое письмо

1 - Cacheable = false.
2 - проверить включены ли емейлы на орге - Email Dliverability
3 - this.sendMail(); это хорошо, но в твоем случае должен быть sendEmail()
4 - sendEmail({ address: 'address' , subject: 'subject', body: 'body'}
[quote="hoodie"]Есть файлы - html(представляет собой форму, в которой уже заполнены данные и эти данные должны заноситься во входные параметры метода Apex).
<template>
    <lightning-card title="Send Invoice" icon-name="standard:contact" record-id={recordId}>
        <template if:true={record}>
            <div class="slds-m-around_medium">
                <lightning-input readonly variant="standart" name="subject" label="Email Subject" value={record.Opportunity.Invoice_Number__c}></lightning-input>
                <lightning-input readonly variant="standart" label="Recipient Name" value={record.Contact.FirstName}></lightning-input>
                <lightning-input readonly variant="standart" name="address" label="Recipient Email" value={record.Contact.Email}></lightning-input>
                <lightning-input variant="standart" name="body" label="Email Body"></lightning-input>
            </div>
        </template>
        <template if:true={error}>
            <c-error-panel errors={error}></c-error-panel>
        </template>
        <div slot="footer">
            <lightning-button variant="destructive" label="Cancel" onclick={closeAction} ></lightning-button>
            &nbsp; &nbsp;
            <lightning-button  variant="brand" label="Send" onclick={handleSend} ></lightning-button>
        </div>
    </lightning-card>
</template>

также есть js файл, в который я импортирую метод apex, но он не отрабатывает(

import { LightningElement, api, track, wire } from 'lwc';
import getOpportunityContactRoles from '@salesforce/apex/OpportunityDataHandler.getOpportunityContactRoles';
import {CloseActionScreenEvent} from 'lightning/actions';
import sendMail from '@salesforce/apex/EmailManager.sendMail';

export default class WireFunction extends LightningElement {
    @api recordId;
    @track record;
    @track error;
    
    @wire(getOpportunityContactRoles, { recordId: '$recordId'})
    wiredContacts({ error, data }) {
        if (data) {
            this.record = data;
            this.error = undefined;
        } else if (error) {
            this.error = error;
            this.record = undefined;
        }
    }

    closeAction(){
        this.dispatchEvent(new CloseActionScreenEvent());
    }

    handleSend(){
     this.sendMail();
     this.dispatchEvent(new CloseActionScreenEvent());
    }
}

и наконец Apex 

public with sharing class EmailManager {
    @AuraEnabled(cacheable = true)
    public static void sendMail(String address, String subject, String body) {
        Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
        String[] toAddresses = new String[] {address};
        mail.setToAddresses(toAddresses);
        mail.setSubject(subject);
        mail.setPlainTextBody(body);
        Messaging.SendEmailResult[] results = Messaging.sendEmail(
                                 new Messaging.SingleEmailMessage[] { mail });
    }
}


Логика заключается в том, что во входные параметры метода sendEmail() должны передаваться поля, которые уже заполнены данными в html, т.е. address - он же email, subject и body. Однако при нажатии на кнопку на почту не приходит никакое письмо[/quote]

1 - Cacheable = false.
2 - проверить включены ли емейлы на орге - Email Dliverability
3 - this.sendMail(); это хорошо, но в твоем случае должен быть sendEmail()
4 - sendEmail({ address: 'address' , subject: 'subject', body: 'body'}
Вообще над этим кодов в шапке еще работать и работать.
Там нет еще важной составляющие - работы с inputs. Надо из них еще значения достать.
Тут работы и работы.
Вообще над этим кодов в шапке еще работать и работать. 
Там нет еще важной составляющие - работы с inputs. Надо из них еще значения достать. 
Тут работы и работы. 
Без two-way binding конечно печаль в LWC. Столько лишнего кода. По сравнению с Ангуляр скорость разработки раз в 5 медленнее, и кода соотвественно на столько же больше
Без two-way binding конечно печаль в LWC. Столько лишнего кода. По сравнению с Ангуляр скорость разработки раз в 5 медленнее, и кода соотвественно на столько же больше :so-sad: