是否可以使用具有屏蔽输入的KnockoutJS?

Pau*_*aul 10 maskedtextbox knockout.js

我正在使用该插件:https://github.com/plentz/jquery-maskmoney来格式化我的钱编辑器...

我尝试在该编辑器中使用KnockoutJS,但它不起作用......没有那个掩码一切正常......

我的代码测试很简单:

<input id="Price" data-bind="value: Price"  type="text"  name="Price"> 
Run Code Online (Sandbox Code Playgroud)

Javascript to Mask输入

$("#Price").maskMoney({ symbol: 'R$ ', showSymbol: true, thousands: '.', decimal: ',', symbolStay: false });
Run Code Online (Sandbox Code Playgroud)

和KnockoutJS

var ViewModel = function () {
            this.Price = ko.observable();

            this.PriceFinal= ko.computed(function () {
                return this.Price() 
            }, this);
        };

        ko.applyBindings(new ViewModel()); 
Run Code Online (Sandbox Code Playgroud)

Tom*_*all 14

您还可以使用Knockout注册MaskMoney的绑定处理程序,例如:

$(document).ready(function () {

ko.bindingHandlers.currencyMask = {
    init: function (element, valueAccessor, allBindingsAccessor) {
        var options = allBindingsAccessor().currencyMaskOptions || {};
        $(element).maskMoney(options);

        ko.utils.registerEventHandler(element, 'focusout', function () {
            var observable = valueAccessor();

            var numericVal = parseFloat($(element).val().replace(/[^\.\d]/g, ''));
            numericVal = isNaN(numericVal) ? 0 : numericVal;

            observable(numericVal);
        });

        ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
            $(element).unmaskMoney();
        });
    },

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

        $(element).val(value);
        $(element).trigger('focus');
    }
};
Run Code Online (Sandbox Code Playgroud)

});

然后作为你的约束力:

<input type="text" data-bind="currencyMask: MyModel.TotalCost, currencyMaskOptions: { symbol: '$', showSymbol: true, thousands: ',', precision: 0 }" />
Run Code Online (Sandbox Code Playgroud)

请注意,我稍微调整了MaskMoney插件,input.on('focusout.maskMoney', blurEvent);而不是input.bind('blur.maskMoney',blurEvent);因为它没有触发通过鼠标点击失去焦点的更新,仅在标签上.

我是Knockout的新手,并且已经发现绑定处理程序方法对于像这样的插件和datepickers等非常好.


Tom*_*ghe 11

您应该使用可写的计算可观察量.

function MyViewModel() {
    this.price = ko.observable(25.99);

    this.formattedPrice = ko.computed({
        read: function () {
            return '$' + this.price().toFixed(2);
        },
        write: function (value) {
            // Strip out unwanted characters, parse as float, then write the raw data back to the underlying "price" observable
            value = parseFloat(value.replace(/[^\.\d]/g, ""));
            this.price(isNaN(value) ? 0 : value); // Write to underlying storage
        },
        owner: this
    });
}

ko.applyBindings(new MyViewModel());
Run Code Online (Sandbox Code Playgroud)