我在我的viewmodel函数中说了3个函数和一个Main
var viewModel = function () {
var self = this;
self.MAIN= ko.observableArray(); //i will push stage1 function after filling data
function stage2()
{
var self = this;
self.subtype = ko.observableArray(); //in this i push one,two,three function data
}
function stage1()
{
var self = this;
self.TypeData = ko.observableArray(); //it holds subtype data of stage2
self.TotalAmount = ko.observable("");
}
function one()
{
var self = this;
self.id=ko.observable("");
self.AmountPerInstallment = ko.observable("");
}
function two()
{
var self = this;
self.id=ko.observable("");
self.AmountPerInstallment = ko.observable("");
}
function three()
{
var self = this;
self.id=ko.observable("");
self.AmountPerInstallment = ko.observable("");
}
}
ko.applyBindings(new viewModel()); //its in my document.ready
这些功能可能有点令人困惑,让我解释一下我的视图部分和数据流
MAIN 可观察数组是我将数据输入其中的数据来源。
第1层:MAIN(我循环使用 TypeData , TotalAmount )
第2层:TypeData(我遍历它,我将在其下面有子类型)
第3层:在子类型下,我的功能一,二,三, AmountPerInstallment
所以我需要的是我必须在子类型(第3层)下总结AmountPerInstallment,并且应该填入我TotalAmount
observableArray中的MAIN
。
最重要的是当我更改AmountPerInstallment
时,总金额应该动态变化
我的主视图结构:
<table id="partialservicetypes" data-bind="foreach:$root.MAIN">
<tr>
<td>
@Html.Partial("_PaymentsHeader"); // this has total amount
</td>
</tr>
<tr>
<td>
<table>
<tr >
<td data-bind="foreach:$data.TypeData">
@Html.Partial("xyz") //inside this partial view i run subtype foreach
</tr>
</table>
</td>
</tr>
</table>
答案 0 :(得分:1)
我不太了解您的数据结构,
如果您的stage1中的TypeData
保持与stage2的subtype
数组相同的值。
function stage1()
{
var self = this;
self.TypeData = ko.observableArray(); //it holds subtype data of stage2
self.TotalAmount = ko.computed(function() {
var amount = 0;
ko.utils.arrayForEach(self.TypeData(), function(stage2) {
amount += parseFloat(stage2.AmountPerInstallment());
});
return amount;
});
}
如果您的stage1中的TypeData
包含一组stage2对象。
function stage1()
{
var self = this;
self.TypeData = ko.observableArray(); //it holds subtype data of stage2
self.TotalAmount = ko.computed(function() {
var amount = 0;
ko.utils.arrayForEach(self.TypeData(), function(stage2) {
ko.utils.arrayForEach(stage2.subtype(), function(obj) {
amount += parseFloat(obj.AmountPerInstallment());
});
});
return amount;
});
}
更新看起来您的AmountPerInstallment
是字符串而不是数字。
答案 1 :(得分:0)
我猜你需要一个setter函数,也许你可以做
Object.defineProperties(yourObject, {
AmountPerInstallment: {
set: function () {
/** code that you want to compile when you change AmountPerInstallment */
}
}
});