2012-08-12 13 views
6

mam tę prostą stronę:Primefaces DataTable, leniwy załadunku i CommandButton za rzędzie

<h:form id="form"> 

    <p:dataTable value="#{testBean.unitTypeModel}" var="elem" lazy="true" rows="10"> 
     <p:column headerText="class">#{elem.class.simpleName}</p:column> 
     <p:column headerText="code">#{elem.code}</p:column> 
     <p:column headerText="description">#{elem.description}</p:column> 
     <p:column headerText="action"> 
      <p:commandButton action="test2" icon="ui-icon ui-icon-wrench" value="edit"> 
       <f:setPropertyActionListener target="#{testBean.selection}" value="#{elem}"/> 
      </p:commandButton> 
     </p:column> 
    </p:dataTable> 

    <p:commandButton action="test2" icon="ui-icon ui-icon-wrench"/> 

</h:form> 

i tym CommandButton wewnątrz DataTable nie pracuje, tylko odświeża stronę. , ale ten na zewnątrz działa.

jeśli zmienię value i lazy ten sposób:

<h:form id="form"> 

    <p:dataTable value="#{testBean.unitTypeModel.load(0, 10, null, null, null)}" var="elem" lazy="false" rows="10"> 
     <p:column headerText="class">#{elem.class.simpleName}</p:column> 
     <p:column headerText="code">#{elem.code}</p:column> 
     <p:column headerText="description">#{elem.description}</p:column> 
     <p:column headerText="action"> 
      <p:commandButton action="test2" icon="ui-icon ui-icon-wrench" value="edit"> 
       <f:setPropertyActionListener target="#{testBean.selection}" value="#{elem}"/> 
      </p:commandButton> 
     </p:column> 
    </p:dataTable> 

    <p:commandButton action="test2" icon="ui-icon ui-icon-wrench"/> 

</h:form> 

CommanButton wewnątrz DataTable działa jak czar.

ktoś wie, dlaczego?

czy to błąd?

jestem na

  • GlassFish 3.1.2
  • JSF 2.1.11 (Mojarra)
  • PrimeFaces 3,4-SNAPSHOT

Odpowiedz

7

okazało się, że leniwy datamodel musi być to samo wystąpienie w przypadku żądania odświeżenia, nawet nowa instancja o tych samych wartościach nie będzie działać. więc musi być dostarczony z przynajmniej fasoli @ViewScoped.

+1

To nie jest do końca prawda: Jest to pomocne, jeśli ta sama instancja 'LazyDataModel' znajduje się w sesja przy użyciu '@ ViewScoped', ale możesz także użyć' @ RequestScoped'. Chodzi o to, że metoda 'isRowAvailable()' musi zwracać wartość true, gdy jest oceniana w 'APPLY_REQUEST_VALUES', a pole' pageSize' musi zawierać wartość większą od zera. Osiągnąłem to poprzez rozszerzenie 'LazyDataModel' podczas przeciążania dwóch metod:' isRowAvailable() ', tutaj nazywam' load (...) 'i stosuję wynik do' setWrappedData() 'i drugiej metody' setRowIndex (int rowIndex) 'gdzie ustawiłem' pageSize' na moje domyślne – uvo

1

Minęły cztery lata od opublikowania tego pytania, ale problem nadal pozostaje w en PrimeFaces 6.0.

Zamierzam opublikować obejście dla tych, którzy nie chcą (lub nie mogą) używać fasoli ViewScoped.

Założeniem jest: "nie można umieścić żadnego" zelifikowanego "elementu wewnątrz leniwego elementu datacable związanego z elementami RequestScoped". Nigdy. Pamiętaj, że wszystko, co rzuca połączenie ajaxowe, nigdy nie zadziała.

Pierwszym krokiem jest pobranie wywołania ajax poza datatable. Zrobimy to za pomocą RemoteComand. Możesz umieścić ten RemoteCommand gdziekolwiek poza DataTable (wewnątrz formy, oczywiście)

<p:remoteCommand name="remoteCall" action="#{bean.doStuff()}"> 
</p:remoteCommand> 

Teraz wszystko, co musimy zrobić, to nazywamy to RemoteCommand od wewnątrz DataTable. Używam link do wykonywania javascript połączenia, ale można użyć przycisku lub cokolwiek chcesz:

<p:column> 
    <p:link value="#{item.id}" href="#" onclick="remoteCall([{name:'id', value:#{item.id}}])"> 
    </p:link> 
</p:column> 

Ten link to sposób wywołania funkcji javascript „remoteCall”, który wykona połączenie AJAX "bean.doStuff()".

Należy zauważyć, że zdarzenie onClick zawiera nie tylko wywołanie javascript do "remoteCall", ale zawiera także tablicę parametrów z jednym tylko parametrem o nazwie "id" o wartości "# {item.id}". Umożliwi to RemoteCommand wysłanie parametru o nazwie "id" do komponentu bean.

Wewnątrz „DoStuff” metody musisz odzyskać „ID” wartość parametru:

public void doStuff() { 

    String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id"); 

}