fieldLabel
我有这个问题,当字段被标记为“必填”(或allowBlank: false
)时,我需要在 a 旁边添加一个红色星号
在 ExtJS3 中,我们可以通过以下方式轻松实现此 hack Ext.layout.FormLayout
:
Ext.override(Ext.layout.FormLayout, {
getTemplateArgs: function(field) {
var noLabelSep = !field.fieldLabel || field.hideLabel;
var labelSep = (typeof field.labelSeparator == 'undefined' ? this.labelSeparator : field.labelSeparator);
if (!field.allowBlank) labelSep += '<span style="color: rgb(255, 0, 0); padding-left: 2px;">*</span>';
return {
id: field.id,
label: field.fieldLabel,
labelStyle: field.labelStyle||this.labelStyle||'',
elementStyle: this.elementStyle||'',
labelSeparator: noLabelSep ? '' : labelSep,
itemCls: (field.itemCls||this.container.itemCls||'') + (field.hideLabel ? ' x-hide-label' : ''),
clearCls: field.clearCls || 'x-form-clear-left'
};
}
});
但这在 ExtJS4 中是不可能的。FormLayout
不再适用,标签实际上是Ext.form.field.Base
通过使用名为Ext.form.Labelable
.
可悲的是,扩展Ext.form.Labelable
或覆盖Ext.form.Labelable
对我来说都不可行。扩展组件 fromExt.form.field.Base
不会收到任何影响。即使我交换了 mixins,模板仍然无法工作。
所以这里是我的解决方案,我做了一个非常苛刻的覆盖Ext.form.field.Base
,它的工作原理如下(查看我的示例)
这仅适用于 ExtJS 4.0.7。要在 ExtJS 4.0.2a 上使用它,您需要labelableRenderTpl
根据4.0.2a 中的修改/src/form/Labelable.js
(function() {
var overrides = {
labelableRenderTpl: [
'<tpl if="!hideLabel && !(!fieldLabel && hideEmptyLabel)">',
'<label id="{id}-labelEl"<tpl if="inputId"> for="{inputId}"</tpl> class="{labelCls}"',
'<tpl if="labelStyle"> style="{labelStyle}"</tpl>>',
'<tpl if="fieldLabel">{fieldLabel}{labelSeparator}</tpl>',
'<tpl if="!allowBlank"><span style="color:red">*</span></tpl>',
'</label>',
'</tpl>',
'<div class="{baseBodyCls} {fieldBodyCls}" id="{id}-bodyEl" role="presentation">{subTplMarkup}</div>',
'<div id="{id}-errorEl" class="{errorMsgCls}" style="display:none"></div>',
'<div class="{clearCls}" role="presentation"><!-- --></div>',
{
compiled: true,
disableFormats: true
}
],
/**
* @protected
* Generates the arguments for the field decorations {@link #labelableRenderTpl rendering template}.
* @return {Object} The template arguments
*/
getLabelableRenderData: function() {
var me = this,
labelAlign = me.labelAlign,
labelCls = me.labelCls,
labelClsExtra = me.labelClsExtra,
labelPad = me.labelPad,
labelStyle;
// Calculate label styles up front rather than in the Field layout for speed; this
// is safe because label alignment/width/pad are not expected to change.
if (labelAlign === 'top') {
labelStyle = 'margin-bottom:' + labelPad + 'px;';
} else {
labelStyle = 'margin-right:' + labelPad + 'px;';
// Add the width for border-box browsers; will be set by the Field layout for content-box
if (Ext.isBorderBox) {
labelStyle += 'width:' + me.labelWidth + 'px;';
}
}
return Ext.copyTo(
{
inputId: me.getInputId(),
fieldLabel: me.getFieldLabel(),
labelCls: labelClsExtra ? labelCls + ' ' + labelClsExtra : labelCls,
labelStyle: labelStyle + (me.labelStyle || ''),
subTplMarkup: me.getSubTplMarkup(),
allowBlank: me.allowBlank
},
me,
'hideLabel,hideEmptyLabel,fieldBodyCls,baseBodyCls,errorMsgCls,clearCls,labelSeparator',
true
);
}
};
//Both field.Base and FieldContainer are affected, so need to cater for.
Ext.override(Ext.form.field.Base, overrides);
Ext.override(Ext.form.FieldContainer, overrides);
})();
因此,我在所有必填字段中添加了漂亮的星号。
问题是,有没有更简单的方法来实现这样的目标?覆盖是相当苛刻的,如果我们可以使用 mixins 最好,但是 mixins 不能覆盖行为
笔记
这背后的原因是因为我已经自定义了需要从基础Text
, Combo
,扩展的字段FieldContainer
。扩展字段中的 Mixins 甚至不会与模板混淆。他们太固执了。也许目前最好的方法是重写 Base 类...查看工作示例