【问题标题】:Primefaces p:confirmDialog inside tabView选项卡视图中的 Primefaces p:confirmDialog
【发布时间】:2014-02-25 21:02:39
【问题描述】:

我现在在 tabView 中使用 confirmDialog 时遇到问题。 这是我的确认对话框

<p:confirmDialog global="true" showEffect="fade" hideEffect="explode">
    <h:form>
        <p:commandButton value="Yes" type="button"
            styleClass="ui-confirmdialog-yes" icon="ui-icon-check" />
        <p:commandButton value="No" type="button"
            styleClass="ui-confirmdialog-no" icon="ui-icon-close" />
    </h:form>
</p:confirmDialog>

在第一个 tabView 中,我有一个确认按钮

<p:commandButton value="Import" icon="ui-icon-arrowrefresh-1-w"
    update=":form:growl">
    <p:confirm header="Confirmation" message="Are you sure?" />
</p:commandButton>

在第二个 tabView 中,我正好有那个按钮。

现在我的问题是:在第一个选项卡中,我的 confirmDialog 有我想要的全文:标题和消息,但是在第二个选项卡中,标题和消息都变为“null”。只有 ConfirmDialog 的按钮 yes 和 no 仍然有效。我不知道发生了什么,请帮助我,如何让confirmDialog在所有tabView中显示全部内容

