2013-02-20 3 views
0

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로 부울 플래그를 설정하면이 상황이 적용됩니다.

+0

조치 리스너가 수행하는 작업이 해당 플래그를 재설정하는 경우, 다양한 구성 요소의 조치 수신기를 관리 Bean의 동일한 메소드로 지정할 수 있습니다. 그렇지 않습니까?따라서 그 값을 재설정 한 곳은 단 하나입니다. – Bogdan

+0

'someCondition'을 검사하기위한 로직을'preRenderView' 이벤트 리스너로 옮길 수없는 이유는 무엇입니까? 청취자는 모든 포스트 백에서 변수의 상태를 전환해야합니다. – kolossus

+0

다른 ActionListener 메소드 (위에서 보았 듯이 methodB()와 methodC())는 해당 플래그를 재설정하는 것 이상을 수행합니다. 사실, methodB()와 methodC()는 플래그를 false로 설정하지 않으면 데이터 테이블이 표시되어서는 안되는 경우를 제외하고는 해당 플래그와 아무런 관련이 없습니다. –

답변

0

당신은 primefaces 태그를 추가하지 않았지만, 코드에 따르면 나는 당신이 Primeface를 사용하고있는 것을 볼 수 있습니다. 예를 들어 p:commandButton과 같이 methodA()이 호출되었다고 가정하십시오. 나는 primefaces에게 원격 명령을 생성하는 첫 번째 제안 :

<p:remoteCommand name="resetRenderLocationTable"> 
    <f:setPropertyActionListener value="#{false}" target="#{loc.renderLocationTable}"/> 
</p:remoteCommand> 

이 누구의 전화 falserenderLocationTable 속성을 설정합니다 AJAX 요청을 생성합니다 resetRenderLocationTable라는 자바 스크립트 함수를 작성합니다. 이제 당신 commandButton (또는 다른 AJAX 원)의 oncomplete에 해당 함수에 대한 호출을 추가 :

<p:commandButton action="#{loc.methodA()}" update="myDatatable" oncomplete="resetRenderLocationTable()"/> 

당신은 당신의 데이터 테이블을 업데이트,이 속성을 재설정에 대해 걱정할 필요가 없습니다 다음 요청에서.

+0

좋은 생각처럼 들리네! 필자는 전에 "p : remoteCommand"에 대해 들어 본 적이 없었습니다. 그리고 저는 오랫동안 Primefaces를 사용해 왔습니다. 나는 그것을 시도하고 알려 드리겠습니다. 지연된 응답을 드려서 죄송합니다. 나는 오늘까지 휴가 중이었다 (라스베가스). –

+1

당신에게 좋습니다;) – partlov

관련 문제