Компонент Salesforce Lightning не будет обновлять записи через вызов Apex, зависает
Обзор проблемы: в настоящее время выполняется кодирование компонента Lightning для обновления записей в пользовательском объекте. Однако каждый раз, когда я запускаю обновление (с помощью кнопки ui:), страница зависает, и я не вижу никаких ошибок в отладчике или консоли. Не могу на всю жизнь понять, почему это не сработает.
Контекст: у компонента есть несколько раскрывающихся списков, которые заполняются записями (с меткой, являющейся именем записи). Выбор нового значения в раскрывающемся списке и нажатие кнопки "Обновить" вызывает указанную ниже вершину для изменения настраиваемого поля (Status__c = "Готово") для нового выбранного элемента, а затем обновляет записи, предшествующие ему (Status__c = 'Завершено). Я делаю все свои проверки безопасности и обновлений в другой функции во время инициализации, так что вы не увидите этого здесь (я могу опубликовать полный код, если это необходимо). Просто пытаюсь заставить работать обновление.
Я был бы вечно благодарен, если бы кто-то мог показать мне ошибку моих путей:]. Всегда был большим поклонником stackru и с нетерпением жду возможности внести свой вклад сейчас, когда я наконец-то зарегистрировался. Спасибо за ваше время всем!
Apex:
@AuraEnabled
public static void updateMilestones(String deployId,Boolean prodChanged,String newProdMile) {
if( prodChanged == true && newProdMile != null ) {
try {
decimal newProdStepNum;
List <Milestone__c> newReadyProdMile = New List<Milestone__c>();
for(Milestone__c mil1:[SELECT id, Status__c, Step_Order__c FROM Milestone__c
WHERE Deployment__c = :deployID
AND id = :newProdMile LIMIT 1]){
mil1.Status__c = 'Ready';
newProdStepNum = mil1.Step_Order__c;
newReadyProdMile.add(mil1);
}
List <Milestone__c> prodMilesComplete = New List<Milestone__c>();
for(Milestone__c mil2:[SELECT id, Type__C, Status__c FROM Milestone__c
WHERE Deployment__c = :deployID
AND Step_Order__c < :newProdStepNum
AND Type__c = 'Production'
AND Status__c != 'Complete'
AND Status__c != 'Revised']){
mil2.Status__c = 'Complete';
prodMilesComplete.add(mil2);
}
update newReadyProdMile;
update prodMilesComplete;
}
catch (DmlException e) {
throw new AuraHandledException('Sorry, the update did not work this time. Refresh and try again please!');
}
}
}
Javascript:
updateMilestones : function(component, event, helper) {
// update milestones server-side
var action = component.get("c.updateMilestones");
action.setParams({
deployId : component.get("v.recordId"),
newProdMile : component.find("prod-mile-select").get("v.value"),
prodChanged : component.get("v.prodChanged")
});
// Add callback behavior for when response is received
action.setCallback(this, function(response) {
var state = response.getState();
if (component.isValid() && state === "SUCCESS") {
// re-run the init function to refresh the data in the component
helper.milesInit(component);
// refresh record detail
$A.get("e.force:refreshView").fire();
// set Update Changed Milestones button back to disabled
component.find("updateButton").set("v.disabled","true");
// show success notification
var toastEvent = $A.get("e.force:showToast");
toastEvent.setParams({
"title": "Success!",
"message": "Milestones have been updated successfully."
});
toastEvent.fire();
}
});
// Send action off to be executed
$A.enqueueAction(action);
}
Составная часть:
<aura:component controller="auraMilestonesController_v2"
implements="force:appHostable,flexipage:availableForRecordHome,force:hasRecordId,force:lightningQuickAction">
<ltng:require scripts="{!$Resource.lodash}" afterScriptsLoaded="{!c.doInit}"/>
<aura:attribute name="recordId" type="String" />
<aura:attribute name="prodMiles" type="Milestone__c[]"/>
<aura:attribute name="prodChanged" type="Boolean" default="false"/>
<!-- FORM -->
<div class="slds-col slds-col--padded slds-p-top--large" id="theform">
<form class="slds-form--stacked">
<!-- UPDATE BUTTON -->
<div class="slds-form-element">
<ui:button aura:id="updateButton" label="Update Changed Milestones" press="{!c.updateMilestones}"
class="slds-button slds-button--brand slds-align--absolute-center" disabled="true"/>
</div>
<hr style="color: #005fb2;background-color: #005fb2;"/>
<!-- PRODUCTION -->
<div aura:id="prod-section">
<div class="slds-form-element">
<label class="slds-form-element__label" for="milestone">Production Milestone</label>
<div class="slds-form-element__control">
<div class="slds-select_container">
<ui:inputSelect aura:id="prod-mile-select" class="slds-select" change="{!c.prodChange}">
<option value="" >--Select One--</option>
<aura:iteration items="{!v.prodMiles}" var="m">
<aura:if isTrue="{!m.Status__c == 'Ready'}">
<option value="{!m.id}" selected="true">{!m.Name} ({!m.User_Name__c})</option>
</aura:if>
<aura:if isTrue="{!m.Status__c == 'Not Ready'}">
<option value="{!m.id}">{!m.Name} ({!m.User_Name__c})</option>
</aura:if>
</aura:iteration>
<option value="completeProdMile" id="completeProdMile">All Production Milestones Complete</option>
</ui:inputSelect>
</div>
</div>
</div>
<div class="slds-form-element">
<label class="slds-form-element__label" for="description">Description</label>
<div class="slds-textarea">
<aura:iteration items="{!v.prodMiles}" var="m">
<aura:if isTrue="{!m.Status__c == 'Ready'}">{!m.Description__c}</aura:if>
<!-- <aura:set attribute="else">All production milestones have been completed.</aura:set> -->
</aura:iteration>
</div>
<hr style="color: #005fb2;background-color: #005fb2;"/>
</div>
</div>
<!-- END PRODUCTION -->
</form>
</div>
<!-- / FORM -->
</aura:component>
2 ответа
Я полагаю, что проблема заключается в том, что вы попали в слишком распространенную ловушку именования как на стороне клиента, так и на стороне контроллера, то есть метода контроллера (в данном случаеupdateMilestones). Попробуйте изменить имя любого из них, чтобы сделать их уникальными, и я ожидаю, что это заставит вас работать.
Да, в этом есть ошибка, и многие из нас очень громко шумят о ее исправлении!
Также у нас есть очень активный форум по Stack Exchange, посвященный Salesforce, здесь https://salesforce.stackexchange.com/ которому будет уделено больше внимания, особенно если вы пометите свои сообщения компонентами lightning (например, моя учетная запись настроена для отправки мне оповещение по электронной почте о каждом сообщении, помеченном компонентами lightning, locker-service и т. д.).
Это может быть javascript, вызывающий ошибку. Поскольку ее трудно решить, не зная ошибки, я бы посоветовал вам отладить ошибку.
Включите режим отладки. а. В меню "Настройка" выберите "Разработка"> "Компоненты молнии". б. Установите флажок Включить режим отладки. с. Нажмите Сохранить.
В Chrome Developer Tools установите флажок "Приостановить при возникновении исключений" на вкладке "Источники". Это часто может помочь найти источник проблемы. Другие браузеры могут иметь аналогичные параметры.
Добавьте оператор отладчика, если вы хотите пройти через некоторый код. отладчик; Это полезно, когда у вас есть приблизительное представление о том, где может возникнуть проблема.
отладчик
https://developer.salesforce.com/docs/atlas.en-us.lightning.meta/lightning/debug_intro.htm