Рендеринг столбцов

Кроме параметра xtype столбцы позволяют дополнительно настраивать отображение с помощью параметра renderer или рендер. Рендеры представляют собой функции, которые вызываются для каждого столбца со следующим набором параметров:

Посмотрим на примере и в качестве отправной точки возьмем пример из предыдущего раздела. Там создавали в гриде ряд столбцов. Теперь изменим объявление грида следующим образом (модель и хранилище остаются неизменными):

Ext.create('Ext.grid.Panel', {
        title: 'Пользователи',
        height: 250,
        width: 550,
		margin:10,
        store: store,
        columns: [{
           xtype:'rownumberer'
          },{
           text:'Имя',
           xtype:'templatecolumn',
           flex:1,
           dataIndex:'name',
           tpl:'<b>{name} {surname} </b>'
      },{
            header: 'Дата рождения',
            dataIndex: 'date',
            xtype:'datecolumn',
            format: 'd/m/Y',
            flex:1
        }, {
            header: 'Аватар',
            dataIndex: 'userID',
            renderer:function(v) {
                return '<img src="'+ v.toString() +'.png" />';
            },
            flex:1
        }, {
            header: 'E-mail',
            dataIndex: 'email',
            flex:1
        },{
            text:'Женат/Замужем',
            xtype:'booleancolumn',
            width:90,
            dataIndex:'married',
            trueText:'Да',
            falseText:'Нет',
            renderer: function(v,m) {
                var fontweight = v ? 'normal' : 'bold';
                v=v? 'Да' : 'Нет';
                m.style='font-weight:'+fontweight;
                return v;
            }
        },{
            xtype:'actioncolumn',
            width:40,
            items:[{
                    icon:'del.png',
                    handler:function () {}
                }]
        }],
        renderTo: Ext.getBody()
    });

В моем случае я получу следующее отображение:

Типы столбцов в ExtJS 4

Итак, что изменилось? Во-первых, был добавлен еще один столбец, который будет отображать аватар пользователя. Предположим, что за каждым пользователем у нас закреплен соответствующий аватар, название которого формируется по принципу userId+".png". Тогда мы можем отобразить их в гриде следующим образом:

{
    header: 'Аватар',
    dataIndex: 'userID',
    renderer:function(v) {
        return '<img src="'+ v.toString() +'.png" />';
    },
    flex:1
}

В функцию рендерера передается значение v. Так как у нас идет привязка к свойству dataIndex: 'userID', то данное значение будет представлять значение этого свойства. Оператор return возвращает разметку для данной ячейки в виде тега img. И при наличии соответствующих картинок все они будут отображены в гриде.

Также мы изменили еще один столбец:

		{
            text:'Женат/Замужем',
            xtype:'booleancolumn',
            width:90,
            dataIndex:'married',
            trueText:'Да',
            falseText:'Нет',
            renderer: function(v,m) {
                var fontweight = v ? 'normal' : 'bold';
                v=v? 'Да' : 'Нет';
                m.style='font-weight:'+fontweight;
                return v;
            }
        }

Здесь мы сначала устанавливаем вес шрифта, используя в тернарной операции переданное значение var fontweight = v ? 'normal' : 'bold';: если v имеет значение true - то шрифт обычной толщины, иначе шрифт жирный. Строка m.style='font-weight:'+fontweight; уже непосредственно устанавливает вес шрифта для метаданных текущей ячейки.

Еще одна строка v=v? 'Да' : 'Нет'; нужна, чтобы установить значения, а если мы ее уберем, то рендер по умолчанию будет устанавливать значения true и false.

    Поддержать сайт на родительском проекте КГБ