淘汰复杂计算

时间:2014-07-07 06:29:29

标签: jquery knockout.js

我在我的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>

2 个答案:

答案 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 */
    }
  }
});