Wie kombiniert man mehrere Filter zusammen, um filter Task Zeilen mit jQuery?
Habe ich gehackt zusammen ein einfaches Beispiel Task-Liste, Tabelle mit HTML und der Verwendung von jQuery. Ich habe anbei noch einige on change
Veranstaltungen zu meinem Filter DropDown Selection Fields
Demo: http://codepen.io/jasondavis/pen/MwOwMX?editors=101
Habe ich eine Filter-Auswahl-Feld für jeden von diesen:
- Zugewiesenen Benutzer
- Task-Status
- Meilenstein
- Priorität
- Tags
Unabhängig Sie alle arbeiten, um den job zu erledigen in ausfiltern von nicht passenden Ergebnisse von meinem Task-Liste Tabelle.
Für jede Aufgabe Zeile, Speichere ich den Wert der einzelnen filterbaren option in einem Data Attribute
wie in diesem Beispiel Aufgabe Zeile HTML -:
<tr id="task-3"
class="task-list-row"
data-task-id="3"
data-assigned-user="Donald"
data-status="Not Started"
data-milestone="Milestone 1"
data-priority="Low"
data-tags="Tag 3">
<td>Task title 3</td>
<td>11/16/2014</td>
<td>02/29/2015</td>
<td>Low</td>
<td>Milestone 1</td>
<td>Donald</td>
<td>Tag 3</td>
</tr>
Also der eigentliche Text für die Task-Zeile spielt keine Rolle, weil der Task-Zeile wird nicht angezeigt, alle Eigenschaften. Was zählt, ist der gespeicherte Wert in der Task-Zeile Data-Attribute.
Aufgabe der Zeile/Datensatz mit einem Miledstone
eingestellt Milestone 2
wird ein Data-Attribut wie dieses data-milestone="Milestone 2"
Ein Beispiel-JavaScript/jQuery-Filter code:
//Task Milestone Dropdown Filter
$('#milestone-filter').on('change', function() {
var taskMilestone = this.value;
if(taskMilestone === 'None'){
$('.task-list-row').hide().filter(function() {
return $(this).data('milestone') != taskMilestone;
}).show();
}else{
$('.task-list-row').hide().filter(function() {
return $(this).data('milestone') == taskMilestone;
}).show();
}
});
So, wie ich schon erwähnte. Ich kann jede meiner "Filter", um die Arbeit von thereself, aber sobald ich versuche mehr als 1 filter gleichzeitig, es wird nicht funktionieren mit diesem aktuellen code.
Ich würde schätzen jede Hilfe bei der Modifizierung von meinem code, um eine funktionierende multi-filter-Beispiel bitte?
Mein Aktuelles demo ist hier: http://codepen.io/jasondavis/pen/MwOwMX?editors=101
Update Test 2
Nachdem einige dachten, ich bin zu denken, dass vielleicht ich brauche zu speichern, die die aktuellen Filter-Werte in Variablen und dann auf jede change
- Ereignis anstelle von das:
return $(this).data('milestone') != taskMilestone;
Wäre es stattdessen brauchen, um mehr so sein wie diese...
return $(this).data('milestone') != taskMilestone
&& $(this).data('priority') != taskPriority
&& $(this).data('tags') != taskTags
&& .... for all filters;
Klingt das ungefähr richtig?
Nevermind, habe gerade versucht, dies ohne Glück!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie waren in der Nähe in Ihrem zweiten test. Hier ist eine funktionierende demo:
http://codepen.io/luciopaiva/pen/oXpzGw?editors=101
Umgestalteten ich deinen code ein wenig auf und zentralisierte die Logik um
updateFilters()
, die aufgerufen wird, jedes mal wenn ein change-Ereignis Auftritt. Sie beginnt, indem Sie annehmen, dass jede Zeile gezeigt werden sollte und dann tests gegen jeden filter, unterscheidet sich von der Standard-Wert (sei es 'Any', 'None' oderundefined
).Durch die Art und Weise, wenn Sie ändern, können
data-user-assigned
indata-user
, hier ist ein etwas verbesserter code, die erheblich reduziert die Anzahl der code-Zeilen:http://codepen.io/luciopaiva/pen/YXYGYE?editors=101
Ich bin mit der
call
ich kann also passieren das DOM-element (referenziert durchthis
), um den Kontext derchangeFilter()
.Außerdem habe ich alle Filter in ein Objekt (
filters
) also ich kann auf jeden seinen Namen, wiefilters[filterName]
und in der Lage sein, Dinge zu automatisieren.Es ist erwähnenswert, dass
filters
variable ist global, und das ganze sollte innerhalb einer IIFE.Aber lassen Sie uns weiter. Sie können sogar noch weiter gehen und entfernen Sie den Standardcode für jeden
change
Ereignis, wenn man bedenkt, können Sie element#assigned-user-filter
zu#user-filter
:http://codepen.io/luciopaiva/pen/YXYGaY?editors=101
Die Javascript von diesem letzten Ansatz:
Hier habe ich die gleiche Logik wie in der zweite Ansatz, die Verwendung von filtern auf Namen zu verweisen jedem dropdown-Menü. Klassische boilerplate!