Salesforce Lightning 组件不会通过 Apex 调用更新记录,冻结
Salesforce Lightning Component will not update records via Apex call, freezes
问题概述: 目前正在编写 Lightning 组件以更新自定义对象上的记录。但是,每次我触发更新(通过 ui:button)时,页面都会冻结并且我在调试器或控制台中看不到任何错误。我这辈子都想不通为什么它不起作用。
上下文: 该组件有许多下拉列表,其中填充了记录(标签是记录名称)。在下拉列表中选择一个新值并点击 "Update" 调用下面的顶点来更改新选定项目上的自定义字段 (Status__c = 'Ready'),然后更新之前发生的记录它(Status__c = '完成)。我在初始化期间在另一个函数中执行所有安全和更新检查,因此您不会在此处看到它(如果需要,我可以 post 完整代码)。只是想让更新正常工作。
如果有人能告诉我错误的方法,我将永远感激 :]。一直是 Whosebug 的超级粉丝,现在我终于注册了,期待着做出贡献。感谢大家的抽空!
顶点:
@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>
可能是javascript导致error.As不知道错误很难解决,建议调试错误
开启调试模式。
一种。在“设置”中,单击“开发”>“Lightning 组件”。
b. Select 启用调试模式复选框。
C。单击保存。
在 Chrome 开发人员工具中,选中源选项卡中的 "Pause on Caught Exceptions" 复选框。这通常可以帮助找到问题的根源。其他浏览器可能有类似的选项。
如果您想逐步执行某些代码,请添加调试器语句。
调试器;
当您大致了解问题可能发生的位置时,这很有用。
调试器
https://developer.salesforce.com/docs/atlas.en-us.lightning.meta/lightning/debug_intro.htm
我认为问题在于您陷入了将客户端和服务器端控制器方法命名为相同的太常见的陷阱(在本例中为 updateMilestones) .尝试更改其中任何一个的名称以使它们独一无二,我希望这会让你 运行。
是的,这里有一个错误,我们中的许多人一直在大声疾呼要修复它!
此外,我们在此处 https://salesforce.stackexchange.com/ 有一个非常活跃的 Salesforce 特定 Stack Exchange 论坛,它会得到更多关注 - 特别是如果您使用 lightning-components 标记您的 post(例如,我有我的帐户配置为在每个 post 标记有 lightning-components、locker-service 等时向我发送电子邮件提醒。
问题概述: 目前正在编写 Lightning 组件以更新自定义对象上的记录。但是,每次我触发更新(通过 ui:button)时,页面都会冻结并且我在调试器或控制台中看不到任何错误。我这辈子都想不通为什么它不起作用。
上下文: 该组件有许多下拉列表,其中填充了记录(标签是记录名称)。在下拉列表中选择一个新值并点击 "Update" 调用下面的顶点来更改新选定项目上的自定义字段 (Status__c = 'Ready'),然后更新之前发生的记录它(Status__c = '完成)。我在初始化期间在另一个函数中执行所有安全和更新检查,因此您不会在此处看到它(如果需要,我可以 post 完整代码)。只是想让更新正常工作。
如果有人能告诉我错误的方法,我将永远感激 :]。一直是 Whosebug 的超级粉丝,现在我终于注册了,期待着做出贡献。感谢大家的抽空!
顶点:
@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>
可能是javascript导致error.As不知道错误很难解决,建议调试错误
开启调试模式。 一种。在“设置”中,单击“开发”>“Lightning 组件”。 b. Select 启用调试模式复选框。 C。单击保存。
在 Chrome 开发人员工具中,选中源选项卡中的 "Pause on Caught Exceptions" 复选框。这通常可以帮助找到问题的根源。其他浏览器可能有类似的选项。
如果您想逐步执行某些代码,请添加调试器语句。 调试器; 当您大致了解问题可能发生的位置时,这很有用。
调试器
https://developer.salesforce.com/docs/atlas.en-us.lightning.meta/lightning/debug_intro.htm
我认为问题在于您陷入了将客户端和服务器端控制器方法命名为相同的太常见的陷阱(在本例中为 updateMilestones) .尝试更改其中任何一个的名称以使它们独一无二,我希望这会让你 运行。
是的,这里有一个错误,我们中的许多人一直在大声疾呼要修复它!
此外,我们在此处 https://salesforce.stackexchange.com/ 有一个非常活跃的 Salesforce 特定 Stack Exchange 论坛,它会得到更多关注 - 特别是如果您使用 lightning-components 标记您的 post(例如,我有我的帐户配置为在每个 post 标记有 lightning-components、locker-service 等时向我发送电子邮件提醒。