Primefaces dialogue est rendu deux fois
J'ai créé une interface utilisateur:composant à utiliser comme un pop-up, donc je peux créer beaucoup de fenêtres pop-up en utilisant le standard de ce modèle.
Le composant est juste une fenêtre avec deux boutons annuler et de le soumettre) et un contenu qui peut être changé, comme vous pouvez le voir ici:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.prime.com.tr/ui">
<ui:component>
<p:dialog widgetVar="#{idPopup}" id="#{idPopup}" modal="#{popup.modal}"
draggable="#{popup.modal}"
rendered="#{popup.visivel}" visible="#{popup.visivel}"
closeOnEscape="false" closable="false" header="#{titulo}"
resizable="false" styleClass="autoWidthDialog" showEffect="fade"
hideEffect="fade">
<h:panelGroup style="width:100%">
<p:focus />
<ui:insert name="conteudo">Nenhum conteúdo definido!</ui:insert>
<h:panelGrid id="#{idPopup}PainelMensagens" style="width:100%">
<p:messages />
</h:panelGrid>
<ui:insert name="barraDeBotoes">
<h:panelGroup layout="block" style="width:100%">
<p:commandButton value="CANCELAR" immediate="true" update="@form"
style="float:right" action="#{controladorPopup.fechar}"
onclick="#{idPopup}.hide();" />
<p:commandButton value="OK" style="float:right"
update="@form formAlerta"
action="#{controladorPopup.submit}"
process="@form" />
</h:panelGroup>
</ui:insert>
</h:panelGroup>
</p:dialog>
</ui:component>
</html>
Le problème se produit-il lorsque j'essaie d'envoyer le formulaire sans remplir les champs requis. Le comportement correct est juste afficher à nouveau la fenêtre contextuelle avec les messages, mais le dialogue est rendu deux fois, l'une avec les messages et l'autre sans les messages.
Vous pouvez voir ce problème ici:
c'est un usage de ce modèle:
<ui:composition template="../templates/popupSubmit.xhtml">
<ui:param name="titulo" value="Buscar pessoa" />
<ui:param name="popup" value="#{modeloPopupBuscaPessoa}" />
<ui:param name="controladorPopup"
value="#{controladorPopupBuscaPessoa}" />
<ui:define name="conteudo">
<h:panelGroup>
<h:panelGrid columns="2">
<h:outputLabel value="Tipo de cadastro:" style="float:none" />
<h:selectOneMenu value="#{controladorSugestaoPessoa.tipoCadastro}"
immediate="true">
<f:selectItems value="#{carregadorTipoCadastro.itens}" />
<f:ajax event="change" immediate="true" />
</h:selectOneMenu>
</h:panelGrid>
<h:outputText value="Buscar por:" />
<h:selectOneRadio value="#{controladorSugestaoPessoa.tipoBusca}"
immediate="true">
<f:selectItems value="#{carregadorTipoBuscaPessoa.itens}" />
<f:ajax event="change" immediate="true" />
</h:selectOneRadio>
<p:autoComplete value="#{modeloPopupBuscaPessoa.itemSelecionado}"
forceSelection="true" maxResults="10" queryDelay="500"
completeMethod="#{controladorSugestaoPessoa.atualizarSugestoes}"
var="pessoa" itemLabel="#{pessoa.label}" itemValue="#{pessoa}"
converter="#{conversorSelectItem}" />
</h:panelGroup>
</ui:define>
</ui:composition>
Et ce sont quelques-utilisation:
<h:form id="cadastroPessoa">
<ui:include
src="resources/components/popups/modulo_cadastro/popupNovoCadastroPessoa.xhtml">
<ui:param name="idPopup" value="popupNovoCadastroPessoa" />
</ui:include>
<ui:include
src="resources/components/popups/modulo_cadastro/popupCadastroPessoa.xhtml">
<ui:param name="idPopup" value="popupEdicaoCadastroPessoa" />
</ui:include>
<ui:include
src="resources/components/popups/modulo_cadastro/popupBuscaPessoa.xhtml">
<ui:param name="idPopup" value="popupBuscaCadastroPessoa" />
</ui:include>
</h:form>
<h:form id="cadastroProduto">
<ui:include
src="resources/components/popups/modulo_cadastro/popupCadastroProduto.xhtml">
<ui:param name="idPopup" value="popupNovoCadastroProduto" />
</ui:include>
</h:form>
Quelqu'un pourrait-il me dire pourquoi ce qui se passe??
Édité avec plus de données Bhesh
Vous ne savez pas si c'est la cause de l'ensemble du problème, mais la conception de la boîte de dialogue comme un fichier include est un peu étrange. Un fichier de balises ou d'un composant composite est plus un choix sensé. Aussi, le dialogue devrait également avoir sa propre
<h:form>
et ne pas être placé à l'intérieur de toute <h:form>
. Vous ne souhaitez pas envoyer de processus et de tous les autres champs dans la page en dehors de la boîte de dialogue dans la même forme au moment de soumettre les champs dans la boîte de dialogue.OriginalL'auteur brevleq | 2011-10-24
Vous devez vous connecter pour publier un commentaire.
Dans mon cas, je ne peux pas l'utilisateur oncompleteI) méthode pour masquer la boîte de dialogue, car il doit être fermé à une logique métier.
J'mon cas, j'ai utiliser primefaces onglets de l'INTERFACE utilisateur. Chaque fois que je peux naviguer dans les onglets, puis cliquez sur le bouton sur lequel boîte de dialogue apparaît alors mes dialogues nombre croissant de proportionnalité
Donc, j'ai utilisé jquery simple script pour supprimer toutes les duplications de dialogue de l'INTERFACE utilisateur
e de l'INTERFACE utilisateur.
OriginalL'auteur DHRUV BANSAL
J'ai posté la même question dans primefaces forum (comme Tommy Chan dit), et quelqu'un a répondu ceci:
J'ai essayé de le faire jusqu'à ce que j'ai vu tous mes dialogues ont "rendu" de l'attribut à venir à partir du serveur (il suffit de voir les premières xml), j'ai beaucoup de dialogues dans cette application, et certains d'entre eux ont un lien avec les autres (sur le serveur), ces derniers sont sur le même formulaire.
J'ai fait quelque chose de différent, j'ai créé ce code javascript:
et appelé ce sur le dialogue "onShow" attribut:
Je n'aime pas faire des choses comme cela, mais je ne peux pas trouver une meilleure façon de résoudre ce problème...
Si quelqu'un me donner une meilleure solution, je vous en seront reconnaissants
Fixe avec cette réponse, dans mon cas, j'ai été mise à jour toutes les forme au lieu de simplement le composant. causant la boîte de dialogue apparaissent deux fois.
OriginalL'auteur brevleq
Comme je l'ai dit sur le primefaces forum, vous êtes à la mise à jour de vos formes avec la boîte de dialogue... vous devez placer vos boîtes de dialogue de votre forme et de les mettre à jour separemment. Si vous avez besoin d'utiliser un formulaire dans votre boîte de dialogue puis de le placer dans la boîte de dialogue vous:
Ahh ne savais pas que l', avez-vous essayé au lieu de placer les moteurs de rendu sur votre boîte de dialogue, le placer dans le panelgrid. Je sais que c'est une merde solution, mais je ne peux pas penser à quelque chose de mieux à l'heure actuelle :p
OriginalL'auteur Lyrion
J'ai eu le même problème avec une boîte de dialogue, la solution était place dans la mise à jour du bouton de commande qui afficher la boîte de dialogue composant le numéro de la boîte de Dialogue Composant pas l'id du formulaire, la solution ressemble à ceci:
OriginalL'auteur user2680478
Je voudrais vérifier que votre widgetVar="#{idPopup}" id="#{idPopup}" est la même avant de vous les présenter et après l'envoi du formulaire. Peut-être qu'il a changé et primefaces pense qu'il n'existe plus et en crée une nouvelle.
peut-être poser une question sur le primefaces forum...les utilisateurs y sont très sensibles.
PrimeFaces widgetVar et JSF id pas être le même. J'ai lu que "d'or" de la règle dans un affichage par Optimus lui-même quelque part dans les forums. Ne peut pas le trouver maintenant.
OriginalL'auteur Tommy Chan
Ajouter le
oncomplete
attribut à votre bouton soumettre et de le laisser masquer la boîte de dialogue:OriginalL'auteur Matt Handy
mettre les formes à l'intérieur de boîte de dialogue n'est pas le meilleur moyen de le résoudre, si vous accéder à votre application avec IExplorer, les dialogues ne fonctionnent pas avec cette approche
OriginalL'auteur Juan
C'est un affreux bug avec pas de réponse officielle...
Je suis en utilisant une boîte de dialogue pour rendre une carte Google map. Ma façon de gérer le bug (à l'aide de JQuery) est de compter le nombre de ".carte" éléments dans le DOM sur primefaces:boîte de dialogue.onShow... je puis sélectionnez l' :dernier .carte de l'instance rendu (ou, dans votre cas, quelle que soit la classe de contenu vous travaillez), et .remove() de la boîte de dialogue qui contient:
De balisage (approx.):
JavaScript:
Si vous êtes un sadique, vous pouvez, tout à fait confortablement, en faire une seule ligne... je vois cela comme un Primefaces bug. Le bouton de fermeture devrait carrément détruire la boîte de dialogue.
OriginalL'auteur Charlie