Проверка jQuery для visualforce для apex: commandbutton input type = 'button' вызов ajax

Я пытаюсь выполнить проверку jQuery для apex:commandbutton в visualforce (Salesforce). Он отлично работает, если это не вызов AJAX, я имею в виду, если не установить свойства oncomplete и перерисовки для кнопки. Но если я это сделаю, он сделает ввод type='button' вместо 'submit'. Таким образом, любой метод, который я указал в атрибуте действия apex:commandbutton, вызывается независимо от моего результата проверки (true или false).

Для этого я попробовал следующие варианты, и ничего не получилось.

Это то, что я хочу:

  1. Заполните поля формы
  2. При нажатии кнопки команды он должен проверить с помощью jQuery (на данный момент он работает, если его тип — submit, но, к сожалению, если я изменю его на вызов 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. Как видите, я вызвал функцию с именем setContinueProcess, которая вызывает функцию поддержки действий и устанавливает свойство ContinueProcess, и если оно ложно, я блокирую действие внутри метода действия в контроллере.

Это не сработало, потому что оно переходит на сторону сервера и очищает сообщения проверки.

  • Метод 2:

а. Тот же метод JQuery, что и указанный выше. Единственное изменение заключается в том, что вместо вызова setContinueProcess я попытался использовать другую кнопку и скрыл ее, используя display:none, и попытался щелкнуть ее из приведенного выше условия, если используется как jquery, так и обычный javascript document.getelementbyid("buttonid").click(); это вызвало метод действия и создало запись контакта, но метод oncomplete не был вызван.

  • Способ 3:

a. Тот же метод Jquery вместо hiddenbutton вызывал функцию ActionSupport и указывал метод действия в атрибуте действия и атрибуте oncomplete, как я сделал для кнопки. Даже он вызывал только метод действия и не вызывал метод oncomplete

  • Метод 4:

a. Тот же метод jquery, вместо вызова метода oncomplete в actionsupport, вызывал как метод поддержки действий, так и метод oncomplete из приведенного выше условия if :-

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

даже в этом случае второй метод не вызывался.

Код 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>

-- Возможно, я прокомментировал некоторый код, это те, которые я пробовал для разных методов/подходов, которые я пытался найти для решения


person Sathya    schedule 12.06.2012    source источник


Ответы (3)


Хотя это и не прямой ответ на ваш вопрос, по моему опыту, я минимизирую использование Visualforce. Это медленно и может быть сложно отлаживать такие проблемы. Как правило, единственная особенность Visualforce на моих страницах Visualforce — это использование тега apex:page.

Я бы использовал разметку HTML вместо разметки visualforce, а ваш контроллер вершины на стороне сервера должен состоять только из удаленных действий для вызова из javascript. Сохраните свою клиентскую часть состояния и внедрите ее в свои удаленные вызовы.

Если вы начнете разрабатывать свои страницы таким образом, я думаю, вы заметите значительно более высокую производительность, вы сможете обойти некоторые ограничения регулятора, и проблемы, подобные той, с которой вы столкнулись, исчезнут, потому что вы больше не используете визуальную силу, а вместо этого пишете javascript, гораздо более известный язык.

person Phil R    schedule 12.06.2012

Пробовали ли вы использовать стандартную кнопку HTML, активировать метод проверки onClick, а затем использовать <apex:actionFunction> для вызова бэкэнда после того, как вы проверили все, что вам нужно (т.е. в конце метода проверки или если он возвращается как действительный )? Это подход, который я использовал в прошлом, и у меня никогда не было проблем с ним.

person Matt Lacey    schedule 13.06.2012
comment
спасибо, ребята, за ответ .. извините, что не ответил раньше. Я решил свою проблему и могу выполнить проверку jquery.. опубликую код в своем блоге и поделюсь ссылкой - person Sathya; 21.08.2012
comment
Есть ли шанс, что вы можете опубликовать ссылку на свой пост в блоге (знайте, что он старый)? - person AdamE; 09.09.2015

Вы должны иметь возможность просто иметь тег привязки или кнопку в HTML, а не через тег Visualforce. Затем используйте jQuery «при готовности документа», чтобы связать обработчик события клика с тегом кнопки/якоря. Из этой новой функции вы должны иметь возможность вызывать проверку jQuery и выполнять функцию действия только в том случае, если форма действительна. Убедитесь, что у вас есть избыточная проверка кода контроллера на стороне сервера. Хитрость здесь заключается в том, чтобы установить переменную в коде контроллера на стороне сервера, если возникает ошибка. Затем в коде функции действия используйте атрибут повторного рендеринга для целевой панели вывода. Внутри панели вывода есть некоторый javascript, который привязывает локальную переменную к свойству в контроллере (т.е.... var abc = {!errorHandlingProperty}. Затем в javascript повторного рендеринга вы можете продолжить выполнение, ТОЛЬКО если свойство в контроллере истинно. Это в основном ваш механизм остановки Я знаю, что это длинная цепочка кода, но, судя по прошлому опыту, она работает.

person user2414908    schedule 01.02.2017