autoNumericとKnockoutを使用した数値のマスキング

一般的に、リピーター上に構築されたコントロールの1つを書き換えて、クライアントに対してより簡単で応答性の高いものにするタスクに直面しました。 彼はノックアウトを使用することにしました。 内部では、DevExpressテキストフィールドはデジタルデータの表示に使用され、非常に便利で適切に提供されていますが、疑問が生じましたが、通常のテキストフィールドに置き換えてマスクを追加できます。







開始する





この問題を解決するために、問題を迅速かつ簡単に解決できる通常のjqueryプラグインまたはライブラリを探し始めました。 その結果、2つのライブラリが見つかりました。







分析





ライブラリの機能を見ると、入力マスクを表示するのではなく、その場で入力値を処理する機能があるため、 autoNumericを使用すると断言できます。 その動作は、DevExpressテキストフィールドの動作に似ています。 残念ながら、 jquery.maskedinputプラグインはこの可能性を発見しませんでした。 テキストフィールドに表示される厳密なマスクを使用してデータを入力する可能性があり、今後の入力形式についてユーザーに通知します。 私の場合、このような処理は適切ではありません。



申込み





さて、テキストフィールドのデータ用のマスキングライブラリを選択して、私は決定しましたが、ここでフィールドのマスクをどのように結び付けるかを示します。 最初は、単一の入力形式、特定のクラスを使用するすべての必要なフィールドを設定し、jqueryを使用してautoNumericライブラリにフィードするというアイデアがありました。 しかし、この解決策はあまり便利ではないように思えました。

それから、ノックアウトの力を使ってみませんか! ノックアウトを使用すると、データバインディング用のカスタムハンドラーを実装できるため、このようなハンドラーを作成し、 data-bind=""



属性で指定することにしました。



autoNumericについて少し




問題を解決するために私が使用したいくつかの有用な方法の価値を示します。







パラメーターとしてautoNumeric()



メソッドに渡されるオプションの値を指定します。







autoNumericを構成するための転送の例(使用するオプション):



 $('.autonum').autoNumeric({ aSep: ',', aDec: '.', mDec: 0 });
      
      







*これは、 autoNumericが数百の整数部分と「。」の区切り文字に「、」を使用することを意味します。 小数部の区切りとして。 また、分数区切りの後の桁数は0になります(つまり、整数が表示されます)。



ノックアウトを使用した実装




autoNumericのカスタムデータバインディングハンドラーの実装




  ko.bindingHandlers.numberMaskedValue = { init: function(element, valueAccessor, allBindingsAccessor) { //  ,    , //     var options = allBindingsAccessor().autoNumericOptions || { aSep: ',', aDec: '.', mDec: 0 }; // html       $(element).autoNumeric(options); //   'focusout' , //     observable  ko.utils.registerEventHandler(element, 'focusout', function() { var observable = valueAccessor(); //        value = $(element).autoNumericGet(); observable(isNaN(value) ? 0 : value); }); }, update: function(element, valueAccessor) { var value = ko.utils.unwrapObservable(valueAccessor()); //   ,   ,  $(element).autoNumericSet(value); } };
      
      







上記の実装により、このハンドラーを次のように使用できます。



 <input type="text" data-bind="numberMaskedValue: countOfFriends"/>
      
      







またはオプション付き:



 <input type="text" data-bind="numberMaskedValue: countOfFriends, autoNumericOptions:{aSep: ',', aDec: '.', mDec: 3}"/>
      
      







このハンドラーの例では、値の更新は「focusout」イベントで発生します。 ユーザーにとって、入力された値は美しく見えますが、実際に観察可能なプロパティでは、算術処理に適したままです。 したがって、必要な(転送)コントロールautoNumericのバインドと、監視可能なプロパティの値の転送(更新)という2つの問題をすぐに解決できます。



完全なサンプルコード
HTML




 <div data-bind="foreach: humans"> <div class="block-of-data"> <div> <label class="label label-info">id</label> <span data-bind="text: id"></span> </div> <div> <label class="label label-info">Name</label> <span data-bind="text: name"></span> </div> <div> <label class="label label-info">Count of friends</label> <input type="text" data-bind="numberMaskedValue: countOfFriends"/> </div> <div> <label class="label label-interest">Real value "Count of friends"</label> <span data-bind="text: countOfFriends"></span> </div> </div> <div>
      
      







Javascript




 $(function() { ko.bindingHandlers.numberMaskedValue = { init: function(element, valueAccessor, allBindingsAccessor) { var options = allBindingsAccessor().autoNumericOptions || { aSep: ',', aDec: '.', mDec: 0 }; $(element).autoNumeric(options); ko.utils.registerEventHandler(element, 'focusout', function() { var observable = valueAccessor(); value = $(element).autoNumericGet(); observable(isNaN(value) ? 0 : value); }); }, update: function(element, valueAccessor) { var value = ko.utils.unwrapObservable(valueAccessor()); $(element).autoNumericSet(value); } }; function Human(idv, namev, countOfFriendsv) { var id = ko.observable(idv), name = ko.observable(namev), countOfFriends = ko.observable(countOfFriendsv); return { id: id, name: name, countOfFriends: countOfFriends } } function HumansModel() { humans = ko.observableArray([new Human(1,'Alex', 1234), new Human(2,'Bob',12457)]); } ko.applyBindings(new HumansModel()) });
      
      







Css




 .block-of-data{ border: solid 1px black; margin:10px; padding: 5px; background-color:#ffffaa; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px; } .label { padding: 1px 4px 2px; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } .label { font-size: 10.998px; font-weight: bold; line-height: 14px; color: white; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); white-space: nowrap; vertical-align: baseline; background-color: #999; } .label-info { background-color: #3A87AD; } .label-interest { background-color: #ff7722; }
      
      











参照資料







ご清聴ありがとうございました!



All Articles