2013-03-22 94 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 
    }); 
}