2014-01-07 2 views
0

Предположим, что у меня есть этот небольшой фрагмент кода:е: Аякса оказывается = ложь по умолчанию

<h:panelGroup id="panel1" rendered="falseByDefault"> 
    <h:selectBooleanCheckbox value="#{bean.booleanProperty}"> 
     <f:ajax event="click" render="alwaysrendered"> 
    </h:selectBooleanCheckbox> 
</h:panelGroup> 

<h:panelGroup id="alwaysrendered"> 
    <h:panelGroup id="panel2" rendered="#{!bean.booleanProperty}"> 
     <p>Some stuff here</p> 
    </h:panelGroup> 
</h:panelGroup> 

panel1 не оказанной, пока не будет нажата еще один компонент. Значение booleanProperty истинно по умолчанию, пока я не нажму booleanCheckBox, поэтому панель2 должна появиться в этот момент из-за запроса ajax для повторной обработки alwaysrendered.

Не работает. Я думаю, потому что тег «f: ajax» находится внутри компонента, который не отображается при загрузке страницы.

Что вы думаете об этом? Вы знаете какой-либо другой способ сделать эту работу?

Резюме: Я хочу отобразить компонент с тегом, который находится внутри панели, не отображаемой по умолчанию.

Спасибо!

ответ

1

Не работает. Я думаю, потому что тег находится внутри компонента, который не отображается при загрузке страницы.

В чем проблема. JSF ajax update, заменив элементы в DOM-дереве браузера на новую версию. Но если такого элемента нет с идентификатором, который вы только что повторно отображали, потому что он не был ранее представлен, тогда браузер не знает, куда положить этот обновленный элемент и игнорировать его.

Попробуйте что-нибудь подобное вместо этого:

<h:panelGroup id="panel2" > 
    <h:panelGroup rendered="#{!bean.booleanProperty}"> 
     <p>Some stuff here</p> 
    </h:panelGroup> 
</h:panelGroup> 

Кроме того, необходимо установить компонент, по крайней мере @ViewScoped. Это происходит потому, что он работает следующим образом:

Первоначально ваша первая панель не видна из-за «rendered="falseByDefault"». Затем вы щелкаете что-то еще, и это условие становится true, делая вашу панель видимой, но только для этого запроса + ответа. Теперь вы нажмете на флажке на этой видимой панели и хотите установить #{bean.booleanProperty} на другое значение, чтобы показать панель2. Запрос будет отправлен, но JSF проведет некоторые проверки достоверности этого запроса. Он также проверяет, что флажок, который вы только что нажали, может быть вызван (это означает, что он был виден). Но поскольку панель вокруг этого флажка больше не видна (она видна только для одного запроса), JSF решает, что этот запрос недействителен и не обрабатывает его так, как вы этого хотите. Вот почему логическое значение вашего флажка никогда не изменяется, и панель panel2 не будет видна.

Как правило: никогда не используйте @RequestScoped вместе с запросами Ajax.

+0

Я отредактировал # 1, он тоже не работает – Pablo

+0

@Pablo Держите это так, это была проблема наверняка. Какую область для вашего компонента вы используете? Вы отлаживали запрос и видели, как выглядит ваш запрос и ответ? Есть ли в ответе правильные элементы? – noone

+0

Моя фасоль RequestScoped, я думаю, что ответ правильный. Если panel1 имеет rendered = true по умолчанию, он работает. – Pablo

0

Вам нужно поместить тег обертки с идентификатором вокруг панели «панель »2, а затем ссылаться на этот объект в атрибуте рендеринга ajax. Это необходимо, потому что javascript пытается обновить компоненты по id. Но когда он не отображается и поэтому не найден, обновление не произойдет.

+0

Я редактировал # 1, он не работает ни – Pablo

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