Font-Awesome ExtJS ActionColumn

时间:2014-08-29 17:50:08

标签: css ruby-on-rails extjs font-awesome

我在我的应用中使用FontAwesome和ExtJS。

当我这样做时,所有其他按钮工作正常,字体很棒:

 iconCls: 'fa fa-edit'

但是当在actioncolumn(允许你将按钮放在网格上的组件)中使用相同的配置时,图标根本不会出现。

有谁知道为什么?

修改

在尝试@qdev回答后:我只是看到了一个?#f040;呈现的文字(蓝色)。

为操作列按钮生成的HTML:

<span data-qtip="Edita registro" style="font-family:FontAwesome" class="x-action-col-icon x-action-col-glyph x-action-col-2   " title="" role="button">�xf040;</span>

CSS(取自萤火虫检查员):

element.style {
    font-family: FontAwesome;
}
*, *:before, *:after {
    box-sizing: border-box;
}
*, *:before, *:after {
    box-sizing: border-box;
}
.x-action-col-icon {
    cursor: pointer;
    height: 16px;
    width: 16px;
}
.x-border-box, .x-border-box * {
    box-sizing: border-box;
}
.x-action-col-glyph {
    color: #9bc8e9;
    font-size: 16px;
    line-height: 16px;
    width: 20px;
}
*, *:before, *:after {
    box-sizing: border-box;
}
element.style {
    text-align: center;
}
.x-grid-cell-inner-action-col {
    font-size: 0;
    line-height: 0;
}
.x-grid-cell-inner {
    white-space: nowrap;
}
.x-grid-cell {
    font: 11px/13px tahoma,arial,verdana,sans-serif;
}
.x-unselectable {
    cursor: default;
}
.x-grid-table {
    border-collapse: separate;
}
.x-unselectable {
    cursor: default;
}
.x-panel-body-default {
    color: black;
    font-size: 12px;
}
.x-panel-body-default {
    color: black;
    font-size: 12px;
}
.x-panel-body-default {
    color: black;
    font-size: 12px;
}
.x-panel-body-default {
    color: black;
    font-size: 12px;
}
.x-panel-body-default {
    color: black;
    font-size: 12px;
}
.x-panel-body-default {
    color: black;
    font-size: 12px;
}
.x-body {
    color: black;
    font-family: tahoma,arial,verdana,sans-serif;
    font-size: 12px;
}
body {
    color: #222222;
    cursor: default;
    font-family: "Helvetica Neue","Helvetica",Helvetica,Arial,sans-serif;
    font-style: normal;
    font-weight: normal;
    line-height: 150%;
}
html, body {
    font-size: 100%;
}
html, body {
    font-size: 100%;
}

5 个答案:

答案 0 :(得分:20)

这是因为网格操作列图标呈现为IMG标记,可接受图标(路径)作为选项。

