2016-12-04 12 views
2

概要概要:現在、カスタムオブジェクトのレコードを更新するライトニングコンポーネントをコーディングしています。ただし、(ui:ボタンを使用して)更新をトリガするたびに、ページがフリーズし、デバッガまたはコンソールにエラーが表示されません。私の人生はなぜそれがうまくいかないのか理解できません。Salesforce Lightning ComponentはApexコールでレコードを更新しません。フリーズ

コンテキスト:コンポーネントには、レコード(レコード名であるラベル付き)が設定された多数のドロップダウンがあります。ドロップダウンで新しい値を選択し、 "Update"を押すと、選択した新しい項目のカスタムフィールド(Status__c = 'Ready')を変更するために下の頂点が呼び出され、その前に発生したレコードが更新されます(Status__c = 'Complete)。 initの間に私のセキュリティとアップデートのチェックを別の関数で行うので、ここには表示されません(必要に応じて完全なコードを投稿できます)。更新プログラムを動作させようとしているだけです。

誰かが私の方法の誤りを私に示すことができたら、私は永遠に感謝します。常にstackoverflowの巨大なファンであり、私が最終的にサインアップした今、貢献することを楽しみにしています。みなさんのお時間をありがとう!

アペックス:

@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> 

答えて

3

私は、問題は、あなたが(updateMilestones同じクライアント側とサーバー側のコントローラメソッドの両方に名前を付けるのすべて余りに共通の罠に陥っているということであると考えていこの場合)。どちらかの名前を変更してユニークにしてみてください。

はい、これにバグがあり、私たちの多くはそれを修正することについて非常に大きな騒音を出しています!

https://salesforce.stackexchange.com/のSalesforce固有のStack Exchangeフォーラムもあります。特に、雷のコンポーネントで投稿にタグを付けると(たとえば、投稿ごとにメールアラートを送信するようにアカウントを設定しています落雷部品、ロッカーサービスなどでタグ付けされています)。

+0

これは凍結の問題を解決しました。私が持っていたもう一つの問題は、オプションタグの大文字と小文字の区別でした。 idをIdに変更して、完全に機能しました。再度、感謝します! –

0

原因javascriptのかもしれませんエラーを知らなくても解決するのが難しいので、エラーをデバッグすることをお勧めします。

  1. デバッグモードをオンにします。 a。セットアップから、[開発]> [稲妻のコンポーネント]の順にクリックします。 b。デバッグモードを有効にするチェックボックスを選択します。 c。 [保存]をクリックします。

  2. Chromeデベロッパーツールでは、[ソース]タブの[キャッチされた例外で一時停止する]チェックボックスをオンにします。これはしばしば問題の原因を見つけるのに役立ちます。他のブラウザにも同様のオプションがあります。

  3. いくつかのコードをステップ実行する場合は、デバッガーステートメントを追加します。 デバッガ; これは、問題が発生している可能性がある大まかなアイデアがある場合に便利です。

デバッガ

https://developer.salesforce.com/docs/atlas.en-us.lightning.meta/lightning/debug_intro.htm

関連する問題