我正在尝试使用似乎有效的Knockoutjs进行计算,但我还想将一些变量输出到html。
在下面的代码中,我正在计算viewModel.LooptijdOnafhankelijkeBedragen
,
但我也想输出
在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;
}
谢谢彼得
答案 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都会缓存其值,因此如果您在整个代码中重复使用它,则不会每次都重新计算它。如果事实可观察量只计算一次:它们被创建时(以及之后只有当它们的一个依赖项发生变化时)。