据我所知,表单字段的模板是不可能的,这将需要翻转输入元素并显示一个div或东西,在焦点和模糊。这是可行的,但这意味着一些微调CSS。
一个更简单的选项是实施自定义valueToRaw
和rawToValue
方法,并让Ext处理值生命周期(这实际上是复杂的部分)。你仍然必须改变重点和模糊的价值,但这仍然是非常简单的。
这里是你可以建立在一个例子(见fiddle):
Ext.define('My.PercentTextField', {
extend: 'Ext.form.field.Text',
onFocus: function() {
this.callParent(arguments);
var v = this.getValue();
if (Ext.isNumeric(v)) {
this.setRawValue(this.rawToValue(v));
}
},
onBlur: function() {
this.callParent(arguments);
var v = this.getValue();
if (Ext.isNumeric(v)) {
this.setRawValue(this.valueToRaw(v));
}
},
valueToRaw: function(v) {
return Ext.isEmpty(v)
? ''
: v * 100 + ' %';
},
rawToValue: function(v) {
// cast to float
if (!Ext.isEmpty(v)) {
var pcRe = /^(\d*(?:\.\d*)?)\s*%$/,
dcRe = /^\d*(?:\.\d*)?$/,
precision = 2,
floatValue,
match;
if (match = dcRe.test(v)) { // decimal input, eg. .33
floatValue = v * 1;
} else if (match = pcRe.exec(v)) { // % input, eg. 33 %
floatValue = match[1]/100;
} else {
// invalid input
return undefined;
}
floatValue = Number.parseFloat(floatValue);
if (isNaN(floatValue)) {
return undefined;
} else {
return floatValue.toFixed(precision);
}
} else {
return undefined;
}
}
});
谢谢,这看起来像它的工作真的很好。我还添加了'getSubmitValue'的重写来处理提交。 – 2014-09-29 15:42:55