javascript - Using js array in laravel blade foreach
In a laravel blade page I have a controller sending planTypes
and stored like this:
arr = [];
var planTypes = @json($planTypes);
$('#multiselect').change(function (e) {
var plan_id = $(this).val();
arr.push(plan_id);
});
What it does? For any change in a dropdown listing all planTypes I capture the unique id and store it in a js array (arr
)
The user has the possibility to add multiple planTypes in the same page without the need to refresh and that is why the change
js function
Whenever I render the new dropdown, I would like to only display the remaining unused planTypes and I try to do it like this:
var item=
+' <select id="multiselect" name="planTypes[0][]" class="selectpicker form-control type">'
+' <option value="">--</option>'
@foreach($planTypes as $planType)
if(!arr[{{ $planType->id }}]) {
+' <option value="{{ $planType->id }}">{{ $planType->name }}</option>'
}
@endforeach
But for some strange reasons, I cannot make it work like that, combining blade @foreach and javascript if
Could someone point me to the correct approach?
Thank you! +' '
Answer
Solution:
Try something like this:
<script>
const planTypes = {!! json_encode($planTypes) !!};
// use this HTML however you want
let html = `
<select id="multiselect" name="planTypes[0][]" class="selectpicker form-control type">'
<option value="">--</option>
${planTypes.map(planType => `<option value="${planType.id}">${planType.name}</option>`)}
</select>
`;
Answer
Solution:
<script>
var planTypes = {!! json_encode($planTypes) !!};
var filter_planTypes = planTypes;
$(document).on('change', '#multiselect', function () {
var plan_id = $(this).val();
filter_planTypes = filter_planTypes.filter(function(val) {
return val.id != plan_id;
});
var options = '<option value="">Select</option>';
$.each(filter_planTypes, function (key, value) {
options += '<option value="'+ value.id +'">'+ value.name +'</option>';
});
$('#multiselect').html(options);
$('#multiselect').trigger("change");
});
</script>
OR if you want to use multiselect the better option is to user select2 js library
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" />
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<select id="multiselect" name="planTypes[]" class="selectpicker form-control type" multiple="multiple">
<option value="">--</option>
@foreach($planTypes as $planType)
<option value="{{ $planType->id }}">{{ $planType->name }}</option>
@endforeach
</select>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
<script>
$(document).ready(function() {
// Select2 Multiple
$('#multiselect').select2({
placeholder: "Select",
allowClear: true
});
});
</script>
Source