I have a bunch of checkboxes that represent filters, so when clicking a checkbox it should add an object containing the type of filter (taxonomy) and the value (terms) to a filter array.
When clicking the checkbox it first adds a new object containing a taxonomy and terms property. So far this works. The problem is when i click a third checkbox that has an taxonomy value that already exists, it adds a whole new object to the array instead of adding the term to the already existing term array.
This is what it looks like right now:
<input type="checkbox" id="term-1" value="term-1" name="taxonomy-1">
<label for="term-1">Term 1</label>
<input type="checkbox" id="term-2" value="term-2" name="taxonomy-1">
<label for="term-2">Term 2</label>
<input type="checkbox" id="term-3" value="term-3" name="taxonomy-1">
<label for="term-3">Term 3</label>
File1.js
import FilterModule from '../helpers/filter-module';
class View {
constructor() {
self.filterModule = new FilterModule();
this.$filters = $( '[data-filters]' );
}
// Called after api got data
update() {
// Set event listener for select(s)
this.$filters.find( 'select' ).on( 'change', this.handleFiltering );
this.$filters.find( 'input[type="checkbox"]' ).on( 'change', this.handleFiltering );
}
handleFiltering() {
let tax = $( this ).attr( 'name' );
const term = $( this ).val();
self.filterModule.handleCheckbox( $( this ), tax, term );
}
}
export default new View();
File2.js
import Api from '../helpers/api';
export default class FilterModule {
handleCheckbox( checkbox, tax, term ) {
const filters = Api.response.filters.active_filters;
if ( $( checkbox ).is( ':checked' ) ) {
// Check if taxonomy exists, if not, add it
const index = filters.findIndex( x => x.taxonomy === tax );
if ( index === -1 ) {
console.log( 'does not exist, add new taxonomy object' );
// Add new selection
filters.push( {
taxonomy: tax,
terms: [ term ]
} );
} else {
console.log( 'tax exists, push new term into it' );
filters.find( x => x.taxonomy === tax ).terms.push( term );
}
console.log( filters );
}
// Update data
this.update();
}
update() {
Api.fetch();
}
}
So the first checkboxes click works well, the result would be:
{
taxonomy: 'taxonomy-1',
terms: [ 'term-1' ]
}
Second click:
{
taxonomy: 'taxonomy-1',
terms: [ 'term-1', 'term-2' ]
}
But the third click results in:
{
taxonomy: 'taxonomy-1',
terms: [ 'term-1', 'term-2' ]
},
{
taxonomy: 'taxonomy-1',
terms: [ 'term-3' ]
},
I don't understand why a new object is added instead of pushing it to the terms array of the taxonomy that exists.
handleCheckboxget called? When you say "third click", do you mean it always happens no matter which checkbox is clicked as third, or is it the same checkbox each time?handleFilteringyou are reading the taxonomy from theid, but in the HTML it's in thename. Due to in the incomplete code it's a bit difficult to determine whatthisis. A complete working snippet would make the debugging easier. Inside the event handler it probably be a good idea to usetargetfrom the event object instead ofthis.