Измените размер Ext.form.ComboBox, чтобы соответствовать его содержанию. - PullRequest
1 голос
/ 27 апреля 2010

На форумах Ext довольно мало решений, но я не смог заставить их работать. Кажется, мне не хватает чего-то незначительного.

Мне нужно изменить размер списка, чтобы он соответствовал его содержимому при его первом создании. Мне не нужно беспокоиться об изменении его размера при изменении содержимого.

Есть ли рабочие примеры использования Extjs 3.2?

Текущий код:

var store = new Ext.data.ArrayStore({
    fields: ['view', 'value', 'defaultselect'],
    data: Ext.configdata.dataCP
});

comboCPU = new Ext.form.ComboBox({
    tpl: '<tpl for="."><div class="x-combo-list-item"><b>{view}</b><br /></div></tpl>',
    store: store,
    displayField: 'view',
    width: 600,
    typeAhead: true,
    forceSelection: true,
    mode: 'local',
    triggerAction: 'all',
    editable: false,
    emptyText: 'empty text',
    selectOnFocus: true,
    listeners: { select: AdjustPrice, change: AdjustPrice, beforeselect: function (combo, record, index) { return ('false' == record.data.disabled); } },
    applyTo: 'confelement'
});

Я также пытался удалить width: 600 и заменить его minListWidth: 600, но этот результат не помог устранить проблему. альтернативный текст http://img28.imageshack.us/img28/7665/4272010105134am.png

Ответы [ 4 ]

1 голос
/ 10 февраля 2012

Попробуйте следующее:

  1. Определить опцию списка со множеством символов
  2. Создать div и установить опцию с наибольшим количеством символов
  3. Добавить этот div к телу
  4. Получить клиентскую ширину div

Ниже кодов работает в ExtJs 3.2!

myStore = new Ext.data.Store({
 ...
listeners : {
            load: function() {
                var maxValue = "";
                var charLen = 0, maxCharLen = 0;
                var maxListWidth = 300;

                /**
                 * This is a work-around since the 'listWidth' property
                 * does not accept any values that would simulate auto-resize
                 * in reference to the category with the most characters.
                 */
                this.data.each(function(item, index, totalItems ) {
                    var nameValue = item.data['name']; // 'name' is the field name

                    if(nameValue == null || nameValue == ''){
                        // do nothing
                    }else {
                        charLen = nameValue.length;
                        if(charLen > maxCharLen){
                            maxCharLen = charLen;
                            maxValue = nameValue;
                        }
                    }
                });

                if(maxValue != ""){
                    var divEl = document.createElement('div');
                    divEl.id = 'tempEl';
                    divEl.style.display = "inline";
                    divEl.className = "x-combo-list";
                    divEl.innerHTML = maxValue;

                    document.body.appendChild(divEl);

                    // check if appended
                    divEl = document.getElementById('tempEl');
                    if(divEl) {
                        var divWidth = divEl.clientWidth;
                        if(divWidth == 0 ) {
                            divEl.style.display = "inline-block";
                            divWidth = divEl.clientWidth;
                        }

                        // the allocated width for the scrollbar at side of the list box
                        var scrollbarWidth = 30;

                        // make sure that column width is not greater than
                        if((divWidth + scrollbarWidth) > maxListWidth) {
                            maxListWidth = divWidth + scrollbarWidth;
                            myCombo.listWidth = maxListWidth; 
                        }
                        document.body.removeChild(divEl);
                    }
                }
            }
});

var myCombo = new fm.ComboBox({
 ...
});
0 голосов
/ 23 декабря 2013

Найдено здесь :

// throw this stuff in a closure to prevent
// polluting the global namespace
(function(){

    var originalOnLoad = Ext.form.ComboBox.prototype.onLoad;
    Ext.form.ComboBox.prototype.onLoad = function(){
        var padding = 8;
        var ret = originalOnLoad.apply(this,arguments);
        var max = Math.max(this.minListWidth || 0, this.el.getWidth());
        var fw = false;
        Ext.each(this.view.getNodes(), function(node){
            if(!fw){ fw = Ext.fly(node).getFrameWidth('lr'); }
            if(node.scrollWidth){ max = Math.max(max,node.scrollWidth+padding); }
        });
        if( max > 0 && max-fw != this.list.getWidth(true) ){
            this.list.setWidth(max);
            this.innerList.setWidth(max - this.list.getFrameWidth('lr'));
        }
        return ret;
    };

})();
0 голосов
/ 28 апреля 2010

width: 600 правильно, поэтому у вас должна быть другая проблема, которая не очевидна из того, что вы опубликовали. Вы можете попробовать удалить конфигурацию applyTo и вместо нее поставить renderTo: Ext.getBody(), чтобы посмотреть, связано ли это с тем, как она применяется к вашему элементу. Вы уверены, что нет другого кода, который мог бы повлиять на ширину?

0 голосов
/ 28 апреля 2010

попробовать autoWidth: true

и удалите параметр ширины

...