我在Access viewModel in javascript function outside viewModel's scope中找到了一些与我尝试做的相似的例子,但是在我的特定情况下无法弄清楚该怎么做。我有几位老师,显示他们的工资,以及工资总额,但是想要显示他们的工资相对于总额的相对百分比。以下是我的观点:
<table>
<tr>
<th></th>
<th>Salary</th>
<th>Salary Percent</th>
</tr>
<tbody data-bind="foreach: teachers">
<tr>
<td data-bind="text: name"></td>
<td data-bind="text: salary"></td>
<td data-bind="text: salaryPercent"></td>
</tr>
</tbody>
<tr>
<td>Total Salary</td>
<td data-bind="text: totalSalary"></td>
</tr>
</table>
查看模型:
var Teacher = function(id, name, salary) {
this.id = id;
this.name = name;
this.salary = salary;
this.salaryPercent = ko.computed(function() {
// return accounting.toFixed((this.salary/178000)*100, 0) + '%'; // works with hard-coded total salary
return accounting.toFixed((this.salary/viewModel.totalSalary)*100, 0) + '%';
// return this.salary; // works, returns the same salary as this.salary above
}, this);
};
var viewModel = function(teachers) {
var self = this;
self.teachers = ko.observableArray(teachers);
self.totalSalary = ko.computed(function() {
var total = 0;
ko.utils.arrayForEach(self.teachers(), function(teacher) { total += teacher.salary; });
return total;
});
};
var initialTeachers = [
new Teacher(1, "Tom", 40000),
new Teacher(2, "Betty", 41000),
new Teacher(3, "Charles", 45000),
new Teacher(4, "Daniel", 52000)
];
var vm = new viewModel(initialTeachers);
ko.applyBindings(vm);
和css:
td, th {
border: solid 1px black;
padding: 2px;
}
TIA,史蒂夫
注意:我使用的是jsfiddle附带的accounting.js库。
答案 0 :(得分:2)
This JSFiddle做了你想要做的事情。我在viewModel
,calculateSalaryPercent
中添加了一个函数,它以薪水作为参数。我从salaryPercent
移除了Teacher
,因为它现在已经计算得更高了。
一个简单说明:调用accounting.toFixed
小数位数为零会导致百分比加起来小于100%。
答案 1 :(得分:1)
除了gorilly的解决方案,另一种方法是使用knockout的绑定上下文$parent
直接在视图本身上构建逻辑。
但对于追求无逻辑模板的人(不是我)来说,这个解决方案是丑陋的。
http://jsfiddle.net/2tgqb4gg/27/
<tbody data-bind="foreach: teachers">
<tr>
<td data-bind="text: name"></td>
<td data-bind="text: salary"></td>
<td data-bind="text: accounting.toFixed(salary/$parent.totalSalary()*100,0)+'%'"></td>
</tr>
</tbody>