在Knockout js中执行同时乘法

时间:2013-08-29 21:43:01

标签: javascript knockout.js

您好我正在尝试使用4个文本框制作一个简单的计算器,问题是当我对我的函数执行乘法运算时,输出仅在我完成输入四个文本框的值时显示,我该如何才能这样做值会像添加操作一样更新吗?

这是我的代码:

function ViewModel() {
var self =this;
self.firstNumber = ko.observable("");
self.secondNumber = ko.observable("");
self.thirdNumber = ko.observable("");
self.fourthNumber = ko.observable("");


self.Sum = ko.computed(function(){
return Number(self.firstNumber()) + Number(self.secondNumber()) + Number(self.thirdNumber()) +
Number(self.fourthNumber());
});

self.Product = ko.computed(function(){
 return Number(self.firstNumber()) * Number(self.secondNumber()) * Number(self.thirdNumber()) *
 Number(self.fourthNumber());
});

到目前为止,这是我的小提琴:http://jsfiddle.net/a_miguel6687/UvJAU/

2 个答案:

答案 0 :(得分:1)

问题是,当用作数字时,javascript将空字符串视为零,因此如果任何文本框为空,那么零,任何事物都为零。

处理此问题的一种方法是让它将空字符串视为' 1',如下所示:

function defaultToOne(numString) {
    return numString === '' ? 1 : Number(numString);
}

然后您的乘法代码可以是:

self.Product = ko.computed(function(){
    return defaultToOne(self.firstNumber()) * defaultToOne(self.secondNumber()) * defaultToOne(self.thirdNumber()) * defaultToOne(self.fourthNumber());
});

Fiddle

编辑:这将显示" 1"默认情况下,如果所有文本框都为空,则作为产品。这并不可怕,在某种程度上,零数字的乘积是任意的。但是如果你想提供一个不同的默认值,你可以做这样的事情作为产品功能的第一行。

if((self.firstNumber() + self.secondNumber() + 
   self.thirdNumber() + self.fourthNumber()) === '') {
        return '';   
    }

请注意,这是使用' +'进行字符串连接。标志,而不是数学加法;这是检查所有这四个框是否为空的简短方法。

答案 1 :(得分:0)

空文本框意味着空字符串将表示0(零)。另外,这不是问题。对于乘法,这意味着无论如何产品都将为零。

请确保您以某种方式对待空文本框(例如将其解释为1或完全忽略它)。

这是一种非效率,非优雅但非常解释性的方法:

self.Product = ko.computed(function(){
    var n1 = self.firstNumber();
    var n2 = self.secondNumber();
    var n3 = self.thirdNumber();
    var n4 = self.fourthNumber();

    if (n1 === "" && n2 === "" && n3 === "" && n4 === "") { return ""; }

    if (n1 === "") { n1 = 1; }
    if (n2 === "") { n2 = 1; }
    if (n3 === "") { n3 = 1; }
    if (n4 === "") { n4 = 1; }

    return n1 * n2 * n3 * n4;
});

请参阅this fiddle

同样,以上不是推荐的生产代码,仅仅意味着对正在发生的事情非常详细。