Как установить ширину метки на отдельные метки полей в extjs?
со следующим кодом:
var win = new Ext.Window({
xtype: 'form',
layout: 'form',
items: [{
xtype: 'textfield',
value: 'test',
name: 'testing',
labelWidth: 200,
fieldLabel: 'This is a really, really long label here',
labelStyle: 'white-space: nowrap;'
}]
}).show();
Этот текст ярлыка перекрывает раздел ввода (извините, недостаточно очков репутации для публикации изображения).
Я пробовал использовать css с различными комбинациями: 'cls', 'labelStyle', 'style' и 'width', но все они, кажется, игнорируются (по крайней мере, с точки зрения правильной установки ширины меток).
Я добавляю элементы в форму динамически, и мне нужна индивидуальная ширина меток для каждого элемента. На других элементах я не хочу, чтобы пространство 100px по умолчанию было зарезервировано для метки - я хочу меньше. Возможно ли это со стандартным текстовым полем, или мне нужно создать пользовательский компонент только для этого?
Спасибо за предоставленную информацию.
Ответы
Ответ 1
labelWidth
является конфигурацией FormPanel
, а не Field
. Он отображается и контролируется на уровне макета формы, а не на уровне каждого отдельного поля. Сам элемент метки не имеет ничего общего с макетом контейнера поля - если вы посмотрите на разметку, метка плавает, а поле, содержащее div, имеет левое заполнение, которое дает "ширину метки", которую вы пытаетесь контролировать, Это дополнение добавляется в код (по макету) в виде динамического стиля в .x-form-element
, который обертывает ввод. Чтобы переопределить, вам придется либо переопределить код макета (не тривиально), либо использовать класс !important
, который переопределяет дополнение для каждого поля (используя ваш идентификатор поля или пользовательский cls
, который вы применяете).
Тем не менее, ширина меток должна быть одинаковой, эстетически говорящей. Не знаете, почему вы хотели бы разорвать это соглашение?
Ответ 2
Если вам действительно нужно это сделать, самый простой способ - это определить панель вместо поля формы и использовать ее в качестве контейнера для чего-то другого.
{
xtype: 'form',
layout: 'form',
labelWidth: 100,
items: [
// {some fields with labelWidth=100},
{
xtype: 'panel',
layout: 'form',
labelWidth: 200,
items: [
xtype: 'textfield',
value: 'test',
name: 'testing',
fieldLabel: 'This is a really, really long label here',
labelStyle: 'white-space: nowrap;'
]
}
// {some fields with labelWidth=100}
]
}
Ответ 3
В конце концов, у вас есть возможность взломать afterRender поля:
afterRender: function() {
<PARENT>.prototype.afterRender.call(this);
this.adjustCustomLabelWidth(300);
},
adjustCustomLabelWidth: function(w) {
this.el.parent('.x-form-item').child('.x-form-item-label').
setStyle('width', w);
this.el.parent('.x-form-element').setStyle('padding-left', w + 5);
this.ownerCt.on('afterlayout', function() {
this.el.setStyle('width', this.el.getWidth() - w + 100);
}, this, {single: true})
},
Ответ 4
Я пробую это после нескольких классов CSS, чтобы выполнить ту же работу,
Я удалил все css после этого, работает как шарм.
{
xtype: 'whatever-with-a-field-label',
name: 'veryMeaningFullName',
fieldLabel: 'very long description to show above a tiny text field',
labelStyle: 'width:400px; white-space: nowrap;',
//could use width:100% if you want
maxWidth: 20
}
Ответ 5
Я просто установил labelWidth в пустую строку, и пусть
браузер для выполнения своей работы.; -)
{
id: 'date0'
,fieldLabel: 'Start'
,labelWidth: ''
,xtype: 'datefield'
,emptyText: 'Select a start date'
,value: Ext.Date.add(new Date(), Ext.Date.DAY, -_duration)
// ,width: 100
}