我正在尝试使用似乎可行的 Knockoutjs 进行计算,但我也想将一些变量输出到 html。
在下面的代码中我正在计算viewModel.LooptijdOnafhankelijkeBedragen
,但我也想输出
- 无月
- ((noMonths/36) * bedragarray[0].DP)
- (36 个月)
- (((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;
}
谢谢彼得