2016-09-29 5 views
0

Gibt es eine Möglichkeit, eine p: datatable-Spalte zu filtern, indem Sie auf den darin enthaltenen Text klicken und diesen Text zum Filter machen?p: Datatable-Filter: kann Komponente mit leerem Wert nicht validieren

Mit anderen Worten, wenn ich auf eine Sitzungs-ID klicke, möchte ich, dass die Datentabelle diese Spalte nach der angeklickten ID filtert, als ob ich sie manuell im obigen Filter eingegeben hätte?

enter image description here

Ich bin mit Primefaces 6

UPDATE

Dies ist meine komplette Datentabelle mit der vorgeschlagenen Lösung:

<p:dataTable id="tablealltx" var="transaction" value="#{pastTxModel.txList}" paginator="true" rows="20" sortBy="#{transaction.createdDate}" sortOrder="descending" resizableColumns="true">    

    <p:column filterBy="#{transaction.session}" filterMatchMode="contains"> 

     <f:facet name="filter"> 
      <p:inputText id="myFilter" value="#{transactionXmlController.currentFilter}" onchange="PF('alltxform').filter()" /> 
     </f:facet> 

     <p:outputLabel value="#{transaction.session}" ondblclick="document.getElementById('alltxform:tablealltx:myFilter').value = this.innerText;PF('tablealltx').filter()" >   
    </p:column> 
</p:dataTable> 

Wenn ich auf der Sitzung klicken verdoppeln, Der Wert wird in das Filtertextfeld eingegeben, die Filterung selbst jedoch nicht t arbeiten. Nichts passiert.

Ich bin mit TomEE 7.0.1

Lösung Copy Paste von Jasper:

Die Datentabelle in Ihrer Frage keine widgetVar hat auf tablealltx, so PF ('tablealltx'). filter() wird fehlschlagen. Sie können es testen, indem Sie eingeben PF ('tablealltx') in der JavaScript-Konsole Ihres Browsers.

+0

Es ist das Ereignis . Wenn Sie den angeklickten Text im Filterfeld finden können, können Sie mit PF ('datatablewv') filter() enden. Ich habe es nicht versucht, aber –

Antwort

2

Ich konnte dies erreichen, indem widgetVar="myTable" auf die Datentabelle Einstellen eines benutzerdefinierten Filterfeld verwendet wird, die Zellinhalte mit p:outputLabel ersetzt sie und JavaScript alle zusammen (die ondblclick hat):

<p:column headerText="Session" filterBy="#{transaction.session}" ...> 
    <f:facet name="filter"> 
     <p:inputText id="myFilter" 
        value="#{myBean.myFilter}" 
        onchange="PF('myTable').filter()"/> 
    </f:facet> 
    <p:outputLabel value="#{transaction.session}" 
        ondblclick="document.getElementById('myForm:myTable:myFilter').value = this.innerText;PF('myTable').filter()"/> 
</p:column> 

Zur besseren Lesbarkeit ist hier die ondblclick:

var filterId = 'myForm:myTable:myFilter'; 
document.getElementById(filterId).value = this.innerText; 
PF('myTable').filter(); 

Sie p:outputLabel mit einer einfachenersetzen könnten, aber in diesem Fall (vorausgesetzt, Sie sind auf JSF 2.2 und höher) müssen Sie den Namespace xmlns:a="http://xmlns.jcp.org/jsf/passthrough" hinzufügen. Jetzt können Sie verwenden:

<h:outputText value="#{transaction.session}" 
       a:ondblclick="..."/> 

Siehe auch:

+0

Fast da - dies setzt den Text in das Filterfeld, aber die Filterung funktioniert nicht: kann nicht validieren Komponente mit leerem Wert: alltxform: tablealltx: myFilter. – Tim

+0

Hat etwas gegoogelt. Es scheint, dass dies auf eine Eingabe ohne "Wert" zurückzuführen ist. Wahrscheinlich ist das eine JSF-Implementierung (ich bin auf Mojarra 2.2.7). Ich werde die Antwort aktualisieren (es funktioniert für mich mit und ohne "Wert"). –

+0

Kannst du nicht 'h: outputtext' verwenden? Dies ist eine Art falsche Verwendung (missbrauchen?) Eines outputLabel – Kukeltje

Verwandte Themen