2012-01-10 10 views
7

Mam tabelę danych. Każdy wiersz tabeli ma commandButton o nazwie "Usuń", który ma usunąć ten wiersz z modelu i widoku i wykonać aktualizację w miejscu. Jako stopka mam inny commandButton o nazwie "Usuń każdy wiersz".Datatable nie aktualizuje się po pomyślnym wywołaniu ajax

Ostatni przycisk działa. Klikam na niego, każdy wiersz jest usuwany z modelu (tzn. ArrayList zawierający elementy staje się pusty) i dataTable i footer facet jest ponownie renderowany (lub aktualizowany) w widoku.

Z drugiej strony, po kliknięciu przycisku w jednym z wierszy, aby go usunąć, częściowo działa. Odpowiedni element zostanie usunięty z modelu, ale widok nie zostanie zaktualizowany. Ten wiersz nadal istnieje w numerze dataTable, a numer footer facet nie został zmieniony.

Mam następujący kod w moim users.xhtml.

<f:metadata> 
    <f:viewParam name="id" value="#{users.id}" /> 
    <f:event type="preRenderView" listener="#{users.init}" /> 
</f:metadata> 

... 

<h:form id="usersForm"> 
    <p:outputPanel>  
     <p:dataTable id="userTable" value="#{users.user.friendList}" var="friend"> 
      <p:column> 
       <h:outputText value="#{friend.name}" /> 
      </p:column> 
      <p:column> 
       <p:commandButton action="#{users.user.removeFriend(friend)}" 
        ajax="true" 
        update="userTable somethingElse" process="@this" 
        onerror="errorDialog.show();" 
        icon="ui-icon-delete" 
        title="delete user"> 
       </p:commandButton> 
      </p:column> 

      <f:facet id="somethingElse" name="footer"> 
        aye: ${users.user.xxx} 
      </f:facet> 
     </p:dataTable> 

    </p:outputPanel> 

    <p:commandButton action="#{users.user.removeAllFriends()}" ajax="true" 
       update="userTable somethingElse" 
       process="@this" 
       icon="ui-icon-close" 
       value="delete all friends?"> 
    </p:commandButton> 


</h:form> 

Więc, jak myślisz, jaki jest tutaj problem?

Używam JSF 2.0 i Primefaces 3,0

+0

Nie zadawaj wielu pytań w jednym pytaniu. Jedno pytanie na pytanie, proszę :) Wydałem drugie pytanie. Również powiązane poprzednie pytanie nie jest w ogóle powiązane. To może ten sam kod, ale problem nie jest taki sam. Co do obecnego problemu: z której wersji PF korzystasz? Co się stanie, jeśli zamiast tego użyjesz 'update =" @ form "'? – BalusC

+0

Przepraszamy za złe słowa, ale dziękuję bardzo, jeszcze raz :) O wiele pytań, postaram się dać z siebie wszystko następnym razem :) –

+0

Przepisałem to jako odpowiedź :) – BalusC

Odpowiedz

11

uznaję tę formę problemu jeden z naszych obecnych PF 3,0 stron. Będzie działać, jeśli użyjesz zamiast tego update="@form". Nie miałem czasu, aby zbadać prawdziwą przyczynę, aby móc zgłosić to facetom z PF, ponieważ ten problem nie występuje na wszystkich stronach. Nawet w tej samej tabeli inny przycisk działa tak, jak zamierzał.

Spróbować:

<p:commandButton update="@form" ... /> 

Aktualizacja: Jadąc o tym myśleć, to być może związane z obecnością process="@this".

+0

Podoba mi się twoja odpowiedź lepiej, ponieważ jest o wiele bardziej wydajna i czysta. Zastanawiam się, czy ta poprawka będzie działać również dla aplikacji działających na Primefaces 2.2.1? Będę musiał to przetestować i dowiedzieć się, kiedy mam więcej czasu. –

+0

Mam istniejący projekt w PF 3.2 i to nadal jest problem. Czy ktoś wie, czy zostało to naprawione w późniejszej wersji? – Catfish

+0

@Catfish: zostało to potwierdzone i poprawione w PF 3.4: http://stackoverflow.com/questions/12516397/how-to-ajax-update-the-pdatatable-od-inside-the-pdatatable-self?121217181 # 12517181 – BalusC

1

Prawdopodobnie używasz Primefaces 2.2.1 jak to wydaje się to ze względu na wspólny błąd z Primefaces DataTable komponentu. Zasadniczo to, co się dzieje, to to, że wywołania ajaxowe pochodzące z elementów elementu dataTable nie spowodują częściowej aktualizacji strony elementów w klasie dataTable.

Najprostszym rozwiązaniem jest wywołanie odświeżenia z przycisku znajdującego się poza tabelą dataTable, której jedynym celem jest jedynie częściowa aktualizacja tabeli dataTable. To nie jest najskuteczniejsze rozwiązanie, ponieważ skutkuje dwoma odesłaniami zwrotnymi, jednak działa.

Patrz mój poprzedni odpowiedź na ten problem Here

+0

Używam Primefaces 3.0. Czy ma również ten błąd? –

+0

To było moje wrażenie, że zostało to naprawione w wersji 3.0, ale nie korzystałem jeszcze z 3.0. –

+0

Dobra, dziękuję za odpowiedź! –

1

Jeśli chcesz używać identyfikatorów serwera do aktualizacji komponentów (jak userTable, somethingElse ...), te składniki muszą być w tym samym kontenerze nazewnictwa jako składnik, które wywołają aktualizację (Twój przycisk na przykład). W przeciwnym razie musisz użyć takiego wyrażenia w atrybucie aktualizacji: update=":usersForm:userTable".

Głównym problemem jest identyfikacja kontenerów nazw. Przycisk zewnętrzny działa, ponieważ znajduje się w tym samym kontenerze nazewnictwa (w formularzu) co tabela o identyfikatorze userTable.Aspekt jest aktualizowany, ponieważ cała tabela jest aktualizowana, ale ponieważ datatable jest kontenerem nazw, powinno być możliwe zaktualizowanie stopki za pomocą 10 tylko za pomocą przycisku update="somethingElse" na zewnętrznym przycisku.

Nie jestem pewien, dlaczego wewnętrzny przycisk nie działa. Przypuszczam, że istnieje inny kontener nazw w ramach datatable. PrimeFaces rejestruje INFO, jeśli nie można znaleźć komponentu za pomocą algorytmu findComponent implementacji UIComponent. INFO: Cannot find component with identifier "userTable" in view.

0

Jest to rozwiązanie, aby odświeżyć w JSF 2.0

<p:dataTable id="empl1" var="emp" value="#{dtEmployeeView.employee}" selectionMode="multiple" rowKey="#{emp.id}" 
           paginator="true" rows="5" tableStyleClass="ui-table-columntoggle"> 
    <p:column width="20" headerText="Id" priority="1"> 
     <h:link value="#{emp.id}" /> 
    </p:column> 
    <p:column headerText="Employee Name" priority="2"> 
     <h:outputText value="#{emp.pname}" /> 
    </p:column> 

</p:dataTable> 
<p:commandButton update="form1:empl1" ajax="true" value="Submit" action="#{empService.addEmployee(employee)}" > 
    <f:event type="preRenderView" listener="#{dtEmployeeView.init()}"/> 
</p:commandButton> 
0

miałem filtry w moim DataTable. Tak więc rozwiązałem problem z

oncomplete="PF('myWidgetVar').filter()" and update="@form" 
Powiązane problemy