如何在打开对话框时在对话框中呈现输入组件,并在关闭对话框时取消放置

时间:2015-11-05 21:16:04

标签: jsf primefaces jsf-2.2 mojarra

本案的要求如下:

  1. 单击“更改密码”按钮打开一个对话框。
  2. Change Password button

    1. 该对话框包含两个输入组件(密码和重复密码)和几个按钮(取消,重置和提交)。
    2. New password field gets properly rendered

      1. 重复密码输入组件没有验证。

      2. 仅在对话框打开时验证密码输入组件。

      3. 为了满足#4我决定只在对话框打开时才渲染密码;否则不会呈现。

        <p:commandButton
            id="changePasswordButton"
            value="Change Password"
            actionListener="#{changePasswordBean.renderNewPasswordComponent()}"
            update="newPassword"
            oncomplete="PF('changePasswordDialog').show();"/>
        <p:dialog id="changePasswordDialogId" widgetVar="changePasswordDialog">
            <p:password
                id="newPassword"
                value="#{changePasswordBean.newPassword}"
                rendered="#{changePasswordBean.getRenderNewPasswordComponent()}"
                match="repeatPassword">
                <f:validator validatorId="foo.bar.PasswordValidator"/>
            </p:password>
            <p:password id="repeatPassword"/>
        
            <p:commandButton
                value="Submit"
                immediate="false"
                validateClient="true"
                process="@this newPassword repeatPassword"
                actionListener="#{changePasswordBean.hideNewPasswordComponent()}"
                update="newPassword repeatPassword"
                oncomplete="if(!args.validationFailed) { PF('changePasswordDialog').hide(); }"/>
        
            <p:commandButton type="reset" value="Reset"/>
        
            <p:commandButton
                value="Cancel"
                immediate="true"
                validateClient="false"
                actionListener="#{changePasswordBean.hideNewPasswordComponent()}"
                update="newPassword repeatPassword"
                oncomplete="PF('changePasswordDialog').hide();"/>
        </p:dialog>
        

        支持Bean:

        @ViewScoped
        public class ChangePasswordBean {
        
            private String newPassword;
        
            private boolean renderNewPasswordComponent = false;
        
            public boolean getRenderNewPasswordComponent() {
                return renderNewPasswordComponent;
            }
        
            public void renderNewPasswordComponent() {
                renderNewPasswordComponent = true;
            }
        
            public void hideNewPasswordComponent() {
                renderNewPasswordComponent = false;
            }
        }
        

        不幸的是它不起作用。对话框打开时,新密码字段无法正确呈现。

        New password field does not get rendered properly

        但是,如果我刷新浏览器窗口并再次单击“更改密码”按钮,则会正确呈现新密码字段。

        New password field gets properly rendered

        如果单击“取消”或“提交”按钮,对话框将关闭。之后,如果我再次单击“更改密码”按钮,则会再次正确呈现新密码字段。这种情况无限制地来回传播,是理想的行为。

        但是,如果单击“取消”或“提交”按钮(关闭对话框),请刷新浏览器窗口并单击“更改密码”按钮,新密码字段未正确呈现。

        因此,似乎“更改密码”按钮,“提交”按钮和“取消”按钮不会更新新密码输入组件。阅读Execution order of events when pressing PrimeFaces p:commandButton后,看起来我已正确设置了所有内容。 actionListener在更新之前执行,在oncomplete之前执行。在ChangePasswordBean#renderNewPasswordComponent()ChangePasswordBean#hideNewPasswordComponent()上设置断点表示正在执行动作侦听器。在ChangePasswordBean#getRenderNewPasswordComponent()上设置断点表明密码组件正在检查是否应该呈现它。但是在触发actionListener之前和之后都会执行此方法。

        单击“更改密码”按钮,这里是actionListener方法调用的顺序:

        1. ChangePasswordBean#getRenderNewPasswordComponent()(返回false)
        2. enter image description here

          1. ChangePasswordBean#renderNewPasswordComponent()(将其设置为true)
          2. enter image description here

            1. ChangePasswordBean#getRenderNewPasswordComponent()(返回true)
            2. enter image description here

              1. ChangePasswordBean#getRenderNewPasswordComponent()(返回true)
              2. enter image description here

                1. ChangePasswordBean#getRenderNewPasswordComponent()(返回true)
                2. enter image description here

                  1. ChangePasswordBean#getRenderNewPasswordComponent()(返回true)
                  2. enter image description here

                    在actionListener将呈现设置为true(#2)之前,不确定密码组件为何要检查是否应该呈现(#1)。但看起来密码组件再次检查在执行actionListener之后是否应该渲染四次(例如在#3,#4,#5和#6中)。这看起来像是正确的执行顺序吗?

                    如果执行顺序正确,那么可能在序列中的正确时间没有发生更新,或者根本没有发生更新。如果正在执行更新,我将如何检查服务器端?

                    或许有一些不同的东西,我忽略或误解?

0 个答案:

没有答案