复合中未调用PrimeFaces CommandButton动作



下面的代码完美地调用了jsf html commandButton动作。但是没有调用primefaces commandButton动作。

<ui:component          
              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.prime.com.tr/ui"
    xmlns:composite="http://java.sun.com/jsf/composite">
    <composite:interface>
        <composite:attribute 
            name="managedBean"          
            type="java.lang.Object"
            required="true">                    
        </composite:attribute>
    </composite:interface>
    <composite:implementation>
        <f:view contentType="text/html"> 
            <h:form id="componentes">  
                <h:panelGrid columns="3">
                    <h:panelGroup>              
                        <h:outputText 
                              escape = "false" 
                               value = "#{cc.attrs.managedBean['value']}"       
                            rendered = "#{!cc.attrs.managedBean['editing']}"/> 
                        <p:editor 
                            widgetVar = "editor" 
                                value = "#{cc.attrs.managedBean.value}" 
                             rendered = "#{cc.attrs.managedBean.editing}"/>
                    </h:panelGroup>
                    <!-- ACTION IS CALLED -->                                 
                    <h:commandButton 
                                action = "#{cc.attrs.managedBean.toogleEditing}" 
                                 value = "#{cc.attrs.managedBean.editing?'Back':'Edit'}" 
                                update = "componentes"/>
                                    <!-- ACTION IS NOT CALLED -->           
                    <p:commandButton 
                                action = "#{cc.attrs.managedBean.toogleEditing}" 
                                 value = "#{cc.attrs.managedBean.editing?'Back':'Edit'}" 
                                update = "componentes"/>
                </h:panelGrid>
            </h:form>                    
        </f:view>
    </composite:implementation>
</ui:component>

如果将相同的代码放在复合(普通xhtml页面)之外,则两者都可以正常工作:

<!DOCTYPE html 
     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html 
    xml:lang="pt" 
        lang="pt"
       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.prime.com.tr/ui">
    <h:head id="head">
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Item de Texto</title>
    </h:head>
    <h:body id="body">          
        <f:view contentType="text/html"> 
            <h:form id="componentes">  
                <h:panelGrid columns="3">
                    <h:panelGroup>              
                        <h:outputText 
                              escape = "false" 
                               value = "#{editableHTMLText.value}" 
                            rendered = "#{!editableHTMLText.editing}"/>
                        <p:editor 
                            widgetVar = "editor" 
                                value = "#{editableHTMLText.value}" 
                             rendered = "#{editableHTMLText.editing}"/>
                    </h:panelGroup>
                                    <!-- ACTION IS CALLED -->                         
                    <h:commandButton 
                                action = "#{editableHTMLText.toogleEditing}" 
                                 value = "#{editableHTMLText.editing?'Back':'Edit'}" 
                                update = "componentes"/>
                                    <!-- ACTION IS CALLED -->
                    <p:commandButton 
                                action = "#{editableHTMLText.toogleEditing}" 
                                 value = "#{editableHTMLText.editing?'Back':'Edit'}" 
                                update = "componentes"/>
                </h:panelGrid>
            </h:form>                    
        </f:view>
    </h:body>
</html>

这是bean代码:

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class EditableHTMLText implements Serializable{
    /**
     * 
     */
    private static final long   serialVersionUID    = 8439126615761864409L;
    private String              value               = "Test<br>of<br>HTML<br>text<br><b>ITEM</b><br>";
    private boolean             editing             = false;

    public void toogleEditing(){
        this.setEditing(!this.isEditing());
        System.out.println("Editing State: " + this.editing);
    }

    public String getValue(){
        return value;
    }

    public void setValue(String value){
        this.value = value;
    }

    public boolean isEditing(){
        return editing;
    }

    public void setEditing(boolean editing){
        this.editing = editing;
    }
}

有什么建议吗?

今天我在使用PrimeFaces 5.1时遇到了同样的问题。在我的例子中,我没有嵌套表单,并且我已经在p:commandButton上设置了process属性,其中包含了我想要处理的表单元素。然而,这并没有起作用。

