【问题标题】:PrimeFaces CommandButton Action not called inside CompositePrimeFaces CommandButton Action 未在 Composite 内部调用
【发布时间】:2011-12-12 19:23:34
【问题描述】:

在下面的代码中,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;
    }

}

有什么建议吗?

【问题讨论】:

    标签: jsf-2 primefaces composite-component


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我找到了解决此问题的方法

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

      在您的主页中使用
      &lt;p:remoteCommand action="managedBean.call_function()" update="..." /&gt;

      进行定义

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

      【讨论】:

        【解决方案3】:

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

        上述答案中未涉及的一个问题是composite:interface 中缺少Targets 属性

        来自 JSF 的文档

        targets 属性: 如果此元素具有方法签名 属性,targets 属性的值必须被解释为 空格(不是制表符)分隔的客户端 ID 列表(相对于顶部 级别组件)内的组件 部分。空间被用作 与 IDREFS 和 NMTOKENS 数据类型兼容的分隔符 来自 XML 模式。列表中的每个条目都必须解释为 MethodExpression 来自的内部组件的 id 必须应用使用页面中的复合组件标签。如果这 元素具有方法签名属性,但没有目标属性, 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

        【讨论】:

          【解决方案4】:

          今天我在 PrimeFaces 5.1 中遇到了同样的问题。在我的情况下,我没有嵌套表单,并且我已经在 p:commandButton 上设置了 process 属性以及我想要处理的表单元素。然而这还没有奏效。

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

          &lt;p:commandButton process="myFormField1 myFormField2 @this"&gt;

          没有@this(通常不需要,因为按钮本身不需要被处理/验证)我发现没有办法让其中任何一个在复合材料中工作:

          • &lt;p:commandButton action="#{bean.myAction}"...&gt;
          • &lt;p:commandButton type="button"&gt; 嵌套 &lt;p:ajax event="click" action="#{bean.myAction}"...&gt;
          • &lt;p:commandButton type="button" onclick="myAction()"&gt; 与关联的 &lt;p:remoteCommand name="myAction" action="#{bean.myAction}"&gt;

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

          相反,它们可以正常工作,但您没有进行部分处理,因此它们可能不是一个可行的解决方案:

          • &lt;p:commandButton action="#{bean.myAction}" ajax="false"...&gt;
          • &lt;p:commandButton type="button"...&gt; 嵌套 &lt;f:ajax event="click" action="#{bean.myAction}"...&gt;

          这一定是 PrimeFaces 错误。

          【讨论】:

          • 按钮不会被触发,如果它没有被处理的话。这是有道理的。
          • 它没有,因为“process”属性指示应该处理/提交哪些其他字段。对于组合之外的按钮,不需要在 process 属性中设置“@this”。而且,如果是的话,它至少会是“冗余的”。
          • 我希望我能多次对此表示赞同。这是正确的答案,或者我应该说@this。即使是在 2018 年的 primefaces 6 下。在我将 p:commandButton 触发之前,从来没有遇到过问题。
          • 它确实适用于 Spring Faces 2.3.1 - 非常感谢!
          【解决方案5】:

          我也遇到了非触发命令按钮的问题。在我的情况下,ajax 和非 ajax 请求不起作用。 1. 如上所述 - 请务必删除表单中的所有表单。使用复合材料很容易完成。 2. 如果您有多个按钮,请尝试使用标志“进程”。 对我有帮助。

          <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方法。

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                【解决方案8】:

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

                另一个问题可能是您正在尝试的 ajax 部分。 Primefaces 按钮具有更新属性,但标准的 JSF 按钮没有。它总是会完全刷新页面(除了嵌套在其中或在其中使用 f:ajax 标记时)

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2017-02-21
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-06-27
                  • 2015-08-29
                  • 2014-06-11
                  相关资源
                  最近更新 更多