我是淘汰赛的新手,仍在学习如何最好地使用它。我在一个应用程序中有一些输入字段,它们与一堆实时更新的计算相关联。他们自己的领域很好,一切都很好......
除了,我需要在用户输入时格式化输入,仅用于显示(原始数据必须保留用于计算,但 3 应显示为 3% 或在另一个字段中 3000000 应显示为 3,000,000 等)。我有这个工作,但我认为我的解决方案存在一个重大缺陷,因为结果始终存在错误,并且有可能完全破坏输入字段。
因此,一个输入字段的示例,它与另一个字段相关,始终等于 100%:
<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;
};
所以,这里发生的情况是,用户输入的第一个字符格式正确,用户输入的第二个字符消失了,第三个加入第一个字符并正确格式化。如果字段是计算的或常规的 observable,也会发生同样的情况,并且计算的代码在没有应用扩展的情况下工作正常。因此,要输入 77%,您必须输入 7 - X - 7(其中 X 可以是任何值,因为它会在某个地方丢失到进程中)。
还应该注意的是,我在这个应用程序中使用了一个虚拟的 javascript 数字键盘,所以我通过 javascript 添加值(虽然这并没有影响任何其他功能,所以我不确定为什么会在这里)。
任何人都可以就我做错了什么提供建议吗?我错过了什么导致输入如此错误?我真的决定不放弃这种实时输入格式的概念,因为它可以使演示更加清晰,但是如果必须,我将仅在模糊上进行格式设置。
在此先感谢您的任何建议。