私はノックアウトに慣れていないので、それをうまく処理する方法をまだ学んでいます。アプリには、リアルタイムで更新される一連の計算に関連付けられている入力フィールドがいくつかあります。フィールド自体はうまく機能し、すべて問題ありません...
例外として、ユーザーが入力した入力を表示専用にフォーマットする必要があります (生データは計算のために保持する必要がありますが、3 は 3% として表示されるか、別のフィールドでは 3000000 は 3,000,000 などとして表示される必要があります)。これはある程度機能していますが、結果が一貫してバグであり、入力フィールドを完全に壊す可能性があるため、私のソリューションには大きな欠陥があると思います。
したがって、常に 100% になるように別のフィールドに関連付けられている入力フィールドの 1 つの例を次に示します。
<input id='sm' data-bind='textInput: s_smixe' readonly='true'>
にバインドされています:
self.s_smixebase = ko.observable(30);
self.s_smixe = ko.pureComputed({
read: function(){
return this.s_smixebase();
},
write: function(value){
if (parseFloat(value)<100) {
var otherValue = 100 - parseFloat(value);
this.s_smixebase(value);
this.s_rmixebase(otherValue);
} else {
value = 100;
this.s_smixebase(value);
this.s_rmixebase(0);
}
},
owner: this
}).extend({percent:{}});
self.s_smixeraw = self.s_smixe.raw;
次に、次のように拡張されます。
ko.extenders.percent = function(target) {
var raw = ko.observable();
var result = ko.computed({
read: function() {
var value = target();
if (value.toString().indexOf('%')===-1){
raw(parseFloat(value));
value = value + '%';
return value;
} else {
value = value.replace('%','');
raw(parseFloat(value));
value = value + '%';
return value;
}
},
write: target
}).extend({notify:'always'});
result.raw = raw;
return result;
};
したがって、ここで何が起こるかというと、ユーザーが最初に入力した文字は正しく書式設定され、ユーザーが入力した 2 番目の文字は消え、3 番目は最初の文字と結合して正しく書式設定されます。これは、フィールドが計算された場合または通常のオブザーバブルである場合と同じように発生し、計算されたコードは拡張を適用しなくても正常に機能します。したがって、77% を入力するには、7 - X - 7 と入力する必要があります (X は、プロセスのどこかで失われるため、任意の値にすることができます)。
また、このアプリでは仮想 JavaScript 数値キーボードを使用しているため、JavaScript を介して値を追加していることにも注意してください (ただし、これは他の機能には影響していないため、ここで追加する理由はわかりません)。
私が間違っていることについて誰かが提案できますか? 入力が非常にバグる原因となっているのは何ですか? 私は、このリアルタイム入力フォーマットの概念を捨てないことを強く決意していますが、そうする必要がある場合は、ぼかしをフォーマットするだけです。
ご提案いただきありがとうございます。