ViewScoped ManagedBean이 있습니다. 이 bean은 데이터 테이블의 표시 여부를 제어하는 부울 속성을가집니다. 아래를 참조JSF ViewScoped Bean의 속성을 렌더링 후 초기 값으로 다시 설정합니다.
<p:dataTable value="#{loc.locationRows}" var="obj" ... rendered="#{loc.renderLocationTable}">
<p:column>
...
</p:column>
...
</p:dataTable>
내 ManagedBean은은 다음과 같습니다 : 즉시 methodA()가 호출되는으로
@ManagedBean(name = "loc")
@ViewScoped
public class LocationController implements Serializable {
private boolean renderLocationTable = false;
// JSF ActionListener.
public void methodA() {
if(someCondition) {
renderLocationTable = true; // this is the only time we should render location table
}
}
}
일부 조건이 다음 표는 렌더링되어야한다 충족; 그리고이 잘 작동합니다. 하지만 문제는 이것입니다. 호출 된 JSF ActionListener 메소드 각각에 대해 렌더링 된 부울을 false로 다시 명시 적으로 설정해야합니다. 아래 참조 :
@ManagedBean(name = "loc")
@ViewScoped
public class LocationController implements Serializable {
private boolean renderLocationTable = false;
// JSF ActionListener.
public void methodA() {
if(someCondition) {
renderLocationTable = true; // this is the only time we should render location table
}
}
// JSF ActionListener.
public void methodB() {
renderLocationTable = false;
}
// JSF ActionListener.
public void methodC() {
renderLocationTable = false;
}
}
실제 ManagedBean 및 XHTML 파일의 아주 작은 조각을 제공했습니다. 실제로,이 파일은 거대하며 많은 다른 불린 "렌더링 된"플래그가 사용됩니다. 이러한 플래그를 정확하게 유지하는 것이 점차 어려워지고 있습니다. 게다가 각 ActionListener 메소드는 현재 비즈니스와 관련이없는 경우에도 모든 부울 플래그에 대해 알아야합니다.
이 내가 할 수있을 싶어요 것입니다 :
public void resetRenderLocationTable(ComponentSystemEvent event) {
renderLocationTable = false;
}
것은이 좋지 않을까 다음 ManagedBean은에
다음<f:event type="postRenderView" listener="#{loc.resetRenderLocationTable}" />
<p:dataTable value="#{loc.locationRows}" var="obj" ... rendered="#{loc.renderLocationTable}">
<p:column>
...
</p:column>
...
</p:dataTable>
이 방법이 있나요? 부울 변수 재설정으로 더 이상 게임을하지 않아도됩니다. 테이블을 표시하지 않아야하는지 여부를 확인해야하는 테스트 사례가 더 이상 없습니다. 적절한 JSF ActionListener 메소드가이를 true로 설정하면 렌더링 된 플래그를 true로 설정할 수 있으며 "post-back"호출은 플래그를 false로 다시 설정합니다. ... Perfect. 하지만 JSF를 사용하여 즉시 사용할 수있는 방법은 없습니다.
누구나이 문제에 대한 해결책이 있습니까?
감사합니다.
그런데이 상황은 아마도 생각보다 훨씬 더 많이 발생합니다. ActionListeners를 사용하여 여러 commandButton을 가진 폼이있을 때마다이 상황이 발생할 수 있습니다. JSF ManagedBean을 가지고 있고 클래스에 흩어져있는 true 또는 false로 부울 플래그를 설정하면이 상황이 적용됩니다.
조치 리스너가 수행하는 작업이 해당 플래그를 재설정하는 경우, 다양한 구성 요소의 조치 수신기를 관리 Bean의 동일한 메소드로 지정할 수 있습니다. 그렇지 않습니까?따라서 그 값을 재설정 한 곳은 단 하나입니다. – Bogdan
'someCondition'을 검사하기위한 로직을'preRenderView' 이벤트 리스너로 옮길 수없는 이유는 무엇입니까? 청취자는 모든 포스트 백에서 변수의 상태를 전환해야합니다. – kolossus
다른 ActionListener 메소드 (위에서 보았 듯이 methodB()와 methodC())는 해당 플래그를 재설정하는 것 이상을 수행합니다. 사실, methodB()와 methodC()는 플래그를 false로 설정하지 않으면 데이터 테이블이 표시되어서는 안되는 경우를 제외하고는 해당 플래그와 아무런 관련이 없습니다. –