0

在我的代码中,我首先使用 registerEventHandler 来使用 jquery 货币插件,因此它将“€ 123,00”映射到 123,00。

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

        ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
            $(element).currency && $(element).currency("destroy");
        });
        ko.utils.registerEventHandler(element, "change", function () {
            var observable = valueAccessor();
            observable($(element).asNumber({ region: 'nl-BE' }));
        });
    },
    update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        /*snip snip*/
    }
};

现在,当我在其他地方订阅更改事件时,我仍然收到字符串而不是数字:

self.initial.subscribe(function(newValue) {
    console.log("newValue", newValue);
}, null, "change");

在 registerEventHandler 为“更改”设置断点时,我注意到它在我的订阅后被击中。

我错过了什么?

4

1 回答 1

1

您可以在绑定处理程序或作为扩展程序中使用计算来执行此操作

作为绑定处理程序

http://jsfiddle.net/mJ7Vw/

ko.bindingHandlers.currency = {
    init: function(element, accessor) {
        var computed = ko.computed(function() {
            return ko.unwrap(accessor()) +" do custom formating";
        });
        ko.applyBindingsToNode(element, { text: computed });
    }
};

作为扩展器

http://jsfiddle.net/mJ7Vw/1/

ko.extenders.currency = function(observable) {
    return ko.computed(function() {
            return observable() +" do custom formating";
        });
};
于 2014-01-27T15:27:59.420 回答