【问题讨论】:

    标签: primefaces dialog confirm tabview


    【解决方案1】:

    p:confirm 不实现状态保存,因此在第一个 JSF 生命周期后它会丢失其属性值。它还在视图构建时仅评估一次 EL。

    如何解决状态保存问题。

    您可以扩展 PrimeFaces 的 ConfirmBehavior,实现 saveStaterestoreState,并通过 behavior-id org.primefaces.behavior.ConfirmBehavior 覆盖 faces-config.xml 中的原始行为。然后,您将能够在后续请求中渲染和重新渲染 p:confirm。

    如何修复状态保存和重新评估 EL 绑定属性值。

    你应该创建你自己的 my:confirm,因为你需要一个自定义的 taghandler,而且你不能用不丑的方式替换另一个 taglibrary 的 tag 的 taghandler。

    创建 ConfirmBehavior。

    package my;
    
    import javax.faces.FacesException;
    import javax.faces.component.UIComponent;
    import javax.faces.component.behavior.ClientBehaviorContext;
    import javax.faces.context.FacesContext;
    
    import org.primefaces.behavior.base.AbstractBehavior;
    import org.primefaces.component.api.Confirmable;
    import org.primefaces.json.JSONObject;
    
    public class ConfirmBehavior extends AbstractBehavior {
    
        public final static String BEHAVIOR_ID = "my.ConfirmBehavior";
    
        @Override
        public String getScript(ClientBehaviorContext behaviorContext) {
            FacesContext context = behaviorContext.getFacesContext();
            UIComponent component = behaviorContext.getComponent();
            String source = component.getClientId(context);
            String headerText = JSONObject.quote(this.getHeader());
            String messageText = JSONObject.quote(this.getMessage());
    
            if (component instanceof Confirmable) {
                String script = "PrimeFaces.confirm({source:\"" + source + "\",header:" + headerText + ",message:"
                        + messageText + ",icon:\"" + getIcon() + "\"});return false;";
                ((Confirmable) component).setConfirmationScript(script);
    
                return null;
            } else {
                throw new FacesException("Component " + source + " is not a Confirmable. ConfirmBehavior can only be "
                        + "attached to components that implement org.primefaces.component.api.Confirmable interface");
            }
        }
    
        public String getHeader() {
            return eval(PropertyKeys.header, null);
        }
    
        public void setHeader(String header) {
            setLiteral(PropertyKeys.header, header);
        }
    
        public String getMessage() {
            return eval(PropertyKeys.message, null);
        }
    
        public void setMessage(String message) {
            setLiteral(PropertyKeys.message, message);
        }
    
        public String getIcon() {
            return eval(PropertyKeys.icon, null);
        }
    
        public void setIcon(String icon) {
            setLiteral(PropertyKeys.icon, icon);
        }
    
        public enum PropertyKeys {
            header(String.class), message(String.class), icon(String.class);
    
            final Class<?> expectedType;
    
            PropertyKeys(Class<?> expectedType) {
                this.expectedType = expectedType;
            }
        }
    
        @Override
        protected Enum<?>[] getAllProperties() {
            return PropertyKeys.values();
        }
    
    }
    

    创建 ConfirmBehaviorHandler。

    package my;
    
    import javax.faces.application.Application;
    import javax.faces.view.facelets.BehaviorConfig;
    import javax.faces.view.facelets.FaceletContext;
    import javax.faces.view.facelets.TagAttribute;
    
    import org.primefaces.behavior.base.AbstractBehaviorHandler;
    
    public class ConfirmBehaviorHandler extends AbstractBehaviorHandler<ConfirmBehavior> {
    
        private final TagAttribute header;
        private final TagAttribute message;
        private final TagAttribute icon;
    
        public ConfirmBehaviorHandler(BehaviorConfig config) {
            super(config);
            this.header = this.getAttribute(ConfirmBehavior.PropertyKeys.header.name());
            this.message = this.getAttribute(ConfirmBehavior.PropertyKeys.message.name());
            this.icon = this.getAttribute(ConfirmBehavior.PropertyKeys.icon.name());
        }
    
        @Override
        protected ConfirmBehavior createBehavior(FaceletContext ctx, String eventName) {
            Application application = ctx.getFacesContext().getApplication();
            ConfirmBehavior behavior = (ConfirmBehavior) application.createBehavior(ConfirmBehavior.BEHAVIOR_ID);
    
            setBehaviorAttribute(ctx, behavior, this.header, ConfirmBehavior.PropertyKeys.header.expectedType);
            setBehaviorAttribute(ctx, behavior, this.message, ConfirmBehavior.PropertyKeys.message.expectedType);
            setBehaviorAttribute(ctx, behavior, this.icon, ConfirmBehavior.PropertyKeys.icon.expectedType);
    
            return behavior;
        }
    
    }
    

    在 faces-config.xml 中注册 ConfirmBehavior。

    <?xml version="1.0" encoding="utf-8"?>
    <faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
        version="2.2">
    
        <behavior>
            <behavior-id>my.ConfirmBehavior</behavior-id>
            <behavior-class>my.ConfirmBehavior</behavior-class>
        </behavior>
    
    </faces-config>
    

    在您的标记库 my.taglib.xml 中注册 ConfirmBehaviorHandler。

    <?xml version="1.0" encoding="UTF-8"?>
    <facelet-taglib xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facelettaglibrary_2_2.xsd"
        version="2.2">
    
        <namespace>http://mycompany.ru/my</namespace>
    
        <tag>
            <tag-name>confirm</tag-name>
            <behavior>
                <behavior-id>my.ConfirmBehavior</behavior-id>
                <handler-class>my.ConfirmBehaviorHandler</handler-class>
            </behavior>
        </tag>
    
    </facelet-taglib>
    

    现在您可以像使用 p:confirm 一样使用 my:confirm,但具有状态保存和动态 EL 评估功能。

    【讨论】:

    【解决方案2】:

    这对我来说似乎没问题。请参阅下面的示例

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>JSF User Dialog</title>
    </h:head>
    <h:body>
        <h3>This is a JSF view.</h3>
        <h:form id="form">
            <p:confirmDialog global="true" showEffect="fade" hideEffect="explode">
                <h:form>
                    <p:commandButton value="Yes" type="button"
                        styleClass="ui-confirmdialog-yes" icon="ui-icon-check" />
                    <p:commandButton value="No" type="button"
                        styleClass="ui-confirmdialog-no" icon="ui-icon-close" />
                </h:form>
            </p:confirmDialog>
    
            <p:tabView id="tabView">
    
                <p:tab id="tab1" title="Tab one ">
                    <p:commandButton value="Import" icon="ui-icon-arrowrefresh-1-w"
                        update=":form">
                        <p:confirm header="Confirmation" message="Are you sure?" />
                    </p:commandButton>
                </p:tab>
    
                <p:tab id="tab2" title="Tab two">
                    <p:commandButton value="Import" icon="ui-icon-arrowrefresh-1-w"
                        update=":form">
                        <p:confirm header="Confirmation" message="Are you sure?" />
                    </p:commandButton>
                </p:tab>
    
    
            </p:tabView>
        </h:form>
    </h:body>
    </html>
    

    输出:

    如果您发布完整的 xhtml 代码会很好,这样我们就可以看到那里可能出现的问题。

    【讨论】:

    • 我遇到了问题。这是因为 tabView 的属性 dynamic="true"。我只是删除它
    • 很高兴您的问题得到了解决:)
    【解决方案3】:

    我在组件上遇到了同样的问题。删除动态真实作品的建议解决方案,但是当我们必须在对话框中工作时不满足,因为数据不再自动更新导致字段为空白。 如果发生这种情况,您必须执行以下操作。 例如:。

           <p:commandButton  style="font-size: 12px;width:30px;height:20px;"  icon="ui-icon-trash">
                <p:confirm header="Confirmação" message="Você realmente quer excluir o item de despacho?" icon="ui-icon-alert" />
           </p:commandButton>
           <p:growl id="growl" showDetail="true" />
           <p:confirmDialog global="true" showEffect="fade" hideEffect="explode" style="font-size: 12px;" closeOnEscape="true" widgetVar="confir">
                <p:commandButton id="confirm" value="Sim" ajax="true"  type="button" styleClass="ui-confirmdialog-yes" icon="ui-icon-check"  style="font-size: 12px;">
                    <p:ajax event="click" listener="#{tableExpedicao.excluiItem}" update="confirm" oncomplete="confir.hide()"> </p:ajax>
                </p:commandButton>
                <p:commandButton value="Não" type="button" styleClass="ui-confirmdialog-no" icon="ui-icon-close" style="font-size: 12px;" oncomplete="confir.hide()"/>
         </p:confirmDialog>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-28
      • 2012-08-14
      • 1970-01-01
      相关资源
      最近更新 更多