2013-03-29 50 views
0

我期待着執行以下操作。我想在第2列的計算函數中使用第1列中的總數。有沒有一種簡單的方法可以用knockout和jquery來做到這一點?淘汰賽在同一個表中的另一個計算中使用總計一列

col1  | col2 
--------------------------- 
1   | .21 * col1_total 
10  | .25 * col1_total 
20  | .31 * col1_total 
---------------------------- 
col1_total| col2_total 

爲更好的例子添加代碼。問題在於self.col3。 self.col1total不可用於代碼的該部分。我該如何解決這個問題?

function custdata(data) { 
var self = this; 
self.col1= ko.observable(data.col1); 
self.col2= ko.observable(data.col2); 

self.col3= ko.computed(function(){ 
return self.col1() * self.col1total(); 
}); 
} 


function guideviewmodel() { 
var self = this; 
self.custlist = ko.observableArray([]); 

     self.col1total = ko.computed(function() { 
      var total = 0; 
      $.each(self.custlist(), function() { total += this.col1(); }); 
      return total; 
     }); 

     self.custlist.removeAll(); 
        $.getJSON(callPath + "/api/xxx?guid=" + $("#lblFilteredID").text(), function (allData) { 
         var mappedLogs = $.map(allData, function (item) { return new custdata(item) }); 
         self.custlist(mappedLogs) 
        }); 
} 
+0

你看看ko.computed了嗎? (http://knockoutjs.com/documentation/computedObservables.html) –

+0

要在函數(data)(映射部分)中使用ko.computed,則無法訪問從視圖模型部分獲取總數的ko.computed函數。因此,直到使用該方法生成行之後纔會計算總數。我種類的解決方法是調用同一個數組兩次,一次得到總數。然後將其分配給標籤,然後在數據映射部分中引用該標籤。它雖然笨重,似乎並不總能奏效。 – user1813251

回答

0

這是你在找什麼?即時通訊不知道如何計算要乘以第2列的百分比。看看這個小提琴http://jsfiddle.net/G7dye/

<div> 
<span data-bind="text:$root.columns().length"></span> 
<table> 
    <thead> 
     <th>Col1</th> 
     <th>Col2</th> 
    </thead> 
    <tbody data-bind="foreach:columns"> 
     <tr> 
      <td><span data-bind ='text:num'></span></td> 
      <td><span data-bind="text:col2"></span></td> 
     </tr> 
    </tbody> 
</table> 

var TableItem = function(c){ 
var self = this; 
this.num = ko.observable(c); 
this.col2 = ko.computed(function(){ 
    return (self.num() * .21); 
}); 
} 

var ViewModel = function(){ 
var self = this; 
this.columns = ko.observableArray([new TableItem(5),new TableItem(3)]); 
this.columnOneTotal = ko.computed(function(){ 
    var colOneTot = 0; 
    ko.utils.arrayForEach(self.columns(), function(column) { 
     colOneTot += column.num(); 
    }); 
    return colOneTot; 
}); 
this.columnTwoTotal = ko.computed(function(){ 
    var colTwoTot = 0; 
    ko.utils.arrayForEach(self.columns(), function(column) { 
     colTwoTot += column.col2(); 
    }); 
    return colTwoTot; 
}); 

}

ko.applyBindings(new ViewModel()); 
+0

如果我正在閱讀這個權利,這不完全是我的意思。 col1和col2有值。 col2的值是col1 *的總數,它是數據集中唯一的值。在你的例子中,你只需乘以.21而不是col1的總數 – user1813251

2

我創建根據您的要求檢查出來小提琴,

Working Fiddle

+0

我認爲這是有效的。該計劃的結構有點不同。讓我看看我是否可以應用它。當前結構 函數(數據)var self = this; self.col1 = ko.observable(data.col1);} function viewmodel(){ self.a1 = ko.observablearray([]); function to total cols function to get data } – user1813251

+0

看起來像我需要拉我的.computed出我的功能(數據),並把它放在視圖模型... – user1813251

+0

添加代碼澄清。這個小提琴不適用於我的程序設置。不知道如何修改它的工作。 – user1813251