Question

J'ai la page suivante:

<h:form id="gameSelectionForm">
    <h:selectOneMenu id="gameSelection">
        <f:selectItems value="#{gameBean.gameIds}" />
    </h:selectOneMenu>
    <h:commandButton id="gameSelector" value="Play" action="#{gameBean.changeGame}"  />
</h:form>

<h:panelGroup id="gameDiv">
    <f:verbatim>
        <iframe src="/levelup/resources/games/#{gameBean.gameId}/#{gameBean.htmlPage}"  width="700px" height="800px" frameborder="0"/>
    </f:verbatim>
</h:panelGroup>

Lorsque je clique sur le bouton « gameSelector », voici la séquence des événements: 1. gameBean.getGameId et gameBean.getHtmlPage sont appelés 2. gameBean.changeGame est appelé 3. La page est mise à jour.

Mes problèmes réside dans l'ordre de 1. et 2. Les changeGame modifie une variable gameBean qui est utilisé par le getGameId et getHtmlPage. Je veux donc il exécuter en premier, de sorte que lorsque d'autres panneaux sont mises à jour, ils contiennent les données appropriées.

S'il vous plaît noter que ce problème semble se produire uniquement pour l'appel dans l'élément gameDiv (autres variables sont correctement mis à jour).

Auriez-vous une idée de ce que je pouvais faire pour revenir l'ordre de 1. et 2., de sorte que la méthode changeGame () est le premier appelé?

J'utilise JavaServer Faces 2.0 sur Tomcat 7.0.

Merci à l'avance

Était-ce utile?

La solution

Selon votre propre réponse sur ce sujet:

  

J'ai enlevé le f: tag mot pour mot, et maintenant il fonctionne correctement. Je ne comprends toujours pas pourquoi il a fait ce comportement bien.

Le <f:verbatim> a été introduit dans JSF 1.0 un dos long temps dans le seul but d'être en mesure d'inclure HTML brut dans l'arborescence des composants JSF. Le JSF 1.0 (et 1.1), lorsque l'arborescence des composants se construit, tout le HTML brut a été ignoré. La page se rendu avec le HTML brut d'abord, puis le code HTML rendu des composants JSF après . Ainsi, par exemple

<p>Hello</p>
<h:inputText />
<p>World</p>
<h:outputText value="outputtext" />
<p>This is weird</p>

get rendu sous la forme

<p>Hello</p>
<p>World</p>
<p>This is weird</p>
<input type="text" />
outputtext    

Les développeurs <f:verbatim> autorisés à prendre HTML ordinaire dans l'arborescence des composants JSF, de sorte qu'ils se rendaient « en phase » que vous attendez du codage.

<f:verbatim><p>Hello</p></f:verbatim>
<h:inputText />
<f:verbatim><p>World</p></f:verbatim>
<h:outputText value="outputtext" />
<f:verbatim><p>This is weird</p></f:verbatim>

Ils cependant s'inline pendant la vue build le temps, pas pendant la vue render temps. Ceci est la cause de votre problème, les getters s'invoquées lors de la restauration phase de vue au lieu de rendre la phase de réponse.

Depuis JSF 1.2, avec le gestionnaire de meilleure vue, il était possible de inline HTML brut « en phase » sans marchandage avec des balises <f:verbatim> laid. Donc, il est plus nécessaire. Il y a aussi des cas d'utilisation non utiles pour l'étiquette plus, attendez-vous de peut-être quelques optimisations de performances prématurées, mais alors, vous ne devriez pas l'utiliser en combinaison avec des données dynamiques obtenues par expression linguistique.

Questions connexes:

Autres conseils

Mettre un ensemble d'attributs immédiat true sur le commandButton.

<h:commandButton id="gameSelector" value="Play" action="#{gameBean.changeGame}" immediate="true" />

Il exécutera la méthode dans la phase de ApplyRequestValues ??alors.

Je retire f: tag mot pour mot, et maintenant il fonctionne correctement. Je ne comprends toujours pas pourquoi il a fait ce comportement bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top