1

apex:commandbuttonVisualforce (Salesforce)の検証ピースを jQuery しようとしています。AJAX 呼び出しでない場合は正常に動作してoncompleteいます。つまり、ボタンのプロパティと再レンダリング プロパティを設定しない場合です。しかし、そうすると、type='button'代わりに入力が行われ'submit'ます。したがって、のアクション属性で指定したメソッドapex:commandbuttonは、検証結果 (trueまたはfalse) に関係なく呼び出されます。

そのために、次のオプションを試しましたが、何もうまくいきませんでした。

これは私が欲しいものです:

  1. フォーム フィールドに入力する
  2. コマンドボタンをクリックすると、jQueryを使用して検証する必要があります(現在、タイプが送信の場合は機能していますが、残念ながらAJAX呼び出しに変更するとtype='button'機能しなくなります)
  3. アクション メソッドを呼び出しますaction="{!SaveUserAndSendEmail}"(検証に合格すると、連絡先レコードが作成されます)
  4. Oncomplete="clickCreateUserButton();"(これにより、アクション メソッドによって連絡先レコードが作成されると、ユーザー レコードが作成されます。

私が試したオプション:

  • 方法 1 :

を。内部に次の JQuery スクリプトを追加しますdocument.ready()

j$('[id$=SaveUserAndSendEmail]').click( 
                    function() 
                    {
                        if (j$('[id$=theForm]').validate().form() == true)
                            {
                                isValid = true;
                                SetContinueProcess(true);
                                //callSaveUserAndSendEmailHidden();
                                //j$('[id$=SaveUserAndSendEmailHidden]').click();                                
                                return true;
                            }
                            else
                            {
                                isValid = false;
                                SetContinueProcess(false);                                
                                return false;
                            }
                    }
); 

b. ご覧のとおり、actionsupport 関数を呼び出してプロパティ ContinueProcess を設定する setContinueProcess という関数を呼び出しました。false の場合、コントローラーのアクション メソッド内でアクションがブロックされます。

サーバー側に移動して検証メッセージをクリアするため、これは機能しませんでした。

  • 方法 2 :

を。上記と同じ Jquery メソッド。唯一の変更点は、 setContinueProcess を呼び出す代わりに、別のボタンを作成して display:none を使用して非表示にし、上記の if 条件内で jquery と通常の javascript の両方を使用してクリックしようとしたことdocument.getelementbyid("buttonid").click()です。これはアクション メソッドを呼び出し、連絡先レコードを作成しましたが、oncomplete メソッドは呼び出されませんでした。

  • 方法 3 :

を。hiddenbutton の代わりに同じ Jquery メソッドが ActionSupport 関数を呼び出し、ボタンに対して行ったように、アクション属性と oncomplete 属性でそのアクション メソッドを指定しました。アクションメソッドだけを呼び出して、oncomplete メソッドを呼び出さなかったとしても

  • 方法 4 :

を。同じjqueryメソッドは、アクションサポートでoncompleteメソッドを呼び出す代わりに、上記のif条件自体からアクションサポートメソッドとoncompleteメソッドの両方を呼び出しました:-

SaveandSend(); //Actionsupport method name which calls the controller's action method and creates the contact
CreateUser(); // Javascript method which clicks another button triggering the action method of that to create the user

この場合でも、2 番目のメソッドは呼び出されませんでした。

JavaScript コード:

 function callSimulateUserSave() {
                       var mybtn = document.getElementById('{!$Component.theForm.SimulateUserSave}');
                       mybtn.click();
                   }

Visualforce コード:

<apex:actionFunction name="SetContinueProcess">        
                <apex:param name="ContinueProcess" value="ArgValue" assignTo="{!ContinueProcess}" />
            </apex:actionFunction>
           --commented -- <apex:actionFunction name="SaveandSend"  action="{!SaveUserandSendEmail}" >        
            </apex:actionFunction> -- commented --
<apex:commandButton id="SaveUserAndSendEmail" value="Save and Send Activation Email" action="{!SaveUserandSendEmail}" rerender="junkpanel" oncomplete="if (j$('[id$=theForm]').validate().form() == true){callSimulateUserSave();}">

                            <apex:commandButton value="SimulateUserSave" id="SimulateUserSave" action="{!CreateUserRecord}" style="display:none;margin-left:5px;"/>

                            <apex:commandButton id="SaveUserAndSendEmailHidden" style="display:none;" value="Save and Send Activation Email"  action="{!SaveUserandSendEmail}" rerender="junkpanel" oncomplete="callSimulateUserSave()" >
                            </apex:commandButton>

-- 一部のコードをコメントアウトした可能性があります。これらは、解決策を達成するために試みたさまざまな方法/アプローチで試したものです。

4

3 に答える 3

0

これはあなたの質問に対する直接的な回答ではありませんが、私の経験では、Visualforce の使用を最小限に抑えています。これは遅く、このような問題をデバッグするのが難しい場合があります。通常、私の visualforce ページに関する visualforce は、apex:page タグを使用することだけです。

Visualforce マークアップの代わりに HTML マークアップを使用します。サーバー側の頂点コントローラーは、javascript から呼び出すリモート アクションのみで構成する必要があります。状態のクライアント側を保存し、リモート呼び出しに挿入します。

この方法でページの設計を開始すると、パフォーマンスが大幅に向上し、いくつかのガバナー制限を回避できるようになると思います。また、visualforce を使用しなくなり、代わりに書き込みを行うため、直面しているような問題が解消されます。 JavaScript は、はるかに重要な言語です。

于 2012-06-12T23:51:01.733 に答える
0

標準の HTML ボタンを使用して検証メソッド onClick を<apex:actionFunction>起動し、必要なすべてを検証したら (つまり、検証メソッドの最後または有効として返された場合) を使用してバックエンドを呼び出してみましたか? ? これは私が過去に使用したアプローチであり、問​​題が発生したことはありません。

于 2012-06-13T13:04:05.640 に答える