0

我的页面上有一个 selectOneMenu,它设置为执行一些操作 onChange。我想在执行操作之前显示一个确认对话框。

下面是我的实现,但似乎不起作用。确认对话框会自动隐藏,而不会给用户时间来选择选项,并且任务包含先前选择的值。

<p:selectOneMenu id="selectMenu" value="#{component.selectedAction}"onchange="confirmDialogWidgetVar.show()" >
    <f:selectItem itemLabel="Option A" itemValue="A"/>
    <f:selectItem itemLabel="Option B" itemValue="B"/>
    <f:selectItem itemLabel="Option C" itemValue="C"/>
    <f:selectItem itemLabel="Option D" itemValue="D"/>
    <p:ajax update="confirmDialog" process="@this" global="false"/>
</p:selectOneMenu>

<p:confirmDialog id="confirmDialog" widgetVar="confirmDialogWidgetVar" message="Are you sure you want to select #{component.selectedAction}?">
    <p:commandButton value="YES" oncomplete="confirmDialogWidgetVar.hide()"/>
    <p:commandButton value="NO" onclick="confirmDialogWidgetVar.hide()"/>
</p:confirmDialog>

我要显示的消息是“您确定要选择选项 A 吗?” 在选择选项 A 时的确认对话框中。

4

3 回答 3

0

使用p:dialog. 问题是:

1) 对话消息使用托管 bean,该 bean 在 selectMenu 值更改后更新 -> 这就是您看到旧值的原因

2) 显示对话框不会阻止更改 ajax 事件,因此无论对话框命令如何,都会更新 selectMenu

一种方法是使用jQuery

如果您只想使用 primefaces 和 jsf 组件来执行此操作,恐怕您最终会遇到服务器往返。这个想法是:将 selectMenu 绑定到一个代理字段,例如component.selectedActionProxy并向其添加一个动作,<p:command value="YES"它基本上是这样做的:component.selectedAction = component.selectedActionProxy.

于 2013-05-29T10:19:14.823 回答
0

试试这个它现在工作正常

    public void check(){
    System.out.println(""+getSelectedAction());
    RequestContext.getCurrentInstance().execute("confirmDialogWidgetVar.show()");
    }

    <p:selectOneMenu id="selectMenu" value="#{home.selectedAction}">

    <f:selectItem itemLabel="Option A" itemValue="A"/>
    <f:selectItem itemLabel="Option B" itemValue="B"/>
    <f:selectItem itemLabel="Option C" itemValue="C"/>
    <f:selectItem itemLabel="Option D" itemValue="D"/>
    <p:ajax listener="#{home.check}" />
    <f:ajax render="confirmDialog" ></f:ajax>
    </p:selectOneMenu>


    <p:confirmDialog id="confirmDialog" widgetVar="confirmDialogWidgetVar"   message="Are you sure you want to select#{home.selectedAction}?">`
    <p:commandButton value="YES" oncomplete="confirmDialogWidgetVar.hide()"/>
    <p:commandButton value="NO" onclick="confirmDialogWidgetVar.hide()"/>
</p:confirmDialog>
于 2013-05-29T13:33:07.400 回答
0

您可以通过这种方式实现您的功能。在 backing bean 中创建private boolean check;,并检查该值是否按照您的意愿进行,如下所示。

<h:form id="form">

        <p:selectOneMenu  value="#{buttonBean.emp.number}">  
            <f:selectItem itemLabel="Select One" itemValue="" />  
            <f:selectItem itemLabel="Option 1" itemValue="1" />  
            <f:selectItem itemLabel="Option 2" itemValue="2" />  
            <f:selectItem itemLabel="Option 3" itemValue="3" />  
        <p:ajax listener="#{buttonBean.change}" />
        </p:selectOneMenu>      




 <p:confirmDialog id="confirmDialog" message="Are you sure about destroying the world?"  
                header="Initiating destroy process" severity="alert" widgetVar="confirmation">  

        <p:commandButton id="confirm" value="Yes Sure" actionListener="#{buttonBean.dialogCheck}" oncomplete="confirmation.hide()" update="@form" 
                     />  
        <p:commandButton id="decline" value="Not Yet" onclick="confirmation.hide()" type="button" />   

    </p:confirmDialog>

        </h:form>

//支持bean

    @ManagedBean
    @ViewScoped
    public class ButtonBean implements Serializable{



        private Employee emp;;
        private boolean check;;

        public void change(){

            System.out.println("open dilaog box on value change------");


            RequestContext.getCurrentInstance().execute("confirmation.show()");



        }


        public void dialogCheck(){

            check=true;

           if(emp.getNumber().equals("1") && check==true){

            System.out.println("do your change--here-");

        }

        }


        public Employee getEmp() {

            if(emp==null){

                emp=new Employee();
            }

            return emp;
        }


        public void setEmp(Employee emp) {
            this.emp = emp;
        }


        public boolean isCheck() {
            return check;
        }


        public void setCheck(boolean check) {
            this.check = check;
        }





    }
于 2013-05-29T11:48:35.830 回答