javascript - Knockoutjs 在一次计算中更新多个可观察量

标签 javascript knockout.js

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

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

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

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

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

谢谢彼得

最佳答案

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

关于javascript - Knockoutjs 在一次计算中更新多个可观察量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17301483/

相关文章:

javascript - 如何使用 GET/POST 和 Token key 基于 Ajax 调用 ASP.NET Web API

jquery - 我的 RequireJS 依赖链出了什么问题?

javascript - 显示模块模式 (RMP) 的缺点

javascript - 当 Knockout JS 中可观察的属性发生变化时执行函数

javascript - jQuery UI 可按 desc 顺序设置

javascript - __dirname 未在 Node 14 版本中定义

javascript - 将时间转换为可读取的时间,需要不断地向上和向下计数

javascript - 仅在其中一个元素上禁用 onclick

javascript - 使用 Knockout.js 在 radio 输入中确认提示调用的单击事件

knockout.js - DurandalJS - 从 KO 模板切换到 Compose