У меня есть "panelGroup" с render, который зависит от переменной boolean, и кнопкой, которая меняет состояние этого booleano, но в момент того, чтобы выходить ему click на кнопку, panelgroup не становится отвечающим современным требованиям до тех пор, пока он не перезагрузит страницу несмотря на то, что ДА у меня есть update.
xhtml:
<h:form >
<p:commandButton class="btn" value="mostrar foo"
action="#{developerController.foo}" update="foo"/>
<h:panelGroup id="foo" rendered="#{developerController.bar}">
foo
</h:panelGroup>
</h:form>
Мой bean:
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
@Named(value = "developerController")
@SessionScoped
public class DeveloperController implements Serializable {
private boolean bar;
public DeveloperController() {
}
public void foo() {
bar=!bar;
}
public boolean isBar() {
return bar;
}
public void setBar(boolean bar) {
this.bar = bar;
}
}
Что я должен делать для того, чтобы он стал отвечающим совремнным требованиям?
Как индийский Lithorel, rendered=false он виновный в том, что не становится отвечающим современным требованиям. Выражение это, другие выборы кроме той, которую он предлагает:
Выбор 1:
update="@form"
handicap состоит в том, что становится отвечающим современным требованиям весь form.
Выбор 2:
<h:form>
<p:commandButton class="btn" value="mostrar foo"
action="#{developerController.foo}" update="miPanel"/>
<p:outputPanel id="miPanel">
<h:panelGroup id="foo" rendered="#{developerController.bar}">
foo
</h:panelGroup>
</p:outputPanel>
</h:form>
Элемент miPanel красится всегда и следовательно ты можешь обновлять это.
Выбор CSS также хороший, это вопрос вкуса.
renderer способствует тому, чтобы твой panelGroup не пошел в html а следовательно update не служит, так как элемент id=foo не существует.
Решение состоит в том, чтобы использовать display:none / display:block в style и делать выбор с условным bean.
<h:form >
<p:commandButton class="btn" value="mostrar foo"
action="#{developerController.foo}" update="foo"/>
<h:panelGroup id="foo" style="#{developerController.bar ? 'display:block;' : 'display:none'}">
foo
</h:panelGroup>
</h:form>
Когда хочет стать отвечающим совремнным требованиям признак rendered
элемента, update
нужно выполнять в элемент отца:
<h:form id="frmFoo">
<p:commandButton class="btn" value="mostrar foo"
action="#{developerController.foo}" update="frmFoo"/>
<h:panelGroup id="foo" rendered="#{developerController.bar}">
foo
</h:panelGroup>
</h:form>
С rendered
в false
, элемент не существует, поэтому это не находит, сделав update
.
Очень хорошие выборы уже упомянутая, я предполагаю, что то, что ты разрабатываешь, идет за пределами простого foo.
Также ты можешь использовать styleClass, чтобы реализовывать update и это распределять только в элементы, которые ты хочешь обновить, чтобы избегать использовать столько контейнеров и более длинных ссылок; когда твой код вырастет значительно, тебе сможет казаться практичность этой технической.
Обрати внимание в следующем примере, как одинокий мы обновляем элемент, не импортируя, что такое укрытое находилось.
<h:form >
<p:commandButton class="btn" value="Calcular Neto" action="#{beanController.calcular}"
update="@(.neto)"/>
<h:panelGroup id="contenedorPrincipal" >
<h:panelGroup....
<h:panelGroup......
<h:outputText value="Neto: "/>
<h:outputText styleClass="neto" value="#{bean.neto}" />
</h:panelGroup>
</h:panelGroup>
</h:panelGroup>
</h:form>
Здесь ты можешь находить путеводитель с этой и другими техниками, которые сделают тебе более легкими обнаруживать твои компоненты:
Привет!