Number不是formatCurrency的函数

时间:2014-12-04 13:15:48

标签: knockout.js

请参阅以下代码段:

ko.bindingHandlers.currencyFormat = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {

        ko.utils.registerEventHandler(element, 'keyup', function (event) {
            var observable = valueAccessor();
            debugger;
            observable(formatInput(element.value));
            observable.notifySubscribers(5);
        });

    },
    update: function (element, valueAccessor, allBindingsAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        $(element).val(value);
    }
};

我遇到了一些问题,我无法理解为什么我将自己作为扩展器敲除FormatCurrency插件的实例。 当我在要在更改事件中格式化的字段中插入值(这将是将字段的值更新为输入的值)时,错误正在发生“数字不是函数”,因为正如我在调试中看到的那样实际上,valueAcessor创建的变量“observable”是一个数字(本例为0):

但是看到我反映我的例子,变量“observable”不是数字,如下所示:

function d(){if(0<
arguments.length)return d.Pa(c,arguments[0])&&(d.X(),c=arguments[0],d.W()),this;a.k.Jb(d);return c}

任何人都知道这段代码可能会出现什么问题?

html代码:

<input id="valorRealizado" class="form-control" data-bind='currencyFormat: ValRealizado' />

我会尝试更好地解释这个场景。在我的应用程序中,我将加载一个对象列表,在这种情况下将是“Andamentos”对象。这个对象列表来自我的Controller(我正在使用Asp.NET MVC4)。列表可能是空的或不是。在客户端应用程序中,可以逐个添加(通过“viewModel.Andamentos.push({...})”)更多项目,并单独保存每个项目。 从技术上讲,我只使用该对象两次,加载它(通过“viewModel.Andamentos(result.Andamento);”),当我向“Andamentos”添加更多元素。

1 个答案:

答案 0 :(得分:1)

valueAccessor是一个包装传递给自定义绑定的函数。

如果你传递了一个可观察的信息:

<div data-bind="currencyFormat: myProperty"></div>

==> valueAccessor = function() { return myProperty; }
    valueAccessor() is the observable

如果传递了observable的值:

<div data-bind="currencyFormat: myProperty()"></div>

==> valueAccessor = function() { return myProperty(); }
    valueAccessor() is the value of the observable

作为旁注,当需要valueAccessor中包含的值时,自定义绑定的一个好习惯是调用:

ko.unwrap(valueAccessor())
// valueAccessor() returns the value/observable depending on custom binding input
// ko.unwrap() will return the value if it has it already, otherwise will
// execute the observable to get the value.