为了能够使用此功能,您必须覆盖Ext.grid.column.Action *defaultRenderer*方法,以支持图标旁边的字形配置选项(在您的代码上,您可以决定使用icon {{对于任何视图上的每个操作都有1}}或img

工作(在ExtJS 5.0.1上测试,但我认为它也适用于ExtJS 4)代码用于此覆盖:

glyph

如果您不知道放置或加载它的位置,您可以在互联网上找到,但在sencha cmd生成的应用中,您只需将其放入Ext.define('MyApp.overrides.grid.column.Action', { override: 'Ext.grid.column.Action', // overridden to implement defaultRenderer: function(v, meta, record, rowIdx, colIdx, store, view){ var me = this, prefix = Ext.baseCSSPrefix, scope = me.origScope || me, items = me.items, len = items.length, i = 0, item, ret, disabled, tooltip, glyph, glyphParts, glyphFontFamily; // Allow a configured renderer to create initial value (And set the other values in the "metadata" argument!) // Assign a new variable here, since if we modify "v" it will also modify the arguments collection, meaning // we will pass an incorrect value to getClass/getTip ret = Ext.isFunction(me.origRenderer) ? me.origRenderer.apply(scope, arguments) || '' : ''; meta.tdCls += ' ' + Ext.baseCSSPrefix + 'action-col-cell'; for (; i < len; i++) { item = items[i]; disabled = item.disabled || (item.isDisabled ? item.isDisabled.call(item.scope || scope, view, rowIdx, colIdx, item, record) : false); tooltip = disabled ? null : (item.tooltip || (item.getTip ? item.getTip.apply(item.scope || scope, arguments) : null)); glyph = item.glyph; // Only process the item action setup once. if (!item.hasActionConfiguration) { // Apply our documented default to all items item.stopSelection = me.stopSelection; item.disable = Ext.Function.bind(me.disableAction, me, [i], 0); item.enable = Ext.Function.bind(me.enableAction, me, [i], 0); item.hasActionConfiguration = true; } if (glyph) { if (typeof glyph === 'string') { glyphParts = glyph.split('@'); glyph = glyphParts[0]; glyphFontFamily = glyphParts[1]; } else { glyphFontFamily = Ext._glyphFontFamily; } ret += '<span role="button" title="' + (item.altText || me.altText) + '" class="' + prefix + 'action-col-icon ' + prefix + 'action-col-glyph ' + prefix + 'action-col-' + String(i) + ' ' + (disabled ? prefix + 'item-disabled' : ' ') + ' ' + (Ext.isFunction(item.getClass) ? item.getClass.apply(item.scope || scope, arguments) : (item.iconCls || me.iconCls || '')) + '"' + ' style="font-family:' + glyphFontFamily + '"' + (tooltip ? ' data-qtip="' + tooltip + '"' : '') + '>&#' + glyph + ';</span>'; } else { ret += '<img role="button" alt="' + (item.altText || me.altText) + '" src="' + (item.icon || Ext.BLANK_IMAGE_URL) + '" class="' + prefix + 'action-col-icon ' + prefix + 'action-col-' + String(i) + ' ' + (disabled ? prefix + 'item-disabled' : ' ') + ' ' + (Ext.isFunction(item.getClass) ? item.getClass.apply(item.scope || scope, arguments) : (item.iconCls || me.iconCls || '')) + '"' + (tooltip ? ' data-qtip="' + tooltip + '"' : '') + ' />'; } } return ret; } }); 并自动加载到框架中

然后你必须调整一些CSS(我在主视口的自定义CSS中添加)。 如果没有这个,你就不会看到glyps,我想你会理解为什么要看下面的代码:

appFolder/overrides/grid/column/Action.js

我还成功地做了另一个很好的技巧:默认情况下隐藏所有行的动作图标,并仅在悬停的行/记录上显示它们。

您可以通过使用图标/字形的getClass配置函数添加.x-action-col-glyph {font-size:16px; line-height:16px; color:#9BC8E9; width:20px} .x-action-col-glyph:hover{color:#3892D3} (在较旧的ExtJS版本上可能是x-hidden-display)类来选择使用此位置,仅在您想要的视图上使用像这样:

x-hide-display

...然后仅使用CSS显示悬停/选定行的所有图标:

{
  glyph: 0xf055,
  tooltip: 'Add',
  getClass: function(){return 'x-hidden-display'}
}

我希望这可以帮助你;)

答案 1 :(得分:3)

您可以从actioncolumn项的getClass返回'fa fa-edit'类,如下所示:

{
    xtype: 'actioncolumn',
    items: [{
        getClass: function () {
            return 'x-fa fa-users';
        }
    }]
}

答案 2 :(得分:2)

我最近创建了这个新应用,可以帮助您准备可以分配给iconCls的自定义图标。它会为您的Sencha应用生成_icons.scss文件。我只用Sencha Touch进行了测试,但我认为它也适用于ExtJS。 README解释了在Ico Moon网站上创建图标的步骤,并使用该工具将Ico Moon项目文件转换为SCSS以便在Sencha中使用。它还与Sencha Architect Touch项目进行了测试。

如果您将它用于ExtJS,请告诉我它是否有效。感谢。

答案 3 :(得分:2)

我将getGlyph(类似于图标的getClass)添加到 qdev 解决方案。 这是一个非常简单的解决方案,但工作完美。

只是3行添加做qdev解决方案:

    if(Ext.isFunction(item.getGlyph)){
        glyph = item.getGlyph.apply(item.scope || scope, arguments);
    }else{
        glyph = item.glyph;
    }

完成覆盖代码:

Ext.define('corporateCms.overrides.grid.column.Action', {
    override: 'Ext.grid.column.Action',

    // overridden to implement
    defaultRenderer: function(v, cellValues, record, rowIdx, colIdx, store, view) {
        var me = this,
            prefix = Ext.baseCSSPrefix,
            scope = me.origScope || me,
            items = me.items,
            len = items.length,
            i = 0,
            item, ret, disabled, tooltip,glyph, glyphParts, glyphFontFamily;

        // Allow a configured renderer to create initial value (And set the other values in the "metadata" argument!)
        // Assign a new variable here, since if we modify "v" it will also modify the arguments collection, meaning
        // we will pass an incorrect value to getClass/getTip
        ret = Ext.isFunction(me.origRenderer) ? me.origRenderer.apply(scope, arguments) || '' : '';

        cellValues.tdCls += ' ' + Ext.baseCSSPrefix + 'action-col-cell';
        for (; i < len; i++) {
            item = items[i];

            disabled = item.disabled || (item.isDisabled ? item.isDisabled.call(item.scope || scope, view, rowIdx, colIdx, item, record) : false);
            tooltip = disabled ? null : (item.tooltip || (item.getTip ? item.getTip.apply(item.scope || scope, arguments) : null));
            if(Ext.isFunction(item.getGlyph)){
                glyph = item.getGlyph.apply(item.scope || scope, arguments);
            }else{
                glyph = item.glyph;
            }

            // Only process the item action setup once.
            if (!item.hasActionConfiguration) {
                // Apply our documented default to all items
                item.stopSelection = me.stopSelection;
                item.disable = Ext.Function.bind(me.disableAction, me, [i], 0);
                item.enable = Ext.Function.bind(me.enableAction, me, [i], 0);
                item.hasActionConfiguration = true;
            }
            if (glyph ) {

                if (typeof glyph === 'string') {
                    glyphParts = glyph.split('@');
                    glyph = glyphParts[0];
                    glyphFontFamily = glyphParts[1];
                } else {
                    glyphFontFamily = Ext._glyphFontFamily;
                }

                ret += '<span role="button" title="' + (item.altText || me.altText) + '" class="' + prefix + 'action-col-icon ' + prefix + 'action-col-glyph ' + prefix + 'action-col-' + String(i) + ' ' + (disabled ? prefix + 'item-disabled' : ' ') +
                    ' ' + (Ext.isFunction(item.getClass) ? item.getClass.apply(item.scope || scope, arguments) : (item.iconCls || me.iconCls || '')) + '"' +
                    ' style="font-family:' + glyphFontFamily + '"' +
                    (tooltip ? ' data-qtip="' + tooltip + '"' : '') + '>&#' +  glyph + ';</span>';
            } else {
                ret += '<img role="button" alt="' + (item.altText || me.altText) + '" src="' + (item.icon || Ext.BLANK_IMAGE_URL) +
                    '" class="' + me.actionIconCls + ' ' + prefix + 'action-col-' + String(i) + ' ' + (disabled ? prefix + 'item-disabled' : ' ') +
                    (Ext.isFunction(item.getClass) ? item.getClass.apply(item.scope || scope, arguments) : (item.iconCls || me.iconCls || '')) + '"' +
                    (tooltip ? ' data-qtip="' + tooltip + '"' : '') + ' />';
            }
        }
        return ret;
    }    
});

您可以像使用它一样简单:

    getGlyph: function(v, meta, rec) {
        if (rec.get('access')) {
            return 'xf067@FontAwesome';
        } else {
            return 'xf068@FontAwesome';
        }
    }, 

我希望这可以帮助你;)

答案 4 :(得分:0)

如果你在4.0 - 4.1中,看起来覆盖不起作用。我走了阻力最小的路径,只是通过http://fa2png.io/将图标设置为png格式,然后将指定的类定义为css中的背景图像网址。