2014-04-24 104 views
1

我有一個淘汰賽viewmodel有貨幣和百分比內存儲爲數字(而不是文本)。我想在不同的地方以很好的文本格式顯示這些數字。即有些人去獨立span元素中,像這樣:淘汰賽格式數據沒有綁定處理程序

<span data-bind="formatCurrency: totalOutstandingBalance"></span> 

別人進入一個表,並使用遞歸來顯示它們。我可以使用綁定的處理程序來格式化這些值,專門爲淘汰賽,像這樣(這工作):

ko.bindingHandlers.formatCurrency = { 
     init: function(element, valueAccessor, allBindingsAccessor, viewModel) { 
      ko.applyBindingsToNode(element, {text: valueAccessor, '$#,##0.#0')}); 
     } 
    }; 

然而,在某些時候我的代碼中(一個內部的圖形庫),我需要使用類似格式化代碼,像這樣(這個工程與室內庫):

function formatCurrency(value) { 
    return lib.formatter.formatNumber(value, '$#,##0.#0'); 
} 

console.log(formatCurrency(512.17)); 

我必須格式化各種事情,百分比,貨幣,整數,雙打,日期等。我現在已經爲每個實例累積了bindingHandlers和泛型函數。我的問題是,我是否可以以某種方式使用這種通用格式貨幣代碼等等,既適用於我的非淘汰賽格式需求,也適用於我的淘汰賽格式,從而無需在我的代碼中使用格式化我的文本文本的雙重功能。

回答

0

你可以考慮使用計算的觀測值。例如,在您的視圖模型,你可以有一個計算觀察到的命名formattedPrice(只是一個例子):

self.formattedPrice = ko.computed(function() { 
     return lib.formatter.formatNumber(self.actualPrice(), '$#,##0.#0'); 
}); 

actualPrice將是你有觀察到在具有數價格的視圖模型。

更多關於計算觀測:http://knockoutjs.com/documentation/computedObservables.html

+0

這還是重複我的工作。我將有observables,計算observables(格式化),我仍然有非基於KO格式的通用JavaScript方法。 – Husman

+0

IMO,你需要有一個基於KO和非KO的格式功能。我不認爲有這樣的逃脫。雖然我可能是錯的。 –

1

你爲什麼不從bindingHandler調用formatCurrency方法?

function formatCurrency(value) { 
    return lib.formatter.formatNumber(value, '$#,##0.#0'); 
} 

ko.bindingHandlers.formatCurrencyHandler = { 
    init: function(element, valueAccessor, allBindingsAccessor, viewModel) { 
     $(element).html(formatCurrency(valueAccessor); 
    } 
}; 

如果你確信你會得到一個號碼,你甚至可以添加formatCurrency到數原型:

Number.prototype.formatCurrency = function() { return lib.formatter.formatNumber(this, '$#,##0.#0'); } 

$(element).html(valueAccessor.formatCurrency());