Réglage de l'interface utilisateur:param conditionnellement
Je veux mettre une interface utilisateur:param selon un haricot valeur et j'ai pensé à l'aide de c:si c'était une bonne idée. Donc je l'ai mis dans ma page le code suivant:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:wai="http://www.id.ethz.ch/wai/jsf"
template="/view/listView.xhtml">
<c:if test="#{subscriptionListController.model.listViewName eq 'mySubscriptions'}">
<ui:param name="title" value="#{msg.subscriptionTitleMySubscriptions}"/>
</c:if>
<c:if test="#{subscriptionListController.model.listViewName eq 'paidSubscriptions'}">
<ui:param name="title" value="#{msg.subscriptionTitlePaidSubscriptions}"/>
</c:if>
<c:if test="#{subscriptionListController.model.listViewName eq 'allSubscriptions'}">
<ui:param name="title" value="#{msg.subscriptionTitleAllSubscriptions}"/>
</c:if>
....
mais le paramètre n'est pas défini...
Si je laisse imprimer la valeur de #{subscriptionListController.model.listViewName eq 'mySubscriptions'}
- je obtenir vrai dans le cas correspondant et de faux dans les deux autres cas.
Au début je n'avais que 2 possibilités et résolu avec l'opérateur ternaire:
<ui:param name="title" value="#{subscriptionListController.model.listViewName eq 'mySubscriptions' ? msg.subscriptionTitleMySubscriptions : msg.subscriptionTitlePaidSubscriptions}"/>
et cela a fonctionné. Mais maintenant, j'ai plus de possibilités...
Ce que je fais mal?
Vous n'êtes pas clair sur quand elle fonctionne exactement/échoue. Le
Le
BalusC Ok, le
Pouvez-vous s'il vous plaît mettre votre commentaire en réponse à une question, de sorte que je peux l'accepter, s'il vous plaît?
<c:if>
s bien, mais <c:otherwise>
est complètement déplacé. Il appartient à une <c:choose>
. Aussi le code semble être incomplète, ce qui semble être un modèle de client, mais je suis loin d'en voir la <ui:define>
. Vous savez que quelque chose d'extérieur à <ui:define>
et <ui:composition>
est ignoré par les Facelets?Le
<ui:composition>
est là (voir la première ligne de code), donc il ne devrait pas être ignorée. J'ai enlevé le <c:otherwise>
et ajouté un c:if
à la place. mais cela ne fonctionne toujours pas... Comme l'a dit, avec l'opérateur ternaire sans problèmes, mais avec le c:if
nope... (j'ai édité mon code, la valeur pour le titre était faux)BalusC Ok, le
<ui:define>
est défini ci-dessous. J'ai changé le c:if
code et maintenant ça fonctionne! Mais pouvez-vous maintenant expliquez-moi pourquoi avec la sterne. op. fonctionne même si c'est en dehors de la <ui:define>
? J'ai d'ailleurs d'autres ui:param
définie en dehors d'elle (juste en dessous de la c:if
) et qu'ils travaillent...Pouvez-vous s'il vous plaît mettre votre commentaire en réponse à une question, de sorte que je peux l'accepter, s'il vous plaît?
OriginalL'auteur Francesco | 2013-12-04
Vous devez vous connecter pour publier un commentaire.
Comme indiqué par
<ui:composition template>
, cette page représente un modèle de client.Tout
<ui:param>
à l'extérieur<ui:define>
s'applique au modèle de master (le fichier que vous avez déclaré danstemplate
attribut) et est ignorée à l'intérieur du modèle client lui-même. Si vous avez l'intention de préparer des variables pour l'intérieur de la client modèle, vous devez mettre<ui:param>
à l'intérieur de<ui:define>
.Mais il y a autre chose: le but initial de
<ui:param>
est de passer des variables dans le fichier référencé par<ui:composition template>
,<ui:decorate template>
ou<ui:include src>
, pas pour préparer et définir les variables à l'intérieur de l'actuel facelet contexte. Pour la seule exigence fonctionnelle de la préparation ou de la définition de variables dans le courant EL contexte, vous feriez mieux d'être à l'aide de JSTL<c:set>
pour le travail. Vous peut utilisation<ui:param>
pour cela, mais ce n'est pas son but initial, et ne fonctionne pas de cette façon dans les anciennes MyFaces versions.Donc, dans:
Sans rapport avec à la de béton problème, vous pouvez optimiser cette comme suit, sans la nécessité d'une désuète
<c:if>
groupe qui ne fera que croître avec chaque type d'abonnement:avec ces touches de
merci pour le MyFaces mise à jour.
par la façon dont je suis également d'accord que nous devrions vraiment garder le
<c:set>
. Sa capacité à stocker la valeur évaluée dans un périmètre donné (demande/view/session/l'application est très apprécié. Le<ui:param>
ne le supporte pas (l'expression est réévalué à chaque accès) et aussi le nom de la balise "param" est à son propre pas vraiment l'auto-documentation à l'exigence fonctionnelle de la "définition d'une variable dans EL contexte".absolument, c:jeu est en effet très utile. Ce que nous avons fait dans MyFaces a été corrigé c:pour utiliser la page de portée lorsqu'aucun champ d'application est défini comme dans la JSP et de créer un "modèle de contexte" pour stocker de l'interface utilisateur:param variables. Les deux c:jeu et de l'interface utilisateur:param repose toujours sur EL VariableMapper installation et sont considérés comme construire des temps d'affichage des balises. Sans ce correctif, quelques optimisations comme EL de la mise en cache ne peut pas être effectué correctement. Vraiment de l'interface utilisateur:param est un tag utilisé pour passer d'un paramètre sous la forme d'une Expression EL pour le modèle.
OriginalL'auteur BalusC
Vous utilisez JSTL avec Facelets. JSTL sont exécutées pendant les temps de construction, et non pas en phase de rendu. En outre, il y a quelques problèmes avec le traitement dans JSF2 bibliothèques - comme dans les anciennes Mojarra versions, où ils ne travaillent pas sur la vue étendue de haricots partielle de l'etat d'économie - voir https://stackoverflow.com/a/3343681). C'est pourquoi votre expression EL a travaillé.
La solution est d'éviter de JSTL - utilisation de l'interface utilisateur:répéter au lieu de c:forEach et EL expression et à la condition que le rendu au lieu de c:si.
primefaces composants, ainsi que de l'interface utilisateur:fragment d'avoir "rendu" attribut, qui prend expression EL.
Ok, je vois l'interface utilisateur:param a rendu attribut trop (je n'ai pas pensé...)
Mmm, maintenant, j'ai
<ui:param name="title" value="#{msg.subscriptionTitleMySubscriptions}" rendered="#{subscriptionListController.model.listViewName eq 'mySubscriptions'}"/>
(trois fois pour les différentes possibilités), mais ça ne fonctionne pas. Maintenant, la dernière des trois, est toujours choisi...J'ai aussi essayé de préciser les true, false, false au lieu de la vérification de l'EL, mais bien que la dernière est faux, c'est celui qui est "rendue"
OriginalL'auteur Web Devie