This component provides a set of tools to create a custom filter. You need to use a Refinement Lists component to add it on the UI.
This is how you create this component:
sdk.filterComponent('custom', target: filterOptions: Object);
The following options can be set in this component:
Name | Type | Default | Description |
---|---|---|---|
templateValues | Object | {} | The values that are passed to the template. Each key is a variable |
templates | (Function) => String | String | The templates to override the default render behaviour |
transformData | Function | (object) => object |
Function to transform the object sent to the view |
Method | Description |
---|---|
setTemplateValues(templateValues: Object) |
Updates the templateValues and makes the template to render again. |
setListener(selector: string, event: string, callback: Function, extraData: Object = {}, id: Int = null): Int |
Creates a new listener for event for all elements that match the CSS selector that will invoke callback with extraData . Optionally you can pass id to identify the listener. Returns the id you passed or an auto-generated one. |
removeListener(id: Int) |
Removes the listener identified by id as created by setListener . |
getListeners(): Object |
Returns all the listeners with the key id and the values with selector , event , callback , extraData as created by setListener . |
results
component Store, through the linkTo
method:<div id="refinement-lists"></div>
<div id="results"></div>
<script>
var results = sdk.component('results', '#results');
// Values used by the custom filter that will be modified
var templateValues = {
label: 'Maximum Price',
step: 1,
min: 10,
max: 100,
value: 10,
}
// Create custom filter with the template, the previous values and the header text
const priceFilter = sdk.filterComponent('custom', {
templates: `
<label>{{ label }}:
<input
style="width: 75%"
step="{{ step }}"
min="{{ min }}"
max="{{ max }}"
type="range"
value="{{ value }}"
>
</label>
<span style="width: 25%" id="price-filter-value">{{ value }}</span>`,
templateValues
});
var refinementLists = sdk.component('refinement-lists', '#refinement-lists', {
refinements: [
{ component: priceFilter, headerText: 'Price' }
]
});
results.linkTo(refinementLists);
// Create the facet that the custom filter will filter
results.searchStore.addFacet("PRICE")
// Create event listener for when the slider changes value
priceFilter.setListener('input', 'change', function (id, el) {
// Remove and add the PRICE attribute refinement with filter "lte" (Less or equal than)
results.searchStore.removeFacetRefinement("PRICE", templateValues.value, "lte");
results.searchStore.addFacetRefinement("PRICE", el.value, "lte")
// Update the current value in the template so that it updates
templateValues.value = el.value;
// Notify the price filter to update the template
priceFilter.setTemplateValues(templateValues);
});
</script>