1

我正在尝试使用似乎可行的 Knockoutjs 进行计算,但我也想将一些变量输出到 html。

在下面的代码中我正在计算viewModel.LooptijdOnafhankelijkeBedragen,但我也想输出

  1. 无月
  2. ((noMonths/36) * bedragarray[0].DP)
  3. (36 个月)
  4. (((36-noMonths)/36) * bedragarray[0].EP )

中计算的ko.computed。无需多次计算的最佳方法是什么?

//*** Looptijd Onafhankelijke Bedragen ***
viewModel.LooptijdOnafhankelijkeBedragen    =
    [
        {startdatum: new Date(2013,7,1),einddatum: new Date(2013,12,31),EP: 1029,DP: 1235,EO: 2281,DO:2735},
        {startdatum: new Date(2014,1,1),einddatum: new Date(2014,12,31),EP: 1044,DP: 1244,EO: 2244,DO:2744},
        {startdatum: new Date(2015,1,1),einddatum: new Date(2015,12,31),EP: 1055,DP: 1255,EO: 2355,DO:2755},
        {startdatum: new Date(2016,1,1),einddatum: new Date(2016,12,31),EP: 1066,DP: 1266,EO: 2366,DO:2766},
        {startdatum: new Date(2017,1,1),einddatum: new Date(2017,12,31),EP: 1077,DP: 1277,EO: 2377,DO:2777}
    ];



viewModel.LooptijdOnafhankelijkBedrag = ko.computed(function() {
   var looptijdOnafhankelijkBedrag = 0;
   if(viewModel.HoofdzaakStartDatum() != 'undefined') //TODO better check
   {
   var bedragarray = $.grep(viewModel.LooptijdOnafhankelijkeBedragen, function (el) {
            return el.startdatum <= viewModel.HoofdzaakStartDatum() &&
                    el.einddatum > viewModel.HoofdzaakStartDatum()
             });
        if(bedragarray.length == 1)
        {
            switch(viewModel.TypeZaak())
            {
                case "1": //Enkele zaak particulier
                    return bedragarray[0].EP;
                break;
                case "2": //Enkele zaak ondernemer
                    return bedragarray[0].EO;
                break
                case "3": //Enkele zaak particulier ontbonden
                    if(viewModel.OntbindingDatum() != 'undefined') //TODO better check
                    {
                        var noMonths =  MonthDiffIncluding(viewModel.HoofdzaakStartDatum(), viewModel.OntbindingDatum() );
                        if(noMonths>0)
                        {
                            if(noMonths > 36)
                            {
                                //max = 36 months
                                noMonths = 36;
                            }

                            //Evenredig deel enkel en dubbel afhankelijk van datum onbinding
                            return ((noMonths/36) * bedragarray[0].DP) + (((36-noMonths)/36) * bedragarray[0].EP );
                        }
                        else
                        {
                            return 0;
                        }
                    }
                    return 0;
                break;
                case "4": //Enkele zaak ondernemer ontbonden
                        if(viewModel.OntbindingDatum() != 'undefined') //TODO better check
                    {
                        var noMonths =  MonthDiffIncluding(viewModel.HoofdzaakStartDatum(), viewModel.OntbindingDatum() );
                        if(noMonths>0)
                        {
                            if(noMonths > 36)
                            {
                                //max = 36 months
                                noMonths = 36;
                            }
                            //Evenredig deel enkel en dubbel afhankelijk van datum onbinding
                            return ((noMonths/36) * bedragarray[0].DO) + (((36-noMonths)/36) * bedragarray[0].EO );
                        }
                        else
                        {
                            return 0;
                        }
                    }
                    return 0;
                break;
                case "5": //Dubbele zaak particulier
                    looptijdOnafhankelijkBedrag = bedragarray[0].DP;
                break;
                case "6": //Dubbele zaak ondernemer
                    looptijdOnafhankelijkBedrag = bedragarray[0].DO;
                break;


            }
        }

   }
   return looptijdOnafhankelijkBedrag;
   }).extend({currency: 2});


//calculates the difference in months between 2 dates
//Including the startmonth and EndMonth
function MonthDiffIncluding(startDate, endDate) {
    var months = 0;
    try
    {
    if(startDate != 'undefined' && endDate != 'undefined') //TODO better check
        {
            months = (endDate.getFullYear() - startDate.getFullYear()) * 12;
            months -= startDate.getMonth();
            months += endDate.getMonth() + 1;
         }
    }
    catch(ex)
    {
        months  = 0;
    }
    return months <= 0 ? 0 : months;
}

谢谢彼得

4

2 回答 2

1

我已经发现自己:我可以使用 jQuery 更改 observable 的值:$("#LOBAantalMaandenVoorOntbinding").val(noMonths).change(); 另见Knockout.js bound input value not updated when I use jquery .val('xyz')

于 2013-06-26T07:12:41.867 回答
0

在没有完全理解您的代码的情况下(a)似乎过于复杂,b)缺少您使用的某些可观察对象的定义),一般答案是:

您为它们创建 observables(在这种情况下是计算的)。

任何 observable 都会缓存其值,因此如果您在整个代码中重复使用它,则不会每次都重新计算它。如果事实 observables 只计算一次:当它们被创建时(之后只有当它们的依赖项之一发生变化时)。

于 2013-06-25T16:05:17.577 回答