knockout计算返回串联字符串而不是sum的类型数值

时间:2014-07-25 06:51:39

标签: knockout.js typescript

Ex 1:

this.total = ko.computed<number>(() =>{
    return this.baseSave() * 1 + (this.ability.modifier() * 1) + this.magic() *1  + this.miscellaneous()* 1 + this.temporary()*1;
});

前2:

this.total = ko.computed<number>(() =>{
    return this.baseSave() + this.ability.modifier() + this.magic() + this.miscellaneous() + this.temporary();
});

我正在使用打字稿和打字稿

鉴于(0,10,0,0,10)

Ex 1工作返回20,ex 2工作失败0100010作为字符串

所讨论的

属性都被声明并初始化为

export class someClass{
    baseSave: KnockoutObservable<number>;

    constructor(){
        baseSave = ko.observable<number>(0);
    }
}

,但是能力除外,它是在包含计算值的类的构造函数中传递的类。 关于为什么会发生这种情况的任何想法/建议?

2 个答案:

答案 0 :(得分:2)

当您绑定到UI时,您将根据用户键入的内容返回字符串。乘以1会使它成为一个数字(这是您认为的应该)。

enter image description here

答案 1 :(得分:0)

JavaScript是松散类型的,而'+'运算符是重载的。这意味着它可以用于添加数字并连接字符串。通过查看参数的类型,可以解决该问题。

值得一般阅读:http://en.wikipedia.org/wiki/Operator_overloading

在Ex 2中,KO observable正在返回字符串,所以+正在努力连接字符串。

在例1中,(* 1)将字符串转换为int,然后+正在添加它们。

然而,使用parseInt更加“正确”,所以理想情况下你的代码将是:

this.total = ko.computed<number>(() =>{
    return parseInt(this.baseSave()) + 
        parseInt(this.ability.modifier()) + 
        parseInt(this.magic()) + 
        parseInt(this.miscellaneous()) + 
        parseInt(this.temporary());
});

习惯parseInt非常方便,因为如果你需要处理包含二进制文件的字符串等,你可以使用它。请阅读:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt

例如

parseInt("10")

返回一个10的int,因为它假设我们默认是在十进制系统中,但是如果你提供2的基数:

parseInt("10", 2)

然后10被解释为二进制,并返回一个2的int。