Knockoutjs在一次计算中更新多个observable

时间:2013-06-25 15:32:26

标签: javascript knockout.js

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

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

  1. noMonths
  2. ((noMonths / 36)* bedragarray [0] .DP)
  3. (36-noMonths)
  4. (((36-noMonths)/ 36)* bedragarray [0] .EP)
  5. 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;
    }
    

    谢谢彼得

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

如果没有完全理解你的代码(a)似乎过于复杂,b)缺少你使用的某些可观察对象的定义,那么一般的答案是:

您可以为它们创建observable(在本例中为计算值)。

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