我正在使用v-for循环遍历学生学习特定学科的记录。我需要为每个学生分配参加考试的分数。我发现很难在文本字段中键入唯一标记,因为它们在具有相似v模型的所有字段中都重复出现。我该怎么办?
<div id="">
<tbody>
<tr v-for="item in subjectStudentsData">
<td>{{item.surname}}</td>
<td>{{item.registrationNumber}}</td>
<td>
<input type="text" v-model="exam.cat1" />
</td>
<td>
<input type="text" v-model="exam.cat2" />
</td>
<td>
<input type="text" v-model="exam.cat3" />
</td>
<td>
<input type="text" v-model="exam.mainExam" />
</td>
<td>
<input type="button" value="Save" />
</td>
</tr>
</tbody>
</table>
</div>
my script section
<script type="text/javascript">
var subjectStudentsVM=new Vue({
el:"#subjectStudentsSection",
data:function(){
return {
subjectStudentsData:[
{
surname:"Simon",
registrationNumber:"20",
subjects:{
id:"2"
name:"English"
}
},
{
surname:"Kuch",
registrationNumber:"23",
subjects:{
id:"2"
name:"English"
}
},
],
exam:{
cat1:'',
cat2:'',
cat3:'',
mainExam:''
}
}
}
})
</script>
答案 0 :(得分:0)
如果您想将每个输入与v-model
绑定,则需要为此提供数据属性。
您的代码可能如下所示:
<tr v-for="(item, index) in subjectStudentsData">
...
<input type="text" v-model="subjectStudentsData[index]"/>
...
data(){
return {
subjectStudentsData: [{"Simon"},{"John"}], //note the syntax
}
},
现在您可以在其他一些事情中使用它,例如在循环内使用一个函数,但这确实可行。
答案 1 :(得分:0)
最简单的解决方案是在每个学生身上拥有一个exam
属性:
subjectStudentsData: [
{
surname: "Simon",
registrationNumber: "20",
subjects: {
id: "2"
name: "English"
},
exam: {
cat1: '',
cat2: '',
cat3: '',
mainExam: ''
}
},
{
surname: "Kuch",
registrationNumber: "23",
subjects: {
id: "2"
name: "English"
},
exam: {
cat1: '',
cat2: '',
cat3: '',
mainExam: ''
}
},
]
然后,您可以在模板中引用相应的exam
对象:
<input type="text" v-model="item.exam.cat1" />
如果您无法为每个exam
添加item
属性,则此方法可能存在问题。例如,这可能是因为subjectStudentsData
对象在其他地方使用了,所以您不想对其进行突变。如果它们来自父组件或存储,也可能会违反单向数据流。
如果是这种情况,您有两种选择:
对于第二种选择,数据最终看起来像这样:
subjectStudentsData: [
{
student: {
surname: "Simon",
registrationNumber: "20",
subjects: {
id: "2"
name: "English"
}
},
exam: {
cat1: '',
cat2: '',
cat3: '',
mainExam: ''
}
},
{
student: {
surname: "Kuch",
registrationNumber: "23",
subjects: {
id: "2"
name: "English"
}
},
exam: {
cat1: '',
cat2: '',
cat3: '',
mainExam: ''
}
},
]
模板将需要相应地更新以使用这些嵌套路径。这里要注意的关键是保存学生数据的原始对象尚未更改。它们存储在包装对象的student
属性中。然后,exam
对象已存储在包装对象的exam
属性中。
我要强调的是,上面的示例仅显示了数据的形状。实际上,student
属性将来自其他地方,不会像示例中那样是内联的。
另一种替代方法是引入一个新组件来表示行。每行都有其自己的本地data
属性,自然导致每一行都有自己的exam
对象。对于您的用例而言,这是否是一个好的解决方案,在某种程度上取决于对exam
对象的访问权限,以及是否可以将相关对象干净地传递到需要的地方。