"解决方案"是将@this添加到要处理的组件列表中,如下所示:

<p:commandButton process="myFormField1 myFormField2 @this">

没有@this(通常不需要,因为按钮本身不需要处理/验证),我发现没有办法使这些工作在一个复合:

  • <p:commandButton action="#{bean.myAction}"...>
  • <p:commandButton type="button">嵌套<p:ajax event="click" action="#{bean.myAction}"...>
  • <p:commandButton type="button" onclick="myAction()">与相关<p:remoteCommand name="myAction" action="#{bean.myAction}">

通过调试应用程序,我看到验证和更新模型阶段被正确执行,但随后在调用应用程序阶段没有出现排队事件,因此没有执行任何操作。实际上,我可以在<p:commandButton>actionactionListener属性值中指定任何我喜欢的东西,而不会让PrimeFaces或JSF以任何方式抱怨。

这些,相反,做他们应该做的工作,但你没有部分处理到位,所以他们可能不是一个可行的解决方案:

  • <p:commandButton action="#{bean.myAction}" ajax="false"...>
  • <p:commandButton type="button"...>嵌套<f:ajax event="click" action="#{bean.myAction}"...>

一定是PrimeFaces的bug

当您使用复合组件时,它是否已经放置在h:form标签中?当有嵌套表单时,不会触发命令按钮动作。

另一个问题可能是您正在尝试的ajax部分。Primefaces按钮有更新属性,但是标准JSF按钮没有这个属性。它将始终对页面进行完全刷新(除非在其中嵌套或使用f:ajax标记)

您可以尝试在p:commandButton中插入ajax="false"属性。

我也有非触发命令按钮的问题。在我的例子中,ajax和非ajax请求都不起作用。1. 如上所述-确保删除所有表单中的表单。使用复合用法很容易。2. 如果您有多个按钮,请尝试使用"process"标志。在我的情况下帮助。

<p:commandButton id="submitButton" value="Submit" type="submit" 
    actionListener="#{bean.save}"
    update="message"
    process="txtComment, @this"
    icon="ui-icon-disk"/>

process="txtComment, @this"执行id为txtComment的inputText的setter方法和commandButton方法。

我也遇到了这个问题,并测试了你的代码,似乎primefaces是无法警告你在相同的"xhtml"验证错误,但在其他panelGrids,你可能需要一个父panelGrid正确封装所有表单的网格。

如果您完全填写了整个表单,您将看到您的primefaces commandButton动作被调用,否则它将静默地"消化"您可能遇到的验证错误。

为完整起见,添加上述答案。

上述答案中未涉及的一个问题是composite:interface

中缺少Targets属性

来自JSF的文档

targets属性:如果此元素有方法签名属性时,targets属性的值必须被解释为以空格(不是制表符)分隔的客户端id列表(相对于顶部)级别组件)的组件内& lt;复合:implementation>部分。空间用作分隔符,以便与IDREFS和NMTOKENS数据类型兼容从XML模式。列表中的每个条目必须被解释为对象的methodexexpression指向的内部组件的id必须应用using页面中的复合组件标记。如果这元素有一个方法签名属性,但没有target属性,属性的值用作对象中的单个条目列表。如果name属性的值不是特殊的name属性描述中列出的值,目标(或它的派生值)不必对应于内部对象的id组件。

<cc:interface>
    <cc:attribute name="value" />
    <cc:attribute name="action" targets="buttonId" />
    <cc:attribute name="actionListener" targets="buttonId" />
</cc:interface>
<cc:implementation>
    <p:commandButton id="buttonId" value="#{cc.attrs.value}" />
</cc:implementation>

@source: https://stackoverflow.com/a/19680483/1850844

可能你的页面中有一些元素,com REQUIRED="TRUE"是冲突的

我找到了一个解决这个问题的方法

<composite:implementation>
 <p:commandButton onclick="JS_call_to<p:remoteCommand>" />
</composite:implementation>

在你的主页中定义
<p:remoteCommand action="managedBean.call_function()" update="..." />

我已经做了一个Gmap调用这个从一个复合组件到我的主页

最新更新