2013-07-04 52 views
0

在我的視圖模型中有一個名爲projectluine的observableArray。該數組由projectsWorked對象組成。我需要獲得數組中的projectsWorked.projectHourWork的總和。我寫了calcTotal()來計算總數。在knockoutjs中使用observableArray進行計算

function ViewModel() { 
     var self = this; 
     this.CheckIn = ko.observable(); 
     this.CheckOut = ko.observable(); 
     this.Lunch = ko.observable(); 
     this.projectLine = ko.observableArray([new projectsWorked()]); 

     this.TimeForWork = ko.computed(function() { 
      return this.CheckIn() ? this.CheckOut() ? parseFloat(this.Lunch()) ? parseFloat(this.CheckOut()) - parseFloat(this.CheckIn()) - parseFloat(this.Lunch()) : parseFloat(this.CheckOut()) - parseFloat(this.CheckIn()) : 0 : 0; 
     }, this); 

     this.Rest = ko.observable(); 

     this.RemainHour = ko.computed(function() { 
      return self.TimeForWork() ? self.Rest() ? self.WorkOnProject() ? parseFloat(self.TimeForWork()) - parseFloat(self.Rest()) - parseFloat(self.WorkOnProject()) : parseFloat(self.TimeForWork()) - parseFloat(self.Rest()) : parseFloat(self.TimeForWork()) : 0 
     }, this); 

     this.WorkOnProject = ko.observable(); 
     this.grandTotal = ko.observable(); 

     this.AddLine = function() { 
      alert('hello Add'); 

      this.calcTotal(); 
      this.projectLine.push(new projectsWorked()); 
     }; 

     //Problem Occurs in here 
     this.calcTotal = function() { 
      var total = 0; 
      alert('ABC'); 
      ko.utils.arrayForEach(self.projectLine(), function() { 
       alert('BB'); 
       alert(self.projectLine.projectWork); 
       total += self.projectLine.projectHourWork; 
      }) 
       //$.each(self.projectLine, function() { 
       // totalh = parseFloat($('#txthour').val()); 


       // total += totalh; 
       // alert(total); 
       //}) 
       this.grandTotal = total; 
      //  alert(total); 
     } 

    }; 

    function projectsWorked() { 
     var self = this; 
     this.projectEnable = ko.observable(false); 
     this.hours = ko.observable(); 
     this.projectHourWork=ko.computed(function() { 
      return this.hours(); 
      }, this); 

     this.selectedProject = ko.observable(); 

     this.removeLine = function (line) { 
      alert('hello Remove');  
      self.projectLine.removeLine(this); 
     }; 
    }; 

    var data = [ 
     "ABC","CDE" 
    ]; 


    ko.applyBindings(new ViewModel()); 

但是這個計算給了我不正確的值。 Firebug將我的self.projectLine.projectHourWork值顯示爲未定義。這可能是什麼原因?我如何計算總數?

+0

爲什麼你聲明變量var self = this;'然後你繼續使用'this'而不是'self'? –

回答

1

在calcTotal函數中,您可以參考行 中的self.projectLine total + = self.projectLine.projectHourWork;

self.projectLine是一個observableArray,所以我很確定projectHourWork沒有在self.projectLine上定義。

可能這是你想做的事:

ko.utils.arrayForEach(self.projectLine(), function (pl) { 
    alert('BB'); 
    total += pl.projectHourWork(); 
}) 

我希望它能幫助。

+0

笏對象你通過pl引用嗎? – DevT

+0

這不適用於我 – DevT

+0

pl是一個projectsWorked的實例,它是一個self.projectLine() – Damien

1

我認爲問題在於你在projectLine數組上循環的方式。

循環內部「self」是對視圖模型對象的引用,而不是數組中的每個元素。嘗試像這樣:

ko.utils.arrayForEach(self.projectLine(), function (project) { 
    alert(project.projectWork); 
    total += project.projectHourWork(); 
}); 
ko.utils.arrayForEach(self.projectLine(), function (project) { 
    alert(project.projectWork); 
    total += project.projectHourWork(); 
}); 
+0

wat object參考項目? – DevT

+0

它需要改變爲'total + = project.projectHourWork();'那麼它的工作 – DevT

+0

ko.utils.arryForEach()會調用你傳遞的函數作爲集合中每個項目的第二個參數作爲第一個參數傳遞,將項目作爲參數傳遞。所以「project」將引用projectLine數組中的每個項目。 –