a4j: действие CommandLink не выполняется для rich:popupPanel при отображении панели

У меня есть ссылка, открывающая всплывающую панель, перед тем как открыть эту панель, я бы хотел, чтобы с моего bean-компонента ejb выполнялось какое-то действие, а всплывающая панель должна отображаться. Открыв эту панель, я нажимаю commandButton, которая должна выполнить действие из моего компонента, и закрываю эту панель. Второе действие не выполнено.

Если я уберу атрибут 'render' из первого a4j: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 ответов

  1. лучше отобразить внутренний идентификатор компонента popupPane, а не идентификатор popupPane.
  2. В jsf 2 лучше использовать ОДНУ форму для одной страницы, управление состоянием основано на форме, я думаю, что это большая проблема дизайна в jsf2. До Richfaces 4.3 две формы вызывали странные проблемы, я не знаю, если 4.3 это исправило. MyFaces имеет свое решение, чтобы устранить проблемы с несколькими формами.

Вы можете создать форму ниже во всплывающей панели, как

<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

попробуйте и дайте мне знать здесь

/questions/35288/richfaces-4-a4j-dejstvie-commandlink-ne-zapuskaetsya-v-richpopuppanel/35303#35303

Попробуй с вышеупомянутым link.its тоже разобрал мой вопрос.. та же проблема, с которой столкнулся

добавить теги регионов и все работает хорошо

Спасибо

Атрибут render="myPopupPanel" не должен быть reRender="myPopupPanel"?

Я никогда не использовал богатые лица, только простые лица. Но я попытаюсь предположить, что компонент, к которому вы пытаетесь получить доступ с помощью метода onComplete, должен находиться внутри той же формы, что и commandButton. Также проверьте ответ POST от http, они обычно приносят сообщения об ошибках с информацией о том, что не так

Я предлагаю попробовать:

<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>

Обычно лучше иметь только один элемент формы, когда мы используем богатые лица...

С уважением

a4j:commandLink не имеет никакого атрибута для рендеринга, я думаю, вы его неправильно написали. Имя атрибута отображается.

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

Другие вопросы по тегам