【问题标题】:Currency formatting with pureComputed使用 pureComputed 进行货币格式化
【发布时间】:2014-12-15 15:35:45
【问题描述】:

我想以逗号分隔的方式格式化数字。我找到了满足我要求的jsfiddle。我需要为我的虚拟机添加另一个pureComputed 值,我通过修改modified jsfiddle 尝试了这种方式。

但是,我在控制台中收到错误消息:

Unable to process binding "text: function (){return Test }" Message: undefined is not a function

我在这里缺少什么?我的js是

(function ($) {
var cleanInput = function (value) {
    return parseFloat(value.replace(/[^0-9.-]/, ''));
}

var formatInput = function (value) {
    toks = value.toFixed(2).replace('-', '').split('.');
    var display = $.map(toks[0].split('').reverse(), function (elm, i) {
        return [(i % 3 == 0 && i > 0 ? ',' : ''), elm];
    }).reverse().join('') + '.' + toks[1];

    return value < 0 ? '(' + display + ')' : display;
}

ko.bindingHandlers.money = {
    init: function (elm, valueAccessor) {
        $(elm).change(function () {
            valueAccessor()(cleanInput(elm.value));
        }).addClass('money');
    },
    update: function (elm, valueAccessor, allBindingsAccessor) {
        var value =ko.utils.unwrapObservable(valueAccessor())
        $elm = $(elm),
        method = $elm.is(":input") ? "val" : "html";

        $elm[method](formatInput(value)).toggleClass('negative', value < 0);
    }
};})(jQuery);


$(function(){
var viewModel={
    Cash:ko.observable(1234.56),
    Test : ko.pureComputed(function() {
        return (self.Cash() * 10).toFixed(0);
    })
}
ko.applyBindings(viewModel);

});

【问题讨论】:

  • 请在问题中包含该示例代码的最小版本。这样,如果链接失效,这个问题对未来的访问者仍然有用。

标签: knockout.js custom-binding


【解决方案1】:

您的视图模型定义已损坏:您的代码中的任何位置都没有定义self

您需要将视图模型转换为构造函数,您现在可以在其中定义 self 以指向 this

var ViewModel = function() {
    var self = this;
    self.Cash = ko.observable(1234.56);
    self.Test = ko.pureComputed(function() {
        return (self.Cash() * 10).toFixed(0);
    });
}
ko.applyBindings(new ViewModel());

演示JSFiddle.

如果您想将对象字面量作为您的视图模型,您需要在创建视图模型后添加计算:

var viewModel = {
    Cash: ko.observable(1234.56)
}
viewModel.Test = ko.pureComputed(function () {
    return (ViewModel.Cash() * 10).toFixed(0);
});
ko.applyBindings(viewModel);

演示JSFiddle.

另见:Difference between knockout View Models declared as object literals vs functions

【讨论】:

  • 它有效,但是当我想以money 格式显示Test 时,通过将&lt;label&gt;Normal binding:&lt;/label&gt;&lt;span data-bind="text:Test" /&gt; 更改为&lt;label&gt;Normal binding:&lt;/label&gt;&lt;span data-bind="money:Test" /&gt; 我得到了同样的错误。请找到更新的 JSfiddle。 jsfiddle.net/r51ybL13/2
  • 您的计算返回一个字符串,因此value.toFixed(2).replace('-', '').split('.') 在格式输入中失败。从您计算的return (self.Cash() * 10);jsfiddle.net/mhbq49km 中返回一个数字。或者在formatInput函数中处理value为字符串的情况
猜你喜欢
  • 1970-01-01
  • 2013-10-18
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 2012-05-31
  • 1970-01-01
相关资源
最近更新 更多