PrimeFaces CommandButton Action qui n'est pas appelée à l'intérieur d'Composite
Dans le code ci-dessous la jsf html commandButton action est appelé à la perfection.
Mais primefaces commandButton action n'est pas appelé.
<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>
Si le lieu le même code est à l'extérieur d'un composite (normal page xhtml), les deux fonctionnent très bien:
<!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>
C'est le code d'haricot:
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;
}
}
Des suggestions?
Vous devez vous connecter pour publier un commentaire.
Aujourd'hui, j'ai frappé exactement le même problème avec PrimeFaces 5.1. Dans mon cas, je n'ai eu aucun des formulaires imbriqués et j'étais déjà les
process
attribut sur lap:commandButton
avec les éléments de formulaire, je voulais être traitées. Toutefois, cela ne fonctionne pas encore.La "solution" est à ajouter
@this
à la liste des composants de processus, comme ceci:<p:commandButton process="myFormField1 myFormField2 @this">
Sans
@this
(ce qui n'est généralement pas nécessaire, puisque le bouton lui-même ne devrait pas besoin d'être traitées/validé) je n'ai trouvé aucun moyen de faire tout cela fonctionne à l'intérieur d'un composite:<p:commandButton action="#{bean.myAction}"...>
<p:commandButton type="button">
avec imbriqué<p:ajax event="click" action="#{bean.myAction}"...>
<p:commandButton type="button" onclick="myAction()">
avec des associés<p:remoteCommand name="myAction" action="#{bean.myAction}">
Par le débogage de l'application, j'ai vu que la validation et la mise à jour du modèle de phases ont été exécutées correctement, mais ensuite, dans les invoquer la phase d'application, pas de file d'attente de l'événement était présent et donc aucune action n'a été effectuée. En fait, je pourrais préciser tout ce que j'ai aimé à l'intérieur de la
action
etactionListener
les valeurs d'attribut de<p:commandButton>
sans avoir PrimeFaces ou JSF se plaindre d'une quelconque manière.Ceux-ci, au lieu de cela, faire le travail comme il faut, mais vous n'avez pas un traitement partiel en place, de sorte qu'ils ne peuvent pas être une solution viable:
<p:commandButton action="#{bean.myAction}" ajax="false"...>
<p:commandButton type="button"...>
avec imbriqué<f:ajax event="click" action="#{bean.myAction}"...>
Il doit être un PrimeFaces bug.
Lorsque vous avez utilisé le composant composite, a été déjà placé dans un h:balise de formulaire? Lorsque vous avez des formulaires imbriqués, bouton de commande action n'est pas déclenché.
Une autre question peut être l'ajax pièces qui vous tentent. Primefaces bouton a la mise à jour de l'attribut, mais la norme JSF on n'en a pas. Il le fera toujours une actualisation complète de la page (à l'exception de imbriqués dans ou f:ajax tag est utilisé à l'intérieur)
J'ai eu aussi des problèmes avec les boutons de commande de déclenchement. Dans mon cas, ajax et non-ajax reqeuests n'a pas fonctionné.
1. comme décrit ci - dessus assurez-vous de supprimer tous du formulaire dans le formulaire. facile fait avec l'utilisation de composite.
2. si vous avez plusieurs boutons, essayez d'utiliser le drapeau "processus".
Aidé dans mon cas.
process="txtComment, @this"
exécute la méthode de définition de inputText idtxtComment
et le bouton de commande de la méthode.Vous pouvez essayer d'insérer ajax="false" attribut dans p:commandButton.
J'ai aussi touché à ce problème et de tester vos codes, il semble que primefaces est pas en mesure de vous avertir des erreurs de validation dans le même "xhtml", mais dans d'autres panelGrids, vous pouvez avoir besoin d'un parent panelGrid correctement encapsuler tous vos forme de grilles.
Si vous remplissez votre formulaire en entier, vous verrez que votre primefaces commandButton action est appelée, sinon il serait en silence à "digérer" les erreurs de validation que vous pourriez avoir.
À ajouter aux réponses ci-dessus, par souci d'exhaustivité.
L'un des problème qui n'est pas couvert dans les réponses ci-dessus est l'absence de
Targets
attribut danscomposite:interface
À partir de la documentation de JSF
@source: https://stackoverflow.com/a/19680483/1850844
J'ai Trouvé une solution de contournement pour ce Problème
À l'intérieur de votre page d'accueil définir avec
<p:remoteCommand action="managedBean.call_function()" update="..." />
J'ai fait une Gmap Appel à ce à partir d'un composé-Composant à la Mainpage