【发布时间】:2014-08-12 07:40:38
【问题描述】:
从http://knockoutjs.com/examples/cartEditor.html 的 Knockoutjs 购物车编辑器示例中复制了 formatCurrency 函数,但无法像示例一样在视图中使用它。但是,当我从视图模型中调用它时,它可以工作。我还能够复制货币绑定处理程序并且有效。我的视图和视图模型如下。
<span>Total salary: </span><span data-bind="text: totalSalary"></span><br />
<span>Total salary: </span><span data-bind="currency: totalSalary, symbol: '$'"></span><br />
<span>Total salary: </span><span data-bind="text: totalFormattedSalary"></span><br />
<span>Total salary: </span><span data-bind='text: formatCurrency(totalSalary)'></span>
和视图模型:
// from http://tech.pro/blog/1863/10-knockout-binding-handlers-i-don-t-want-to-live-without
ko.bindingHandlers.currency = {
symbol: ko.observable('$'),
update: function(element, valueAccessor, allBindingsAccessor){
return ko.bindingHandlers.text.update(element,function(){
var value = +(ko.utils.unwrapObservable(valueAccessor()) || 0),
symbol = ko.utils.unwrapObservable(allBindingsAccessor().symbol === undefined
? allBindingsAccessor().symbol
: ko.bindingHandlers.currency.symbol);
return symbol + value.toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, "$1,");
});
}
};
function formatCurrency(value) {
return "$" + value.toFixed(2);
};
var Teacher = function(id, name, salary) {
this.id = id;
this.name = name;
this.salary = salary;
};
var viewModel = function(teachers) {
var self = this;
self.teachers = ko.observable(teachers);
self.totalSalary = ko.computed(function() {
var total = 0;
$.each(self.teachers(), function() { total += this.salary; });
return total;
});
self.totalFormattedSalary = ko.computed(function() {
var total = 0;
$.each(self.teachers(), function() { total += this.salary; });
return formatCurrency(total);
});
};
var initialTeachers = [
new Teacher(1, "Tom", 40000),
new Teacher(2, "Bill", 41000),
new Teacher(3, "Bob", 42000)
];
var vm = new viewModel(initialTeachers);
ko.applyBindings(vm);
TIA,史蒂夫
编辑:如果你在 Chrome 中按 F12,它会返回错误:“Uncaught ReferenceError: Unable to process binding “text: function (){return formatCurrency(totalSalary) }” 消息:formatCurrency 未定义”,它试图从视图中调用该函数。如果删除视图中的最后一行,则不会出现错误。
【问题讨论】:
标签: knockout.js