Vue.js:计算平均值并更新字段
Vue.js: Calculate average and update field
我正在尝试计算不等于零的子成绩的平均值,并将绑定输入设置为新的平均值。
子年级有一个调用 calcAverage() 函数的 v-on 指令。在这里我认为您应该更新相应的 avgGrade 值。
HTML:
<div id="container">
<div class="row" v-repeat="testData">
<p>Grade avg:
<!--this should be average of sub grades that aren't 0-->
<input type="text" v-model="avgGrade" disabled />
<div v-repeat="vals">Sub grade {{item}}:
<input type="text" v-model="grade" v-on="change:calcAverage" />
</div>
</p>
</div>
</div>
JS:
var data = [
{item: 1,avgGrade: 2,vals: [{grade: 2}, {grade: 2}, {grade: 2}]},
{item: 2,avgGrade: 3,vals: [{grade: 3}, {grade: 3}, {grade: 3}]},
{item: 3,avgGrade: 4,vals: [{grade: 4}, {grade: 4}, {grade: 4}]}
];
var testVue = new Vue({
el: '#container',
data: {
testData: data
},
methods: {
calcAverage: function (e) {
//calculate the average of sub grades
//change Grade avg to show this
}
}
});
Fiddle: https://jsfiddle.net/ksumarine/bwrvsmpk/
谢谢!
您可以将重复项目传递给您的 change
事件回调函数,就像这样:
HTML
<div id="container">
<div class="row" v-repeat="testData">
<p>Grade avg:
<!--this should be average of sub grades that aren't 0-->
<input type="text" v-model="avgGrade" disabled />
<div v-repeat="vals" v-with="subItem: $data">Sub grade {{item}}:
<input type="text" v-model="grade" v-on="change:calcAverage(subItem)" />
</div>
</p>
</div>
</div>
JS
var data = [
{item: 1,avgGrade: 2,vals: [{grade: 2}, {grade: 2}, {grade: 2}]},
{item: 2,avgGrade: 3,vals: [{grade: 3}, {grade: 3}, {grade: 3}]},
{item: 3,avgGrade: 4,vals: [{grade: 4}, {grade: 4}, {grade: 4}]}
];
var testVue = new Vue({
el: '#container',
data: {
testData: data
},
methods: {
calcAverage: function (subItem) {
var total = 0,
length = subItem.vals.length;
for (var i = 0; i < length; i++) {
total += parseFloat(subItem.vals[i].grade);
}
subItem.avgGrade = total / length;
}
}
});
假设你的avgGrade是浮动的,我这里用的是parseFloat
,你可以改成parseInt
。
这里是 JSFiddle.
我正在尝试计算不等于零的子成绩的平均值,并将绑定输入设置为新的平均值。
子年级有一个调用 calcAverage() 函数的 v-on 指令。在这里我认为您应该更新相应的 avgGrade 值。
HTML:
<div id="container">
<div class="row" v-repeat="testData">
<p>Grade avg:
<!--this should be average of sub grades that aren't 0-->
<input type="text" v-model="avgGrade" disabled />
<div v-repeat="vals">Sub grade {{item}}:
<input type="text" v-model="grade" v-on="change:calcAverage" />
</div>
</p>
</div>
</div>
JS:
var data = [
{item: 1,avgGrade: 2,vals: [{grade: 2}, {grade: 2}, {grade: 2}]},
{item: 2,avgGrade: 3,vals: [{grade: 3}, {grade: 3}, {grade: 3}]},
{item: 3,avgGrade: 4,vals: [{grade: 4}, {grade: 4}, {grade: 4}]}
];
var testVue = new Vue({
el: '#container',
data: {
testData: data
},
methods: {
calcAverage: function (e) {
//calculate the average of sub grades
//change Grade avg to show this
}
}
});
Fiddle: https://jsfiddle.net/ksumarine/bwrvsmpk/
谢谢!
您可以将重复项目传递给您的 change
事件回调函数,就像这样:
HTML
<div id="container">
<div class="row" v-repeat="testData">
<p>Grade avg:
<!--this should be average of sub grades that aren't 0-->
<input type="text" v-model="avgGrade" disabled />
<div v-repeat="vals" v-with="subItem: $data">Sub grade {{item}}:
<input type="text" v-model="grade" v-on="change:calcAverage(subItem)" />
</div>
</p>
</div>
</div>
JS
var data = [
{item: 1,avgGrade: 2,vals: [{grade: 2}, {grade: 2}, {grade: 2}]},
{item: 2,avgGrade: 3,vals: [{grade: 3}, {grade: 3}, {grade: 3}]},
{item: 3,avgGrade: 4,vals: [{grade: 4}, {grade: 4}, {grade: 4}]}
];
var testVue = new Vue({
el: '#container',
data: {
testData: data
},
methods: {
calcAverage: function (subItem) {
var total = 0,
length = subItem.vals.length;
for (var i = 0; i < length; i++) {
total += parseFloat(subItem.vals[i].grade);
}
subItem.avgGrade = total / length;
}
}
});
假设你的avgGrade是浮动的,我这里用的是parseFloat
,你可以改成parseInt
。
这里是 JSFiddle.