2010-02-17 18 views
5

Mam rich:extendedDataTable i używam filtrowania kolumn. Chcę, aby filtr został uruchomiony, gdy użytkownik wprowadzi klucz "intro", ale w javascript nie ma takiego zdarzenia.Filtry Richfaces Filtr: Jak wywołać zdarzenie w kluczu intro

Chcę to zrobić, ponieważ jeśli używam zdarzeń takich jak onkeyup, otrzymuję zbyt wiele żądań i mam z tego powodu problemy. Używam richfaces 3.3.0GA i facelets.

Jest to komponent:

<ui:composition> 
<a4j:form ajaxSingle="true" requestDelay="700"> 
    <rich:extendedDataTable id="tablePatients" value="#{user.patientsTab.patients}" var="patient" rows="20" 
     onRowMouseOver="this.style.backgroundColor='#F1F1F1'" onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'"> 
     <f:facet name="header"> 
      <h:outputText value="Patient List" /> 
     </f:facet> 
     <rich:column label="#{msg.id}"> 
      <f:facet name="header"> 
       <h:outputText value="Id" /> 
      </f:facet> 
      <h:outputText value="#{patient.id}" id="patientId" /> 
     </rich:column> 
     <rich:column label="#{msg.name}" sortable="true" filterBy="#{patient.profile.name}" filterEvent="onkeyup"> 
      <f:facet name="header"> 
       <h:outputText value="Name" /> 
      </f:facet> 
      <h:outputText value="#{patient.profile.name}" id="name" style="#{patient.isUnrated? 'font-weight:bold':''}" /> 
     </rich:column > 
     <rich:column label="#{msg.lastexamination}" sortable="true"> 
      <f:facet name="header"> 
       <h:outputText value="Last Examination" /> 
      </f:facet> 
      <h:outputText value="#{patient.lastExaminationDate}" style="#{patient.isUnrated? 'font-weight:bold':''}" /> 
     </rich:column> 
     <rich:column label="#{msg.action}"> 
      <f:facet name="header"> 
       <h:outputText value="#{msg.action}"></h:outputText></f:facet> 
      <a4j:commandLink id="editlink" oncomplete="#{rich:component('patientPanel')}.show()" reRender="a4jPatientPanel"> 
       <h:graphicImage value="/images/icons/PNG-24/Add.png" style="border:0" /> 
       <f:setPropertyActionListener value="#{patient}" target="#{user.patientsTab.patientPanel.patient}" /> 
      </a4j:commandLink> 
      <rich:toolTip for="editlink" value="Edit" /> 
     </rich:column> 

     <f:facet name="footer"> 
      <rich:datascroller renderIfSinglePage="false" maxPages="5" /> 
     </f:facet> 
    </rich:extendedDataTable> 

    </a4j:form> 

    <ui:include src="/pages/panels/patientPanel.xhtml" /> 
</ui:composition> 

Odpowiedz

5

Niestety, nie ma łatwego sposobu, aby dostosować tę funkcję. Istnieją możliwości, aby to bardziej użyteczny, choć:

  • <a4j:queue requestDelay="1000" ignoreDupResponce="true" /> - miejsce to w swoim <a4j:form> lub <a4j:region> i twoi onkeyup wnioski będą opóźnione i grupowane. Zobacz richfaces demo page:

    • Ustawianie ignoreDupResponces true zmniejsza liczbę aktualizacji DOM na wpisaniu wewnątrz wejścia. (w stanie początkowym liczba aktualizacji jest równa liczbie żądań)
    • Wyłączenie kolejki powoduje w pełni asynchroniczne aktualizacje. Zwróć uwagę, że aktualizacje mogą pojawić się nie tylko w bezpośredniej kolejności, w wyniku czego możesz otrzymać błędny ciąg znaków.
    • Ustawienie opóźnienia żądania na większą wartość zmniejsza liczbę żądań przy szybkim pisaniu. (Więcej Podobne wnioski zostały połączone w wyniku)
  • obecnie używam następującą alternatywę:

    <rich:dataTable (..some attributes..) 
        onkeypress="if (event.keyCode == 13) {document.getElementById('formId:tableId:j_id70fsp').blur(); return false;} else {return true;}" 
        ><!-- disabling submit-on-enter --> 
        <rich:column label="#{msg.name}" sortable="true" 
         filterBy="#{patient.profile.name}" filterEvent="onblur"> 
    </rich:dataTable> 
    

    Gdzie trzeba zobaczyć wygenerowany identyfikator dla j_id70fsp. Nie można jednak zagwarantować, że pozostanie ona na zawsze taka.

    Powoduje to, że kolumna jest filtrowana po naciśnięciu klawisza Enter, który jest dość użyteczny.

+0

Mmmm Próbowałem go i to nie działa. Wciśnij enter i nic się nie dzieje. Kliknięcie poza polem wprowadzania (onblur) powoduje filtrowanie. Próbowałem już z extendedDataTable i z DataTable. Ten sam wynik. – pakore

+0

Czy istnieje sposób na opóźnienie żądania? najwyraźniej "requestDelay" w "a4j: form" nie opóźnia ... Dziękuję za odpowiedź. – pakore

+0

Not-of-the-box. Ale może być jakiś obejście. Pomyślę o tym. – Bozho

2

Bozho ma rację, ale zamiast używać getElementById Wolę pomocą tego skryptu:

<rich:extendedDataTable onkeypress=" 
if (!event) { var event = window.event; } 
if (event.keyCode == 13) { 
    var targ; 
    if (event.target) targ = event.target; 
    else if (event.srcElement) targ = event.srcElement; 
    if (targ.nodeType == 3) targ = targ.parentNode; 
    if (targ) targ.blur(); 
    return false; 
} else return true;"> 

powinien pracować z FF, EI, Safari (w targ.nodeType == 3 rzeczy).

1
function filterAllOnEnter(event) 
{ 
    if(event.keyCode == 13) 
    { 
     jQuery(".rich-filter-input").blur(); 
     return false; 
    } 
    else 
    { 
     return true; 
    } 
} 

<rich:dataTable onkeydown="filterAllOnEnter(event)" ... > 

Działa dla mnie.

1

W Richfaces 3.3.3, należy wyjść z zdarzenia filtra (filterEvent="onblur") z każdego rich:column, a następnie będzie można filtrować tylko po naciśnięciu klawisza Enter!

1

Zachowaj zdarzenie onkeyup i utwórz kolejkę powiązaną z tabelą dataTable.Działa, ale jego nieudokumentowane:

<a4j:queue name="qFilter" ignoreDupResponses="true" size="1" requestDelay="600" sizeExceededBehavior="dropNext"/> 

<rich:dataTable ... eventsQueue="qFilter"> 
... 
Powiązane problemy