2013-04-30 90 views
1

当我试图用observable做一个简单的字符串替换时,我总是收到以下错误。在Knockout中替换简单字符串

str.replace不是一个函数

这里是我的意思的样本。我得到了以下观察到,工作正常:

this.price = ko.observable(data.price); 
this.priceFloat = ko.computed(function() { 
return parseFloat(Math.abs(viewModel.price())).toFixed(2); 
}, this); 

至于为什么我需要一个计算的版本和相同数量的可观察到的版本是另外一个问题。现在我需要删除我的逗号,这是非常基本的。我只是在我的控制台中做了这个,它工作。

var str = "3,047"; 
var nw = str.replace(',', ''); 
console.log(nw); 

但是,当我把它放在计算函数中,它会返回错误。

this.price = ko.observable(data.price); 
this.priceFloat = ko.computed(function() { 
    var str = viewModel.price(); 
    var nw = str.replace(',', ''); 
    console.log(nw); 
return parseFloat(Math.abs(viewModel.price())).toFixed(2); 
}, this); 

我尝试了以下,但它没有工作,它仍然返回相同的错误。

ko.extenders.removeComma = function(target) { 

    var result = ko.computed({ 
    read: function() { return target(); }, 
    write: function (v) { 
     target(v.replace(/\,/g, '')); 
    } 
    }); 
    return result; 
}; 
this.price = ko.observable(data.price).extend({removeComma: ""}); 

有谁知道这是为什么?任何解释将不胜感激。

+0

请注销'控制台.log(str);'在调用replace之前,你会看到'viewModel.price()'返回的是什么! – nemesv 2013-04-30 19:18:17

+1

@Rachelle Uy你能发布你收到的错误信息吗? – 2013-04-30 19:39:57

+0

@nemesv我知道,然后在字符串替换功能后,它不起作用。 :( – 2013-04-30 19:44:39

回答

2

很可能是因为可观察值返回值,这不是字符串这会导致此错误。请参阅下面的方式来处理:

this.price = ko.observable(data.price); 
this.priceFloat = ko.computed(function() { 
    var str = viewModel.price() ? viewModel.price().toString() : ''; 
    var nw = str.replace(',', ''); 
    console.log(nw); 
return parseFloat(Math.abs(viewModel.price())).toFixed(2); 
}, this); 

编辑:

http://jsfiddle.net/Qbc7Z/3/

+0

如果'str'将是'undefined',那么错误信息将是'Can not call method'replace'undefined'而不是'str.replace不是'一个函数...... – nemesv 2013-04-30 20:08:59

+0

@nemesv你说得对,实际上它的值不是未定义的,而是错误的类型,更新后的代码与之相匹配 – 2013-04-30 20:13:38

+0

Thanks @FeistyMango!It works now。 :D – 2013-05-05 01:19:33

0

在评论KO你可以使用这样的...

<!-- ko text: address().telephone.toString().replace(/(\d{3})(\d{3})(\d{4})/, "($1) $2-$3") --><!-- /ko --><br/>