我試圖做Knockoutjs計算,似乎工作更新多個觀測,但我也希望輸出一些變量的HTML。Knockoutjs在一個計算
在下面的代碼我計算viewModel.LooptijdOnafhankelijkeBedragen
, 但我也想輸出
- noMonths
- ((noMonths/36)* bedragarray [0] .DP)
- (36 -noMonths)
- (((36-noMonths)/ 36)* bedragarray [0] .EP)
了在計算。不需要多次計算就可以做到這一點的最佳方法是什麼?
//*** 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;
}
感謝彼得
請設置上的jsfiddle你的代碼的工作示例,包括什麼'LooptijdOnafhankelijkBedrag的更透徹的解釋()'應該計算。 – Tomalak