JS
var arr = ko.observableArray([
{name: 'Kyle', age: 20, city: 'New York'},
{name: 'Stan', age: 31, city: 'Amsterdam'},
{name: 'Eric', age: 27, city: 'Paris'},
{name: 'Butters', age: 24, city: 'New York'},
]).extend({
filters: {
olderThan25 : function(person) { return person.age > 25; }, // Stan
inNewYork : function(person) { return person.city === 'New York'; }, // Butters, Kyle
name4Letters: function(person) { return person.name.length === 4; } // Eric, Kyle, Stan
}
});
ko.applyBindings({persons: arr});
HTML
<nav data-bind="with: persons.filters">
<label for="older-than-25">Older than 25</label>
<input type="checkbox" name="older-than-25" data-bind="checked: olderThan25.active">
<label for="in-new-york">In New York</label>
<input type="checkbox" name="in-new-york" data-bind="checked: inNewYork.active">
<label for="name-4-letters">Name with 4 letters</label>
<input type="checkbox" name="name-4-letters" data-bind="checked: name4Letters.active">
</nav>
<ul data-bind="foreach: persons.filtered">
<li data-bind="text: 'Name: ' + name + ', age: ' + age + ', city: ' + city"></li>
</ul>
Extending an observableArray with the filters extender creates the following properties on the observableArray:
observableArray.filtered
: the resulting array from passing all active filtersobservableArray.filters
: an object containing all filters available to the observableArray. Each filter function can be accessed/ overwritten asobservableArray.filters[filterName].filter
, and its current state withobservableArray.filters[filterName].active()
Extending an observableArray with the filters extender creates the following methods on the observableArray:
observableArray.toggleFilter(filterName[, force=null])
: Toggles filterfilterName
. If optional parameterforce
(true/false) is passed, sets the filter to the specified state.observableArray.clearFilters()
: Clears all filters.observableArray.invert()
: Inverts the filter selection.