【问题标题】:knockout computed function敲除计算函数
【发布时间】:2013-03-12 07:44:14
【问题描述】:

我正在使用 knockout.js。

这是我的场景:

我有一个输入字段和三个复选框。每个复选框都有一个关联的值。例如,checkbox1(500)、checkbox2(200)、checkbox3(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"/>

但是,当我这样做时,控制台会抛出以下消息:

“无法解析绑定。↵消息:ReferenceError:未定义类;↵绑定值:值:类”

感谢您的帮助。

【问题讨论】:

  • 你能把剩下的视图模型代码放上去吗?我猜想 classes 属性不是公开可见的。另外,你计算的primaryClass、secondaryClass和otherClass是什么?
  • @PaulManzotti,这些是我的视图模型中的可观察对象,并与我的复选框相关联,如下所示:500

标签: html knockout.js


【解决方案1】:

您需要将 classes 函数分配给 ViewModel:

function ViewModel() {
    var self = this;

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

【讨论】:

    【解决方案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/

    【讨论】:

    • 非常感谢您的回答。我有一个问题,我的语法 (primaryInsurance.checked) 是否正确?我尝试在网上寻找这个但找不到答案。
    • 我不确定。 primaryInsurance 对象是否具有已检查的属性?你能分享你的视图模型和html吗?
    • 我认为引用空问题。这是关于上下文的。我不得不使用 $root.classes。我现在的问题是,当我单击复选框时,我得到的是 NaN。有谁知道为什么?这是我的小提琴:jsfiddle.net/uFQdq/4
    • 既然我原来的问题已经解决了,对于我的这个新问题,如果你想回答,那么请访问stackoverflow.com/questions/15576008/input-field-displaying-nan
    猜你喜欢
    • 2013-03-02
    • 2018-02-24
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 2015-11-26
    • 2014-08-02
    • 2013-02-12
    相关资源
    最近更新 更多