2013-03-22 87 views
1

我正在使用knockout.js。淘汰賽計算函數

這裏是我的情況:

我有一個輸入字段和三個複選框。每個複選框都有一個相關的值。例如,複選框1(500),複選框2(200),複選框3(100)。當用戶點擊複選框時,我希望該複選框的值在輸入字段中顯示。如果用戶點擊兩個複選框,我希望兩個複選框的值的總和出現在輸入字段上。同樣的事情適用於所有三個複選框被選中。

我對這個問題

拿我想,我需要一個計算的功能,將計算基於被選中的複選框值。然後,我可以將計算的函數綁定到我的輸入字段。

在我的視圖模型,我有這個計算功能:

var classes = ko.computed(function() { 
    var total = 0; 
    if(primaryClass.checked) 
    total+= parseInt(primSalary()); 

    if(secondaryClass.checked) 
    total+= parseInt(secSalary());  

    if(otherClass.checked)  
    total+= parseInt(otherSalary()); 

    return total;  
}); 

在我看來,我結合我的價值觀是這樣的:

<input type="text" class="input-medium" placeholder="0" data-bind="text: classes"/> 

然而,當我這樣做,控制檯拋出此消息:

「Unable to parsebindings.↵Message:ReferenceError:classes is not defined;↵Bindingsvalue:value:classes」

我會感謝你的幫助人。

+1

你可以把你的視圖模型代碼的其餘部分?我猜猜這些類屬性是不公開可見的。另外,什麼是您的計算中的primaryClass,secondaryClass和其他類? – 2013-03-22 12:40:44

+0

@PaulManzotti,那些在我的viewmodel defiend觀察者並綁定到我的複選框,如下所示: 500 – Stranger 2013-03-22 15:09:02

回答

2

如果沒有看到所有代碼,很難說錯什麼,但在我看來,您不會將classes computed添加到視圖模型或不要調用applyBindings。 另外,以另一種方式實現這種行爲更好。可以綁定檢查結合observableArray,在這種情況下,您的計算機會看起來更好:

<input data-bind="checked: selectedValues" type="checkbox" value="500">500</input> 
<input data-bind="checked: selectedValues" type="checkbox" value="200">200</input> 
<input data-bind="checked: selectedValues" type="checkbox" value="100">100</input> 

<br/> 
Result: 
<input data-bind="value: sum" type="text"></input> 

function ViewModel() { 
    var self = this; 

    self.selectedValues = ko.observableArray([]); 

    self.sum = ko.computed(function() { 
      var total = 0; 
      ko.utils.arrayForEach(self.selectedValues(), function (item) { 
       total += parseInt(item); 
      }); 
      return total; 
     }); 

    } 

ko.applyBindings(new ViewModel()); 

這裏是工作提琴: http://jsfiddle.net/uFQdq/

+0

我非常感謝您的回答。我有一個問題,我的語法(primaryInsurance.checked)是否正確?我嘗試在網上尋找這個,但無法找到答案。 – Stranger 2013-03-22 15:08:10

+0

我不確定。具有已檢查屬性的primaryInsurance對象?你能分享你的視圖模型和HTML嗎? – 2013-03-22 15:34:26

+0

Here:http://jsfiddle.net/uFQdq/4/ – Stranger 2013-03-22 16:41:06

2

你需要有一個分配給視圖模型的classes功能:

function ViewModel() { 
    var self = this; 

    self.classes = ko.computed(function() { 
     // your function 
    }); 
}