2014-03-28 3 views
1

다음과 같이 <p:dataTable>이 있습니다.p : dataTable/p : dataGrid 및 f : setPropertyActionListener의 지연로드

<p:dataTable var="row" value="#{testManagedBean.list}"> 
    <p:column> 
     <h:outputText value="#{row.subCatId}"/> 
    </p:column> 

    <p:column> 
     <p:commandLink process="@this"> 
      <h:outputText value="#{row.subCatName}"/> 
      <f:setPropertyActionListener target="#{testManagedBean.subCatName}" value="#{row.subCatName}"/> 
     </p:commandLink> 
    </p:column> 
</p:dataTable> 

관리 빈인 RequestScoped 관리 빈은 다음과 같습니다. <p:dataTable> 내부 <p:commandLink>이 클릭되면

@ManagedBean 
@RequestScoped 
public final class TestManagedBean 
{ 
    @EJB 
    private final TestBeanLocal testService=null; 
    private List<SubCategory>list; 
    private String subCatName; 

    @PostConstruct 
    private void init() 
    { 
     list=testService.getSubCategoryList(); 
    } 

    public List<SubCategory> getList() { 
     return list; 
    } 

    public String getSubCatName() { 
     return subCatName; 
    } 

    public void setSubCatName(String subCatName) { 
     System.out.println("setSubCatName() called : "+subCatName); 
     this.subCatName = subCatName; 
    } 
} 

<f:setProperyActionListener> (setSubCatName())와 관련된 대응하는 설정 메소드가 호출되고, 그 값은 정확하게이 빈 관리에 subCatName 된 목표 속성으로 설정된다.

필자는 페이징과 같은 많은 것들을 피하면서 최소한의 예를 가지고 있습니다.


지금, 나는 게으르게이 <p:dataTable>를 채울 필요가있다. 이 <p:dataTable>과 해당 관리 빈을 다음과 같이 변경하려고합니다.

<p:dataTable var="row" value="#{testManagedBean}" lazy="true" rows="10" rowIndexVar="rowIndex"> 
    <p:column> 
     <h:outputText value="#{row.subCatId}"/> 
    </p:column> 

    <p:column> 
     <p:commandLink process="@this"> 
      <h:outputText value="#{row.subCatName}"/> 
      <f:setPropertyActionListener target="#{testManagedBean.subCatName}" value="#{row.subCatName}"/> 
     </p:commandLink> 
    </p:column> 
</p:dataTable> 

관리되는 관련 JSF가 아래에 나와 있습니다. <p:dataTable> 내부 <p:commandLink>이 클릭되면

@ManagedBean 
@RequestScoped 
public final class TestManagedBean extends LazyDataModel<SubCategory> implements Serializable 
{ 
    @EJB 
    private final TestBeanLocal testService=null; 
    private String subCatName; 
    private static final long serialVersionUID = 1L; 

    public String getSubCatName() { 
     return subCatName; 
    } 

    public void setSubCatName(String subCatName) { 
     System.out.println("setSubCatName() called : "+subCatName); 
     this.subCatName = subCatName; 
    } 

    @Override 
    public List<SubCategory> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) 
    { 
     setRowCount(4); //Just an example. Otherwise, fetch from the database. 
     return testService.getSubCategoryList(first, pageSize, sortField, sortOrder, filters); 
    } 
} 

이제, 해당 세터 방법 <f:setProperyActionListener> (setSubCatName())과 관련된 호출 하지이다. 관리 빈은

는 왜 요청하지 <f:setPropertyActionListener> 작업이 관리 관리의 범주가 지정된 않는다 (true로 설정되어 lazy의 경우) @ViewScoped 같은 넓은 범위를 장식 할 때

setSubCatName()은, 호출 콩, <p:dataTable> (또한 <p:dataGrid>에 해당)은 지연로드?

이러한 경우에는 요청 범위보다 넓은 관리 빈을 지정해야합니까?

답변

1

예 기본 모델이 동일한 인스턴스 여야하기 때문에 필수입니다. 동일한 값을 가지고 있더라도 작동하지 않습니다.

너와 같은이 행동을 만났습니다. primefaces datatable lazy loading and commandbutton per row

+0

고맙습니다! :) – Tiny

+0

당신은 환영합니다;) –