2012-04-30 7 views
9

Привет У меня есть этот код условно рендеринга компонентов в моей странице:Условный рендеринга в JSF

<h:commandButton action="#{Bean.method()}" value="Submit"> 
    <f:ajax execute="something" render="one two" /> 
</h:commandButton> 

<p><h:outputFormat rendered="#{Bean.answer=='one'}" id="one" value="#{messages.one}"/></p> 
<p><h:outputFormat rendered="#{Bean.answer=='two'}" id="two" value="#{messages.two}"/></p> 

Он получает ответ и делает компонент, но для того, чтобы увидеть его на моей странице, мне нужно, чтобы обновить стр. Как я могу исправить эту проблему? Какие-либо предложения?

ответ

14

Атрибут компонента rendered компонента JSF - это параметр на стороне сервера, который определяет, должен ли JSF генерировать нужный HTML-код или нет.

атрибут The <f:ajax> тега render должен указывать на (относительно) клиента идентификатор JSF сгенерированного HTML элемент, который JavaScript может захватить с помощью document.getElementById() из HTML DOM дерева, чтобы заменить его содержимое на полный запроса Ajax.

Однако, поскольку вы указываете идентификатор клиента HTML-элемента, который никогда не отображается JSF (из-за rendered, являющегося false), JavaScript не может найти его в дереве HTML DOM.

Вы должны обернуть его в компонент контейнера, который всегда оказанной, и, таким образом, всегда доступны в дереве HTML DOM.

<h:commandButton action="#{Bean.method()}" value="Submit"> 
    <f:ajax execute="something" render="messages" /> 
</h:commandButton> 

<p> 
    <h:panelGroup id="messages"> 
     <h:outputFormat rendered="#{Bean.answer=='one'}" value="#{messages.one}"/> 
     <h:outputFormat rendered="#{Bean.answer=='two'}" value="#{messages.two}"/> 
    </h:panelGroup> 
</p> 

Unrelated к конкретной проблеме, вы, там возможный дизайн ошибки. Почему бы вам не просто создать #{Bean.message} свойство, которое вы установили с требуемым сообщением в способе действия вместо этого, так что вы можете просто использовать:

<h:commandButton action="#{Bean.method()}" value="Submit"> 
    <f:ajax execute="something" render="message" /> 
</h:commandButton> 

<p> 
    <h:outputFormat id="message" value="#{Bean.message}" /> 
</p> 
+0

Благодарим вас за ответ. Я сделал то, что я использовал render = "@ form" в своей форме, и это сработало. Я попробую хотя бы то, что вы предложили. – sandra

+0

Это действительно будет работать, если это родительский компонент, который всегда * отображается (точно так же, как мой ответ пытается сказать вам). Например, может быть, только лишние накладные расходы, если форма содержит 10 других компонентов, которые, например, не нуждаются в обновлении. – BalusC

+0

Можно ли добавить условие в рендеринг ajax? –

-1
style="visibility: #{questionchoose.show==false ? 'hidden' : 'visible'}" 
+0

Лучше не отображать элемент вообще, а не просто не отображать его. – dwjohnston

3

Я знаю, что это не центральная точка вопроса, но поскольку у меня была эта проблема много раз в прошлом, я просто разместил ее здесь, чтобы помочь другим, кто в ней нуждается. Для тех, кто использует PrimeFaces, есть компонент в PrimeFaces Extension, который называется Switch.

Иногда вам нужно отображать различные выходы или компоненты в зависимости от значения. Обычно вы можете достичь этого, используя тег ui:fragment. С тегом pe:switch util вам не нужно будет объявлять теги ui:fragment с другими чеками, такими как ui:fragment rendered="#{!empty someController.value}", больше.

Смежные вопросы