【问题标题】:Knockoutjs formatCurrency function not working in viewKnockoutjs formatCurrency 函数在视图中不起作用
【发布时间】: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);

JSFiddle

TIA,史蒂夫

编辑:如果你在 Chrome 中按 F12,它会返回错误:“Uncaught ReferenceError: Unable to process binding “text: function (){return formatCurrency(totalSalary) }” 消息:formatCurrency 未定义”,它试图从视图中调用该函数。如果删除视图中的最后一行,则不会出现错误。

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    totalSalary 是一个可观察的。您必须通过将其作为函数调用来获取

    formatCurrency(totalSalary())
    

    http://jsfiddle.net/wape5ts8/31/

    undefined is not a function 来自 .toFixedtotalSalary observable 上被调用,这是一个函数。

    【讨论】:

    • 好的,你帮我找到了答案,但是jsfiddle.net/sfortner/wape5ts8/34 的更新小提琴使用绑定“文本:formatCurrency(totalSalary())”,它仍然失败。我将您的小提琴视为一个工作示例,但必须将 jsfiddle 选项从 onLoad 更改为“No wrap - in ”并调用 totalSalary() 作为可观察的,以使其在 jsfiddle.net/sfortner/wape5ts8/37 中工作。你能解释一下吗?对于它的价值,我在提问之前尝试了绑定“text:formatCurrency(totalSalary())”,但不知道配置要求。
    • doc.jsfiddle.net/basic/introduction.html 是一个很好的解释。我相信您不想将代码包装在 onLoad Window 事件中是有道理的。不知道为什么这是默认设置。感谢您的回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多