在我的视图模型中,有一个名为 projectLine 的observableArray。该数组由projectsWorked对象组成。我需要在数组中获得projectsWorked.projectHourWork的总和。我写了 calcTotal()来计算总数。
function ViewModel() {
var self = this;
this.CheckIn = ko.observable();
this.CheckOut = ko.observable();
this.Lunch = ko.observable();
this.projectLine = ko.observableArray([new projectsWorked()]);
this.TimeForWork = ko.computed(function () {
return this.CheckIn() ? this.CheckOut() ? parseFloat(this.Lunch()) ? parseFloat(this.CheckOut()) - parseFloat(this.CheckIn()) - parseFloat(this.Lunch()) : parseFloat(this.CheckOut()) - parseFloat(this.CheckIn()) : 0 : 0;
}, this);
this.Rest = ko.observable();
this.RemainHour = ko.computed(function () {
return self.TimeForWork() ? self.Rest() ? self.WorkOnProject() ? parseFloat(self.TimeForWork()) - parseFloat(self.Rest()) - parseFloat(self.WorkOnProject()) : parseFloat(self.TimeForWork()) - parseFloat(self.Rest()) : parseFloat(self.TimeForWork()) : 0
}, this);
this.WorkOnProject = ko.observable();
this.grandTotal = ko.observable();
this.AddLine = function () {
alert('hello Add');
this.calcTotal();
this.projectLine.push(new projectsWorked());
};
//Problem Occurs in here
this.calcTotal = function () {
var total = 0;
alert('ABC');
ko.utils.arrayForEach(self.projectLine(), function () {
alert('BB');
alert(self.projectLine.projectWork);
total += self.projectLine.projectHourWork;
})
//$.each(self.projectLine, function () {
// totalh = parseFloat($('#txthour').val());
// total += totalh;
// alert(total);
//})
this.grandTotal = total;
// alert(total);
}
};
function projectsWorked() {
var self = this;
this.projectEnable = ko.observable(false);
this.hours = ko.observable();
this.projectHourWork=ko.computed(function () {
return this.hours();
}, this);
this.selectedProject = ko.observable();
this.removeLine = function (line) {
alert('hello Remove');
self.projectLine.removeLine(this);
};
};
var data = [
"ABC","CDE"
];
ko.applyBindings(new ViewModel());
但是这个计算给了我不正确的价值。 Firebug向我显示self.projectLine.projectHourWork值为undefined。这可能是什么原因?我该如何计算总数?
答案 0 :(得分:1)
在calcTotal函数中,您可以在行中引用self.projectLine total + = self.projectLine.projectHourWork;
self.projectLine是一个observableArray,所以我很确定projectHourWork没有在self.projectLine上定义。
可能这就是你想要做的事情:
ko.utils.arrayForEach(self.projectLine(), function (pl) {
alert('BB');
total += pl.projectHourWork();
})
我希望它有所帮助。
答案 1 :(得分:1)
我认为问题在于你在projectLine数组上循环的方式。
在循环内部,“self”是对视图模型对象的引用,而不是对数组的每个元素的引用。试试像thi:
这样的东西ko.utils.arrayForEach(self.projectLine(), function (project) {
alert(project.projectWork);
total += project.projectHourWork();
});