17

私はこの投稿を見てきました- それは1つの可能な解決策を示しています. しかし、マスクされた入力を行うためのよりエレガントな方法が必要です。

また、ノックアウト検証プラグイン (または拡張) とうまく連携する必要があります。

似たようなプロジェクトがあることを知っている人はいますか?

4

5 に答える 5

2

そのリンクの回答からコードを取得し、エクステンダーに入れるだけです(フリーハンドで書かれているため、エラーが発生する可能性があります)

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

編集:マスクをUSDなどにハードコードするのではなく、オプションとして提供することをお勧めします

更新: riceboylerの回答のマスクプラグインを使用したいが、エクステンダーを使用する場合

ko.extenders.mask = function(observable, mask) {
    observable.mask = mask;
    return observable;
}


var orgValueInit = ko.bindingHandlers.value.init;
ko.bindingHandlers.value.init = function(element, valueAccessor) {
    var mask = valueAccessor().mask;
    if(mask) {
        $(element).mask(mask);
    }

    orgValueInit.apply(this, arguments);
}

http://jsfiddle.net/rTK6G/

于 2012-11-28T13:03:17.800 に答える
2

最初の回答を使用しようとしましたが、ko.validation プラグインでは機能しませんでした。検証エラーが表示されませんでした。

もう少し直感的な ko バインダーが欲しかったのです。これが私の解決策です。jquery.inputmask プラグインを使用しています。値が入力されていない場合は、ビューモデルのプロパティも消去します。

    ko.bindingHandlers.mask = {
        init: function (element, valueAccessor, allBindingsAccessor, viewModel,     bindingContext) {
            var mask = valueAccessor() || {};
            $(element).inputmask({ "mask": mask, 'autoUnmask': false });
            ko.utils.registerEventHandler(element, 'focusout', function () {
                var value = $(element).inputmask('unmaskedvalue');            
                if (!value) {
                    viewModel[$(element).attr("id")]("");                
                }
            });
        }
    };

使用法は次のとおりです。

<input type="text" data-bind="value: FEIN, mask: '99-9999999'" id="FEIN" >
于 2013-06-14T16:25:23.793 に答える
0

この自家製のソリューションを使用できます。私にとっては完璧に機能します。

私の Binding ノックアウト コールは、ネットからインスピレーションを得てマスクされたもので、管理言語を追加し、別のイベントから更新しました。また、基本的に使用するためにこのjsライブラリを使用します: https://plugins.jquery.com/maskedinput/

私のバインディングで「allBindingsAccessor().mask」という用語を確認できます。これはライブラリー maskedinput からのものです。

 ko.bindingHandlers.masked = {
    init: function (element, valueAccessor, allBindingsAccessor) {
        var mask = allBindingsAccessor().mask || {},
        getCaretPosition,
        setCaretPosition;

        // Permet d'obtenir la position du curseur
        getCaretPosition = function getCaretPosition(element) {
            // Initialise la position
            var caretPos = 0, sel;

            // IE 
            if (document.selection) {
                // Donne le focus à l'élément
                element.focus();
                // Afin d'obtenir la position du curseur
                sel = document.selection.createRange();
                // On place le curseur à 0
                sel.moveStart('character', -element.value.length);
                caretPos = sel.text.length;
            }
                // Firefox 
            else if (element.selectionStart || element.selectionStart === '0') {
                caretPos = element.selectionStart;
            }
            return (caretPos);
        };

        // Permet de définir la position du curseur en fonction d'une position donnée
        setCaretPosition = function setCaretPosition(element, pos) {
            var range;
            if (element.setSelectionRange) {
                element.focus();
                element.setSelectionRange(pos, pos);
            }
            else if (element.createTextRange) {
                range = element.createTextRange();
                range.collapse(true);
                range.moveEnd('character', pos);
                range.moveStart('character', pos);
                range.select();
            }
        };

        // Définition du masque inséré dans le champ
        if (configSvc.culture === "fr-FR") {
            // Cas francais
            $(element).mask("99/99/9999", { placeholder: "JJ/MM/AAAA" });
        }
        else {
            // Cas anglophone
            $(element).mask("99/99/9999", { placeholder: "MM/DD/YYYY" });
        }

        // On capte l'événement d'appuie sur une touche 
        ko.utils.registerEventHandler(element, 'keypress', function () {
            var observable = valueAccessor(),
                position;
            // Afin de résoudre le pb de déplacement du curseur a la fin du mask lors de la mise à jour de l'observable knockout
            if ($(element).val().length === 10) {
                // On récupère la dernière position
                position = getCaretPosition(this);
                // On met à jour la valeur de l'obersable (en cas de sauvegarde) 
                observable($(element).val());
                // On force la position du curseur apres mise à jour de l'observable à la derniere position récupéré
                setCaretPosition(this, position);
            }
        });

        // On capte l'événement de perte de focus pour mettre l'obersable à jour
        ko.utils.registerEventHandler(element, 'blur', function () {
            var observable = valueAccessor();
            observable($(element).val());
        });

        // On capte l'événement change pour mettre l'obersable à jour
        ko.utils.registerEventHandler(element, 'change', function () {
            var observable = valueAccessor();
            observable($(element).val());
        });
    },
    update: function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        $(element).val(value);
    }

};

私のhtmlページでは、この観察可能な「マスクされた」を使用しています:

<input type="text" id="head-birthDate" class="form-control" data-bind="masked: birthDate" />

最後に私のjsで:

birthDate は単なる観測可能なものです

this.birthDate = ko.observable();
于 2015-05-07T13:50:55.280 に答える