ais-hits-per-page
<ais-hits-per-page [items]="object[]" ></ais-hits-per-page>
About this widget # A
The ais-hits-per-page
widget displays a dropdown menu to let the user change the number of displayed hits.
If you only want to configure the number of hits per page without displaying a widget, you can use the ais-configure
widget with the hitsPerPage
search parameter.
Examples # A
1
2
3
4
5
6
<ais-hits-per-page
[items]="[
{ label: '8 hits per page', value: 8, default: true },
{ label: '16 hits per page', value: 16 },
]"
></ais-hits-per-page>
Props # A
items
# |
type: object[]
Required
List of available options. |
||
Copy
|
HTML output# A
1
2
3
4
5
6
<div class="ais-HitsPerPage">
<select class="ais-HitsPerPage-select">
<option class="ais-HitsPerPage-option" value="8">8 per page</option>
<option class="ais-HitsPerPage-option" value="16">16 per page</option>
</select>
</div>
Customize the UI with connectHitsPerPage# A
If you want to create your own UI of the ais-hits-per-page
widget, you can combine the connectHitsPerPage
connector with the TypedBaseWidget
class.
1. Extend the TypedBaseWidget
class#
First of all, you will need to write some boilerplate code to initialize correctly the TypedBaseWidget
class. This happens in the constructor()
of your class extending the TypedBaseWidget
class.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import { Component, Inject, forwardRef, Optional } from '@angular/core';
import { TypedBaseWidget, NgAisInstantSearch, NgAisIndex } from 'angular-instantsearch';
@Component({
selector: 'app-hits-per-page',
template: '<p>It works!</p>'
})
export class HitsPerPage extends TypedBaseWidget {
constructor(
@Inject(forwardRef(() => NgAisIndex))
@Optional()
public parentIndex: NgAisIndex,
@Inject(forwardRef(() => NgAisInstantSearch))
public instantSearchInstance: NgAisInstantSearch
) {
super('HitsPerPage');
}
}
There are a couple of things happening in this boilerplate:
- create a
HitsPerPage
class extendingTypedBaseWidget
- reference the
<ais-instantsearch>
parent component instance on theHitsPerPage
widget class - set
app-hits-per-page
as a selector, so we can use our component as<app-hits-per-page></app-hits-per-page>
2. Connect your custom widget#
The TypedBaseWidget
class has a method called createWidget()
which takes two arguments: the connector to use and an object of options
(instance options)
for this connector. We call this method at ngOnInit
. This component now implements OnInit
.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import { Component, Inject, forwardRef, Optional } from '@angular/core';
import { TypedBaseWidget, NgAisInstantSearch, NgAisIndex } from 'angular-instantsearch';
import connectHitsPerPage, {
HitsPerPageWidgetDescription,
HitsPerPageConnectorParams
} from 'instantsearch.js/es/connectors/hits-per-page/connectHitsPerPage';
@Component({
selector: 'app-hits-per-page',
template: '<p>It works!</p>'
})
export class HitsPerPage extends TypedBaseWidget<HitsPerPageWidgetDescription, HitsPerPageConnectorParams> {
public state: HitsPerPageWidgetDescription['renderState']; // Rendering options
constructor(
@Inject(forwardRef(() => NgAisIndex))
@Optional()
public parentIndex: NgAisIndex,
@Inject(forwardRef(() => NgAisInstantSearch))
public instantSearchInstance: NgAisInstantSearch
) {
super('HitsPerPage');
}
ngOnInit() {
this.createWidget(connectHitsPerPage, {
// instance options
items: [
{value: 6, label: '6 per page', default: true},
{value: 12, label: '12 per page'},
{value: 24, label: '24 per page'},
],
});
super.ngOnInit();
}
}
3. Render from the state#
Your component instance has access to a this.state
property which holds the rendering options of the widget.
public state: HitsPerPageWidgetDescription['renderState'];
// {
// items: object[];
// hasNoResults: boolean;
// refine: Function;
// widgetParams: object;
// }
1
2
3
4
5
6
7
8
9
<select (change)="state.refine($event.target.value)">
<option
*ngFor="let item of state.items"
[value]="item.value"
[selected]="item.isRefined"
>
{{ item.label }}
</option>
</select>
Rendering options #
items
# |
type: object[]
The list of items the widget can display, with each item:
|
hasNoResults
# |
type: boolean
Whether the search has results. |
refine
# |
type: function
Sets the number of hits per page and triggers a search. |
widgetParams
# |
type: object
All original widget options forwarded to the render function. |
Instance options #
items
# |
type: object[]
Required
The list of available options, with each item:
|
transformItems
# |
type: function
default: items => items
Optional
Receives the items and is called before displaying them. Should return a new array with the same shape as the original array. Useful for transforming, removing, or reordering items. In addition, the full |
Full example#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import { Component, Inject, forwardRef, Optional } from '@angular/core';
import { TypedBaseWidget, NgAisInstantSearch, NgAisIndex } from 'angular-instantsearch';
import connectHitsPerPage, {
HitsPerPageWidgetDescription,
HitsPerPageConnectorParams
} from 'instantsearch.js/es/connectors/hits-per-page/connectHitsPerPage';
@Component({
selector: 'app-hits-per-page',
template: `
<select (change)="state.refine($event.target.value)">
<option
*ngFor="let item of state.items"
[value]="item.value"
[selected]="item.isRefined"
>
{{ item.label }}
</option>
</select>
`
})
export class HitsPerPage extends TypedBaseWidget<HitsPerPageWidgetDescription, HitsPerPageConnectorParams> {
public state: HitsPerPageWidgetDescription['renderState']; // Rendering options
constructor(
@Inject(forwardRef(() => NgAisIndex))
@Optional()
public parentIndex: NgAisIndex,
@Inject(forwardRef(() => NgAisInstantSearch))
public instantSearchInstance: NgAisInstantSearch
) {
super('HitsPerPage');
}
ngOnInit() {
this.createWidget(connectHitsPerPage, {
// instance options
items: [
{value: 6, label: '6 per page', default: true},
{value: 12, label: '12 per page'},
{value: 24, label: '24 per page'},
],
});
super.ngOnInit();
}
}