2013-04-30 88 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/>