a4j:呈现面板时,不在rich:popupPanel上执行CommandLink操作

时间:2013-01-28 10:41:17

标签: jsf-2 richfaces ajax4jsf seam3

我有链接打开弹出面板,在打开该面板之前我想要从我的ejb无状态bean执行一些操作,并且应该渲染弹出面板。打开该面板后,我单击commandButton,它应该从我的bean执行操作并关闭该面板。第二个动作没有执行。

如果我从第一个a4j删除'render'属性:commandLink一切正常。

我用过:Richfaces 4.1.0.Final(我也试过4.2.3.Final和最新版本:4.3.0.20121214-M3),Seam 3.1.0.Final,JBoss 7.1.1.Final。

my_page.xhtml:

    <html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:s="http://jboss.org/seam/faces"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich">

<h:head></h:head>
<h:body>
    <h:form>
        <a4j:commandLink action="#{myBean.init()}" render="myPopupPanel"
            oncomplete="#{rich:component('myPopupPanel')}.show(); return false;">
            Open panel
        </a4j:commandLink>
    </h:form>

    <rich:popupPanel id="myPopupPanel" modal="false" autosized="true"
        resizeable="false">
        <h:form id="deviceInputEditForm">

            <a4j:commandButton action="#{myBean.doAction()}" value="DoAction"
                oncomplete="#{rich:component('myPopupPanel')}.hide();" />

        </h:form>
    </rich:popupPanel>
</h:body>
</html>

MyBean.java:

package com.hajdi.test;

import javax.ejb.Stateless;
import javax.inject.Named;

@Named
@Stateless
public class MyBean {
   public void init() {
      System.out.println("Init called.");
   }

   public void doAction() {
      System.out.println("doAction called");
   }
}

7 个答案:

答案 0 :(得分:1)

  1. 最好渲染popupPane的内部组件ID,而不是popupPane id。
  2. 在jsf 2中,最好只将 ONE 表单用于一个页面,状态管理基于表单,我认为这是jsf2中的一个重大设计问题。在Richfaces 4.3之前,两种形式会引起一些奇怪的问题,我不知道4.3是否修复了它。 MyFaces的解决方案是解决多形式问题。

答案 1 :(得分:1)

您可以在弹出式面板中创建一个表单,如

<rich:popupPanel id="myPopupPanel" modal="false" autosized="true"
        resizeable="false">
        <h:form id="deviceInputEditForm">
           <s:div id="anythingyouwant>"
            <a4j:commandButton action="#{myBean.doAction()}" value="DoAction"
                oncomplete="#{rich:component('myPopupPanel')}.hide();" />
            </s:div>
        </h:form>
    </rich:popupPanel>

然后尝试从第一次重新渲染

<h:form>
        <a4j:commandLink action="#{myBean.init()}" render="anythingyouwant"
            oncomplete="#{rich:component('myPopupPanel')}.show(); return false;">
            Open panel
        </a4j:commandLink>
    </h:form>
enter code here

尝试一下,让我知道

答案 2 :(得分:0)

我从不使用富有的面孔,只使用素面。但我会尝试猜测你试图在onComplete方法上访问的组件需要在commandButton的相同形式内。同时检查来自http的POST回复,他们通常会带有错误消息,其中包含有关错误的信息

答案 3 :(得分:0)

render =“myPopupPanel”属性不应该是reRender =“myPopupPanel”?

答案 4 :(得分:0)

我建议尝试:

<h:body>
    <h:form>
        <a4j:commandLink action="#{myBean.init()}" render="myPopupPanel"
            oncomplete="#{rich:component('myPopupPanel')}.show(); return false;">
            Open panel
        </a4j:commandLink>

    <rich:popupPanel id="myPopupPanel" modal="false" autosized="true"
        resizeable="false">
            <a4j:commandButton action="#{myBean.doAction()}" value="DoAction"
                oncomplete="#{rich:component('myPopupPanel')}.hide();" />
    </rich:popupPanel>

    </h:form>
</h:body>

当我们使用富脸时,通常最好只有一个表单元素...

此致

答案 5 :(得分:0)

https://stackoverflow.com/a/6908500/3583985

尝试使用上面的link.its排序我的问题.. 我面临同样的问题

添加区域标签,一切正常

感谢

答案 6 :(得分:0)

a4j:commandLink没有任何属性作为渲染,我想你拼错了它。呈现属性名称。

<a4j:commandLink action="#{myBean.init()}" rendered="myPopupPanel" oncomplete="#{rich:component('myPopupPanel')}.show(); return false;"> Open panel </a4j:commandLink>