I am using Choices.js to create a multi select option menu.
In the <select>
menu it is required to be able to select the same <option>
multiple times.
This issue has been resolved by using the addEventListener
function from Choices.js.
The Issue
When i want to load the selected options from a string or ajax call the <option>
are only selected one time instead of multiple times.
For example: the values 1 - 1 - 2 - 3 - 3
will need to display in the <select>
menu ONE - ONE - TWO - THREE - THREE
.
But currently it only shows ONE - TWO - THREE
.
The issue is that the addEventListener
is not working when the setChoiceByValue
is being used.
document.addEventListener("DOMContentLoaded", function() {
const query_task = new Choices(document.querySelector('#query_task'), {
removeItemButton: true,
maxItemCount: 10,
});
query_task.passedElement.element.addEventListener('addItem', function(e) {
query_task.setChoices([{
value: e.detail.value,
label: e.detail.label
}, ], 'value', 'label', false, );
}, false, );
$(document).on('click', '.ajax_data', function() {
let data = '1,1,2,3,3';
query_task.removeActiveItems();
query_task.setChoiceByValue(data.split(','));
console.log('Ajax data loaded');
});
});
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.1.3/css/bootstrap.min.css" rel="stylesheet" />
<link href="https://choices-js.github.io/Choices/assets/styles/choices.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.1.3/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/choices.js/9.1.0/choices.min.js"></script>
<div class="row pt-2 px-5">
<div class="col-12 px-5">
<label for="query_task" class="form-label">SELECT TASKS</label>
<select id="query_task" class="form-control choices-multiple" multiple>
<option value="0">ZERO</option>
<option value="1">ONE</option>
<option value="2">TWO</option>
<option value="3">THREE</option>
<option value="4">FOUR</option>
</select>
<div>
<div>
<button type="button" class="ajax_data btn btn-primary">Load AJAX data</button>
</div>
</div>
Solved - Solution:
let query_data = [
{ value: "0", label: "ZERO" },
{ value: "1", label: "ONE" },
{ value: "2", label: "TWO" },
{ value: "3", label: "THREE" },
{ value: "4", label: "FOUR" }
];
document.addEventListener("DOMContentLoaded", function() {
const query_task = new Choices(document.querySelector('#query_task'), {
removeItemButton: true,
maxItemCount: 10,
choices: query_data
});
query_task.passedElement.element.addEventListener('addItem', () => reset(), false);
query_task.passedElement.element.addEventListener('removeItem', () => reset(), false);
function reset() {
query_task.clearChoices();
query_task.setChoices(query_data, "value", "label", false);
}
$(document).on('click', '.ajax_data', function() {
query_task.removeActiveItems();
let data = '1,1,2,3,3';
let selected_values = data.split(',')
$.each(selected_values, function(key, value) {
query_task.setChoiceByValue(value);
reset();
});
});
});
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.1.3/css/bootstrap.min.css" rel="stylesheet" />
<link href="https://choices-js.github.io/Choices/assets/styles/choices.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.1.3/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/choices.js/9.1.0/choices.min.js"></script>
<div class="row pt-2 px-5">
<div class="col-12 px-5">
<label for="query_task" class="form-label">SELECT TASKS</label>
<select id="query_task" class="form-control choices-multiple" multiple>
</select>
<div>
<div>
<button type="button" class="ajax_data btn btn-primary">Load AJAX data</button>
</div>
</div>