【问题标题】:ExtJs gridPanel Dynamic Cell Background colour from Record.Data来自 Record.Data 的 ExtJs gridPanel 动态单元格背景颜色
【发布时间】:2013-11-11 17:33:11
【问题描述】:

我正在使用 PHP 中的 ExtJs 4.2,创建一个带有存储的网格,该存储从 SQL 数据库读取信息以填充行。其中一列与行的状态(打开、关闭等)相关,另一列与之前代码中应用于表格单元格背景颜色的十六进制颜色值相关。

我已经阅读了有关使用相关列上的渲染器配置选项来应用包含所需颜色的 CSS 类(在单独的 CSS 文件中和作为原始文本),但我正在处理特定颜色作为行数据的一部分检索。

我认为下面的列的代码可以工作,但它没有。

如何获得此功能?许多示例都使用“if”逻辑来确定要渲染的颜色,但我只需要渲染商店数据中提供的一种颜色。拥有类列表是不可取的,因为这些颜色可能会在数据库中更改,或者可能会添加新状态;最好从数据中调用颜色值。

{text: "Status",
 sortable: true,
 width:100,
 dataIndex: 'Status',
 renderer: function(value, meta, record){
                    meta.attr = 'style="color:#'record.data.StatusColour'"';
                    return value;
    }
}

编辑:

Ext.onReady(function(){
    //Define the model
    Ext.define('CaseModel', {
        extend: 'Ext.data.Model',
        proxy: {
            type: 'ajax',
            reader: 'json'
        },
        fields: [
            'Id',
            'Project',
            'Status',
            'StatusColour',
        ]
    });

    // create the Data Store
    var caseStore = Ext.create('Ext.data.Store', {
        model: 'CaseModel',
        autoLoad: true,
        proxy: {
            // load using HTTP
            type: 'ajax',
            url: '<?= $site_url ?>Case/JSON/All',
            reader: {
                type: 'json',
                model: 'CaseModel',
                root: 'data'
            }
        },
        remoteSort: true,
        pageSize: 20
    });

    //Render grid
    Ext.create('Ext.grid.Panel', {
        width: 800,
        store: caseStore,
        title: 'Cases',
        columns: [
            {text: "ID", sortable: true, width: 25, dataIndex: 'Id'},
            {text: "Project", sortable: true, width: 100, dataIndex: 'Project'},
            {text: "Status", sortable: true, width:100, dataIndex: 'Status'
            // renderer goes here
            /*
            , renderer: function(value, meta, record) {
                meta.style = 'background-color: ' + record.get('StatusColour');
                return value;
            }
            */
            },
            {text: 'Details', xtype: 'templatecolumn', width: 50, tpl: '<a class=\"link_btn\" href=\"<?php echo site_url()?>Case/View/{Id}\">Open</a>'}
        ],
        renderTo: Ext.get('CaseGrid'),
        dockedItems: [{
            xtype: 'pagingtoolbar',
            dock: 'bottom',
            itemId: 'PagingToolbar',
            displayInfo: true,
            store: caseStore
        }],
        features: [
            {ftype: 'grouping'}
        ]
    });
});

//Sample JSON data
{
    "total":"17",
    "data":
    [
        {"Id":"64","Project":"test case 1","Status":"New","StatusColour":"ffffff"},
        {"Id":"49","Project":"fgdfgdfgdfg","Status":"New","StatusColour":"ffffff"},
        {"Id":"65","Project":"test case 2","Status":"New","StatusColour":"ffffff"},
        {"Id":"50","Project":"abc","Status":"New","StatusColour":"ffffff"},
        {"Id":"51","Project":"aaaa","Status":"New","StatusColour":"ffffff"},
        {"Id":"67","Project":"test case 4","Status":"New","StatusColour":"ffffff"},
        {"Id":"52","Project":"fffffff","Status":"New","StatusColour":"ffffff"},
        {"Id":"37","Project":"ghfdgh","Status":"New","StatusColour":"ffffff"},
        {"Id":"53","Project":"ddddddddd","Status":"New","StatusColour":"ffffff"},
        {"Id":"29","Project":"Suppress 0 value line items to SOP","Status":"Open","StatusColour":"6dce6d"},
        {"Id":"66","Project":"test case 3","Status":"Open","StatusColour":"6dce6d"},
        {"Id":"16","Project":"Egress locks","Status":"Postponed","StatusColour":"cd7ddb"},
        {"Id":"63","Project":"Public Comment2","Status":"Duplicated","StatusColour":"bf6161"},
        {"Id":"30","Project":"Nominal codes for Stock items","Status":"Duplicated","StatusColour":"bf6161"},
        {"Id":"17","Project":"Details missing","Status":"Closed","StatusColour":"777777"},
        {"Id":"18","Project":"Non-standard finish not priced","Status":"Closed","StatusColour":"777777"},
        {"Id":"19","Project":"POA and VAT Rate","Status":"Closed","StatusColour":"777777"}
    ]
}

【问题讨论】:

    标签: css extjs gridpanel


    【解决方案1】:

    参考文档,renderer的参数“meta”支持以下属性:tdCls、tdAttr、style。

    所以在你的情况下,风格是合适的:

    {
        text: "Status",
        sortable: true,
        width: 100,
        dataIndex: 'Status',
        renderer: function(value, meta, record) {
            meta.style = 'background-color: #' + record.get('StatusColour');
            return value;
        }
    }
    

    【讨论】:

    • 不幸的是,这对我不起作用。检查代码不会在 FireBug 中显示任何特定错误,除了当鼠标悬停在具有应用渲染器的单元格上时出现“b.getRowStyleTableEl(...) is null”错误。看起来好像没有找到 StatusColour,我从 JSON 响应中知道它存在;确保将值转换为字符串以正确显示的最佳方法是什么,或者至少检查该值是否来自对网格的响应?
    • 尝试将console.log(record);debugger; 添加到渲染器并检查record.data 的内容。如果 StatusColour 为空,我认为上面的代码不会引发 JavaScript 错误,但您也可以尝试在应用 meta.style 之前添加一个条件(无论如何,这可能是一个好主意,以确保只生成有效的样式代码所有情况)。
    • 我放入了console.log(record),它会拉取整个请求集;从服务器返回的 JSON 具有“总计”和“数据”设置; console.log(record.data) 更有意义,因为它显示了记录的信息,但是将 record.get('StatusColour') 更改为 record.data.get('StatusColour') 会阻止列和后续列的呈现。如果不深入到 JSON 中,我将如何获取 record.data.StatusColour 值?
    • record.get('StatusColour') 等价于 record.data['StatusColour']record.data.StatusColour。试着检查一下。如果它为 null 或空字符串甚至未定义,那么您的商店、模型(映射)或服务器数据可能有问题。在此处添加您的商店和模型定义以及 JSON 数据示例以供进一步分析也可能会有所帮助。
    • 我添加了存储和模型代码以及示例 JSON 数据,以及现有的网格。 JSON 数据是从页面的 Firebug 控制台 GET 请求响应中提取的,这表明它正在检索每行的颜色符号,它只是没有被网格看到 - “背景颜色:”显示在样式部分当我在 Firebug 中检查单元格时。
    猜你喜欢
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 2017-09-17
    • 2013-06-21
    • 2022-12-12
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多