2010-02-17 5 views
5

나는 rich:extendedDataTable이며 열 필터링을 사용하고 있습니다. 사용자가 "소개"키를 입력하면 필터가 해고되기를 원하지만 자바 스크립트에는 그러한 이벤트가 없습니다.Richfaces 열 필터 : 소개 키에서 이벤트를 발생시키는 방법

나는 이렇게하기를 원합니다. 왜냐하면 나는 onkeyup과 같은 이벤트를 사용하면 너무 많은 요청을 받고 그 때문에 문제가 발생하기 때문입니다. richfaces 3.3.0GA와 facelets를 사용하고 있습니다.

<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> 

답변

5

불행하게도,이 기능을 사용자 정의하는 쉬운 방법이 없습니다 :

는 구성 요소입니다. 더 사용할 수 있도록하는 옵션, 그래도이 있습니다

  • <a4j:queue requestDelay="1000" ignoreDupResponce="true" /> - 당신의 <a4j:form> 또는 <a4j:region>하고 onkeyup 요청이 지연 그룹화됩니다에 위치이. richfaces demo page 참조 :

    true로 ignoreDupResponces 설정
    • 입력 내부 입력에 DOM 업데이트의 수를 줄일 수 있습니다. (업데이트의 초기 상태 카운트가 요청 수와 동일 함)
    • 큐를 사용하지 않으면 완전히 비동기 업데이트가 발생합니다. 업데이트가 직접 주문에 표시 될뿐만 아니라 결과적으로 잘못된 문자열이 표시 될 수 있습니다.
    • 요청 지연을 더 큰 값으로 설정하면 빠른 입력시 요청 횟수가 줄어 듭니다. 당신이

      <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> 
      

      j_id70fsp을 위해 생성 된 ID를 볼 수 : 나는 현재 다음과 같은 대안을 사용하고

  • 을 (더 비슷한 요청 결과에 결합됩니다). 그것은 영원히 남을 것이라고 보장 할 수는 없습니다.

    결과적으로 상당히 유용한 Enter 키를 누르면 열이 필터링됩니다.

+0

음 나는 그것을 시도했지만 작동하지 않습니다. 나는 enter를 누르고 아무 일도 일어나지 않는다. 입력 필드 (onblur) 외부를 클릭하면 필터링됩니다. 나는 extendedDataTable과 dataTable을 시도했다. 같은 결과. – pakore

+0

요청을 지연시킬 수있는 방법이 있습니까? 분명히 "a4j : form"의 "requestDelay"가 지연되지 않습니다 ... 응답 해 주셔서 감사합니다. – pakore

+0

은 즉시 사용 가능하지 않습니다. 그러나 몇 가지 해결 방법이있을 수 있습니다. 나는 그것에 대해 생각합니다. – Bozho

2

Bozho 오른쪽이지만, 대신 getElementById를 사용하는 나는이 스크립트를 사용하여 선호 :

<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;"> 

그것은 FF, EI, 사파리합니다 (targ.nodeType == 3 것)와 함께 작동합니다.

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

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

나를 위해 일합니다.

1

Richfaces 3.3.3에서는 각 rich:column에서 필터 이벤트 (filterEvent="onblur")를 종료해야 Enter 키를 눌러야 만 필터 할 수 있습니다!

1

onkeyup 이벤트를 유지하고 큐를 만들고이를 dataTable에 연결하십시오.작동하지만 문서화되지 않음 :

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

<rich:dataTable ... eventsQueue="qFilter"> 
... 
관련 문제