Вопрос по jsf-2, rendering, jsf, page-refresh – Условный рендеринг в JSF [дубликат]

10

This question already has an answer here:

Ajax update/render does not work on a component which has rendered attribute 1 answer

Здравствуйте, у меня есть этот код для условного рендеринга компонентов на моей странице:

<code><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>
</code>

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

Ваш Ответ

3   ответа
3

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

Sometimes you need to display different outputs or components depending on a value. Usually you can achieve this by using the ui:fragment tag. With the pe:switch util tag you won't have to declare ui:fragment tags, with different checks like ui:fragment rendered="#{!empty someController.value}", anymore.

-1
style="visibility: #{questionchoose.show==false ? 'hidden' : 'visible'}"
Лучше не отображать элемент вообще, чем просто не отображать его.
15

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

<f:ajax> Тег & APOS; srender атрибут должен указывать на (относительный) идентификатор клиента HTML-элемента, сгенерированного JSF, который JavaScript может получитьdocument.getElementById() из дерева DOM HTML, чтобы заменить его содержимое по завершению запроса ajax.

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

Вы должны обернуть его в компонент контейнера, которыйalways оказано и, таким образом,always доступно в дереве 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>
Это действительно также будет работать, если это родительский элемент компонента, который являетсяalways оказано (именно так, как мой ответ пытается сказать вам). Может быть только ненужные накладные расходы, если форма содержит 10 других компонентов, которые, к примеру, вообще не нуждаются в обновлении.
Спасибо за ответ. Я сделал то, что использовал render = & quot; @ form & quot; в моей форме и это сработало. Я постараюсь, хотя, что вы предложили. sandra
мы можем добавить условие в рендеринг ajax?

Похожие вопросы