使用复杂动态模型时,Vue 复选框绑定不起作用

Vue checkbox binding not working when using a complex dynamic model

提问人:Camilo Casadiego 提问时间:11/6/2023 更新时间:11/10/2023 访问量:17

问:

我正在使用从数据库中生成的带有一堆问题的动态表单,基本上是以问题数组的形式,所有字段都按预期工作,但我的复选框行为错误,只需选择一个项目即可将其全部选中,但是当我只使用一个全新的对象时,它按预期工作, 这是构建失败问题的 json(这是数组的一部分):

{
            "id": 11,
            "question": "Check all coverages that apply:",
            "options": "{\"values\": [\"Group Medical\", \"Dental\", \"Vision\", \"Voluntary Supplemental Life\", \"Voluntary Supplemental Life for Spouse/Dependents\", \"Short-Term Disability\", \"Long-Term Disability\", \"Health FSA\", \"HRA\", \"Wellness Program\", \"AFLAC\", \"MEC (Minimum Essential Coverage) Plan\", \"Dependent Care FSA\", \"HSA\", \"Tobacco Surcharge\"]}",
            "section_id": 10,
            "form_position": 1,
            "type": 1,
            "liability": 0,
            "weight": 0,
            "title": "For a more accurate assessment, please complete this form:",
            "subtitle": "",
            "is_main": 1,
            "section_type": 0
        }

这是失败的代码:

<div class="ms-2 ps-5 mb-3" v-for="(question, questionIndex) in initialQuestions[mainKey]" :key="question.id">
          <h5 class="question-title">{{question.question}}</h5>
          <h1>{{question.id}}</h1>
          <div class="row">
            <div class="col-12">
              <div>
                <p>{{'Papa: ' + initialAnswers[question.id]}}</p>
                <div v-if="question.type === 0" v-for="(option, optionIndex) in question.options" class="form-check">
                  <!-- render input -->
                </div>
                <div v-else-if="question.type === 1" v-for="(option, optionIndex) in question.options"  :key="option" class="form-check">
                  <input 
                    class="form-check-input" 
                    type="checkbox" 
                    :id="option" 
                    v-model="initialAnswers[question.id]"
                    :value="option">
                  <label class="form-check-label"
                    :for="option">
                    {{option}}
                  </label>
                </div>
                <div v-else-if="question.type === 2">
                  <!-- render select -->
                </div>
                
              </div>  
            </div>
          </div>
        </div>

如果我检查我使用的复选框的组合对象,我会得到这个,如您所见,答案 11 应该是一个数组,但在原始值上,它只显示“true”:

Object debug

最后,如果我不使用动态生成的模型,而是将 a 绑定到输入模型,它可以完美地工作,我错过了什么?const checkedNames = ref([])

enter image description here

如果有任何使用,这就是我初始化模型的方式,案例 1 用于复选框

const initialAnswers = ref([])

for (const [key, value] of Object.entries(initialQuestions.value)) {
      console.log(`${key}: ${value}`);
      value.forEach((obj) => {
        switch(obj.type){
          case 0:
            initialAnswers[obj.id] = ref('')
            break;
          case 1:
            initialAnswers[obj.id] = ref([])
            break;
          case 2:
          case 3:
            initialAnswers[obj.id] = ref()
            break;
        }
        //initialAnswers[obj.id] =  obj,type === 0 ref([]) 
      })
    }
复选框 模型 vuejs3

评论


答:

0赞 Camilo Casadiego 11/10/2023 #1

问题与我如何初始化基本组件有关,最初代码是:

initialAnswers['' + obj.id] = ref([])

当必须时

initialAnswers.value['' + obj.id] = ref([])

更改此设置后,组件将按预期工作