據我所知,表單字段的模板是不可能的,這將需要翻轉輸入元素並顯示一個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