我有一个素数面SelectOneMenu对象和下面的一个面板,该面板有多个基于SelectOneMenu值有条件渲染的面板。因此,我在SelectOneMenu中包含了一个primefaces p:ajax请求。ajax请求启动正常,面板显示正常,没有任何问题。
但现在我想在他们更改SelectOneMenu以继续ajax请求之前添加一个确认,以警告他们在面板中输入的任何值都将丢失。因此,我添加了一个p:ajax的onstart事件,并包含了一个具有javascript confirm的javascript函数。问题是,当用户选择"取消"按钮时,ajax不会启动,但我的SelectOneMenu选择了新值。我想在click事件中调用ajax请求。但是primefaces SelectOneMenu并没有点击事件。
JSF代码:
<p:selectOneMenu id="methodOfId" value="#{cc.attrs.comboBoxValue}">
<f:selectItem itemValue="-1" itemLabel=""/>
<f:selectItems value="#{cc.attrs.comboBoxOptions}" var="methodOfId" itemValue="#{methodOfId.id}" itemLabel="#{methodOfId.name}"/>
<f:param name="cid" value="#{cc.attrs.beanConversationID}" />
<p:ajax update="dynamicPanels" process="@this" onstart="return confirmMethodOfIdChange()"/>
</p:selectOneMenu>
<p:panel id="dynamicPanels">
<ui:include src="#{cc.attrs.panelSrc}" />
</p:panel>
Javascript代码:
function confirmMethodOfIdChange() {
var userResponse = confirm("Are you sure you want to change your selection?");
return userResponse;
}
现在,我如何更改SelectOneMenu以显示其旧值?我甚至想过在jsfSelectOneMenu中使用f:ajax和下面的javascript代码。它要求确认,但我在确认框中点击OK,它不执行ajax请求。
function confirmMethodOfIdChange(data) {
alert("inside confirm");
var ajaxStatus = data.status; // Can be "begin", "success" and "complete"
if (ajaxStatus == 'begin'){
var userResponse = confirm("Are you sure you want to change your selection?");
if (userResponse) {
return true;
} else {
return false;
}
}
return true;
}
您可以使用<p: confirmDialog>组件,并将其与selectOneMenu小部件Var组合。只需移除<p: ajax>并将您的操作置于"确认"对话框中的"是"按钮。如果单击"是",将执行操作。如果没有,则将恢复更改。
<p:selectOneMenu widgetVar="ps" onchange="confirm.show()">
<f:selectItem itemValue="1" itemLabel="1"/>
<f:selectItem itemValue="2" itemLabel="2"/>
<f:selectItem itemValue="3" itemLabel="3"/>
</p:selectOneMenu>
<p:confirmDialog widgetVar="confirm" message="Are you sure you want to change your selection?" header="WARN!" severity="alert">
<p:commandButton value="Yes" process="@form" update="myform" oncomplete="confirm.hide()" />
<p:commandButton value="No" type="button"
onclick="ps.selectValue(ps.preShowValue.val());confirm.hide()" />
</p:confirmDialog>
详细阐述@bhdrk答案:
不要忘记调用PF('<小部件名称>')来获取您的小部件:onchange="PF('confirm').show()"
、onclick="PF('ps').selectValue(PF('ps').preShowValue.val());PF('confirm').hide()"
等