javascript - 使用 js 和 symfony 操作复选框
问题描述
我正在使用 EntityType 并使用自定义模板呈现表单。
我想隐藏复选框字段并使用JS添加背景颜色。
如果该项目被选中,否则将其删除。
显示工作(相对正确,当我在显示复选框时单击复选框本身仍然有问题)但是如果我多次提交不完整的表单,如果我取消选中一个框,提交后,服务器仍然显示复选框已选中...
挑战类型.php
$builder
->add('sports', EntityType::class, [
'class' => Sport::class,
'expanded' => true,
'multiple' => true,
'required' => true,
'choice_label' => 'name',
'query_builder' => function (SportRepository $er) {
return $er->createQueryBuilder('s')
->orderBy('s.name', 'ASC');
},
'choice_attr' => function ($sport) {
return ['data-img' => $sport->getGoutte()];
}
])
模板树枝
{{ form_start(form, {'attr': {'class': 'form-challenge', 'novalidate':'novaldiate'} }) }}
<ul class="form-row justify-content-center list-unstyled text-center" id="sports-checkboxes">
{{ form_errors(form.sports) }}
{% for sport in form.sports.children %}
<li
class="col-6 col-lg-2 col-md-3 col-sm-4 {{ sport.vars.checked? "bg-warning" : "" }}"
onclick="checkBoxClickHandler(event)"
>
<img class="" src="/{{ sport.vars.attr['data-img'] }}" alt="{{ sport.vars.label }}"
style="width: 30px; height: auto">
<p>
<label for="{{ sport.vars.id }}">{{ sport.vars.label }}</label>
<input
class="d-none"
type="checkbox"
id="{{ sport.vars.id }}"
name="{{ sport.vars.full_name }}"
value="{{ sport.vars.value}}"
{{ sport.vars.checked? "checked" : "" }}
>
{#{{ form_widget(sport) }}#}
</p>
</li>
{% endfor %}
</ul>
js代码
function checkBoxClickHandler(event){
event.preventDefault();
const li = event.target.closest('li');
const input = li.querySelector('input')
if (input.checked) {
input.checked = false;
input.removeAttribute('checked')
li.classList.remove('bg-warning')
} else {
input.checked = true;
li.classList.add('bg-warning')
}
}
知道我做错了什么吗?
解决方案
为什么在LI元素中使用onclick事件?您应该对INPUT元素使用onchange事件。如果提交表单,数据会被保存吗?
推荐阅读
- android - Android系统导航栏背景颜色
- android - Android没有显示所有通知
- arrays - 对对象数组中的多个属性求和
- python - 重命名在 Django admin 中上传的文件并省略表单中的字段
- mysql - 如何在 Ansible 中运行 MySQL 查询
- android - 在 RecyclerView 适配器的 onBindViewHolder 中获取上下文
- ruby-on-rails - Rails 在不同模型上的自定义验证
- java - 发送 html 电子邮件
- c# - Entity Framework Fluent API - 级联删除 - 带接口
- azure - 使用 Apache Drill 从 Azure Blob 存储读取 Parquet 文件时出错