2013-06-25 47 views
1

我試圖做Knockoutjs計算,似乎工作更新多個觀測,但我也希望輸出一些變量的HTML。Knockoutjs在一個計算

在下面的代碼我計算viewModel.LooptijdOnafhankelijkeBedragen, 但我也想輸出

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

感謝彼得

+0

請設置上的jsfiddle你的代碼的工作示例,包括什麼'LooptijdOnafhankelijkBedrag的更透徹的解釋()'應該計算。 – Tomalak

回答

1

我已經找到了我自己:我可以改變一個可觀察的與jQuery值:$("#LOBAantalMaandenVoorOntbinding").val(noMonths).change(); 也看到Knockout.js bound input value not updated when I use jquery .val('xyz')

+0

如果你仍然有興趣,我做了一個搗鼓一些改進你的代碼,但得到分心之前,我可以把它變成一個實際的答案。我不想把它扔掉,你可能會從中得到一些想法。 http://jsfiddle.net/SjhHr/ – Tomalak

0

而不必完全理解你的代碼(A)似乎過於複雜和b)缺少一些使用可觀察)的定義,一般的回答是:

你爲它們創建觀測值(在這種情況下是計算的)。

任何可觀察到緩存它的價值,所以如果你重複使用它在你的代碼,它不會被重新計算每次。如果觀測事實只計算一次:在創建時(和之後,只有當它們的依賴關係的變化之一)。