У меня есть командная кнопка в JSF, при нажатии на которую она выполняет некоторый код Java. Прежде чем этот код будет выполнен, я хочу выполнить некоторую проверку, и когда проверка вернет true, я хочу отобразить всплывающее окно, как я могу этого добиться?
Я вставил свой код внизу, поэтому, когда я нажимаю эту командную кнопку, нужно запустить doSomething, но перед запуском кода я хочу проверить какое-то условие, и если оно окажется верным, я хочу отобразить всплывающее окно.
<h:commandButton action = "#{bean.doSomething}" />
Вы не указали четко, хотите ли вы добавить логику (которую вы хотите оценить) на внешней или внутренней стороне. Если оценку можно легко выполнить на стороне внешнего интерфейса, используйте событие onclick в <h:commandButton>, как показано ниже.
<script>
function evaluateCondition(){
if (conditionEvaluation){
alert("Message for POP UP");
return false;
}
return false;
}
</script>
<h:commandButton
onclick = "javascript: return evaluateCondition();"
action = "#{bean.doSomething} />
Или, если ваше условие должно быть оценено на внутренней стороне, вы можете добавить метод в компонент, который будет выполняться перед вашим doSomething().
P.S.
Хорошо, если вы хотите добавить проверку условий на внутренней стороне, вот объяснение и код для нее:
Примечание. В зависимости от вашей версии jsf совместимость тегов может различаться.
JSF-код
<h:form id = "mainForm">
<h:commandButton value = "Submit" id = "submitButton">
<f:ajax execute = "@this" listener = "#{bean.evaluateCondition}" render = "conditionMet, popup" onevent = "handleConditionCheck" />
</h:commandButton>
<h:outputText id = "conditionMet" value = "#{bean.conditionMet}" style = "display:none;" />
<h:panelGroup id = "popup" layout = "block" style = "display:none;">
<h:panelGrid columns = "1">
<h:outputText value = "Condition Evaluated to true! Click OK to proceed." />
<h:commandButton value = "OK" action = "#{bean.doSomething}" onclick = "hidePopup();" />
</h:panelGrid>
</h:panelGroup>
</h:form>
<script type = "text/javascript">
function handleConditionCheck(data) {
if (data.status === 'success') {
var conditionMet = document.getElementById("mainForm:conditionMet").innerText;
if (conditionMet === 'true') {
document.getElementById("mainForm:popup").style.display = 'block';
} else {
// handle else part as per your requirement.
}
}
}
function hidePopup() {
document.getElementById("mainForm:popup").style.display = 'none';
}
</script>
Бин-код (JAVA)
public class Bean {
private boolean conditionMet;
public void evaluateCondition() {
//Condition logic here
conditionMet = /* assign the condition result */;
}
public boolean isConditionMet() {
return conditionMet;
}
public void doSomething() {
// Do Something logic
}
}
Это должно быть так: нажимается кнопка, оценивается что-то в бэкэнде, если true, отображается всплывающее окно, после нажатия кнопки выполняется doSomething().
@YasinEraslan Я обновил ответ по вашему запросу для бэкэнда. Полезно ли это для вас? Я думаю, это решит вашу проблему.
Эй, выглядит хорошо, только одна вещь не работает: когда я пытаюсь получить свойство для оценки, оно принимает логическое значение по умолчанию false. В моем отладчике я вижу, что для него установлено значение true, но jsf получает его как false.
Я не знаю, касается ли это аннотаций, которые у меня есть, я получил аннотации Named и ViewScoped поверх BeanClass.
@YasinEraslan, не могли бы вы предоставить более подробную информацию о проблеме, с которой вы столкнулись, например, структуру тегов внутри вашей страницы jsf, дополнительную информацию о конфигурациях ваших bean-компонентов и т. д. Или, если вы уже задали отдельный вопрос, вы можете поделиться ссылкой здесь.
У меня есть идея, почему возникает проблема, позвольте мне проверить, потом отвечу вам.
Его следует оценивать в серверной части. Можете ли вы показать какой-нибудь пример в серверной части?