自定义组件未显示在Ext.panel.Panel上

时间:2013-12-13 00:12:16

标签: extjs extjs4.1

我扩展了一个组件,我无法将其渲染到面板。似乎我错过了一些非常基本的东西,因为Chrome中的调试器实际上显示该面板有数据,它只是没有出现。

以下是fiddle,以下是代码的一部分:

自定义组件:

Ext.define('StoplightControl', {
    extend: 'Ext.draw.Component',
    alias: 'widget.Stoplight',
    constructor: function (config) {
        this.initConfig(config);
        this.callParent(arguments);
    },
    initComponent: function () {
        var kpiData; // = Ext.data.StoreManager.get('KPIStore').getById(this.model.get('KPI_ID'));
        if (typeof (kpiData) === 'undefined' || kpiData == null) {
            kpiData = Ext.create('KPIModel', {
                ControlBackground: '#000000',
                Caution_label: 'On',
                Good_label: 'Ahead',
                Poor_label: 'Behind',
                Good_color: '#00FF00',
                Poor_color: '#ff0000',
                Caution_color: '#550000',
                Header: 'Test'
            });
        }
        this.setGradients(kpiData.get('ControlBackground'));
        this.drawItems(this.model, kpiData);
    },
    setGradients: function (controlColor) {
        this.gradients = [{
            id: 'middleGradient',
            angle: 180,
            stops: {
                0: {
                    color: controlColor,
                    opacity: 1
                },
                50: {
                    color: controlColor,
                    opacity: .6
                },
                100: {
                    color: controlColor,
                    opacity: 1
                }
            }
        }, {
            id: 'lightGradient1',
            angle: -90,
            stops: {
                0: {
                    color: '#ffffff',
                    opacity: 0.01
                },

                100: {
                    color: '#ffffff',
                    opacity: .8
                }

            }
        }]
    },
    drawItems: function (model, kpiData) {
        var cautionValueX = -22.5 * (model.get('cautionValue').toString().length) + 227.5,
            goodValueX = -22.5 * (model.get('goodValue').toString().length) + 227.5,
            poorValueX = -22.5 * (model.get('poorValue').toString().length) + 227.5,

            maxLineLength = 15,
            changeOfY = -50,

            cautionLabel = linebreaks(kpiData.get('Caution_label'), maxLineLength),
            goodLabel = linebreaks(kpiData.get('Good_label'), maxLineLength),
            poorLabel = linebreaks(kpiData.get('Poor_label'), maxLineLength),

            cautionChangeY = (cautionLabel.split("\n").length - 1) * changeOfY,
            goodChangeY = (goodLabel.split("\n").length - 1) * changeOfY,
            poorChangeY = (poorLabel.split("\n").length - 1) * changeOfY,
            headerFontSize = '100px arial,sans-serif',
            textFontSize = '80px arial,sans-serif';

        var drawItems = [{
            type: 'rect',
            x: 1.6620979,
            y: 52.362183,
            radius: 90,
            width: 448.10959,
            height: 1000,
            fill: 'url(#middleGradient)',
            stroke: 'none'
        }, {
            type: "circle",
            radius: 140,
            x: 224,
            y: 896,
            stroke: "#000000",
            'stroke-width': 1,
            fill: kpiData.get('Good_color')
        }, {
            type: "circle",
            x: 224,
            y: 214,
            radius: 140,
            stroke: "#000000",
            'stroke-width': 1,
            fill: kpiData.get('Poor_color')
        }, {
            type: "circle",
            x: 224,
            y: 555,
            radius: 140,
            stroke: "#000000",
            'stroke-width': 1,
            fill: kpiData.get('Caution_color')
        }, {
            type: "text",
            id: "svg-stoplight-poorValue",
            text: model.get('poorValue'),
            x: poorValueX,
            y: 220,
            fill: "Black",
            font: textFontSize
        }, {
            type: "text",
            id: "svg-stoplight-cautionValue",
            text: model.get('cautionValue'),
            x: cautionValueX,
            y: 560,
            fill: "Black",
            font: textFontSize
        }, {
            type: "text",
            id: "svg-stoplight-goodValue",
            text: model.get('goodValue'),
            x: goodValueX,
            y: 900,
            fill: "Black",
            font: textFontSize
        }, {
            type: "text",
            id: "svg-stoplight-poorLabel",
            text: poorLabel,
            x: 500,
            y: 220 + poorChangeY,
            fill: "Black",
            font: textFontSize
        }, {
            type: "text",
            id: "svg-stoplight-cautionLabel",
            text: cautionLabel,
            x: 500,
            y: 560 + cautionChangeY,
            fill: "Black",
            font: textFontSize
        }, {
            type: "text",
            id: "svg-stoplight-goodLabel",
            text: goodLabel,
            x: 500,
            y: 900 + goodChangeY,
            fill: "Black",
            font: textFontSize
        }, {
            type: "text",
            id: "svg-stoplight-headerLabel",
            text: kpiData.get('Header'),
            x: 145,
            y: -40,
            fill: "Black",
            font: headerFontSize
        }, {
            type: "text",
            id: "svg-stoplight-totalLabel",
            text: "Total = " + model.get('total'),
            x: 100,
            y: 1250,
            fill: "Black",
            font: textFontSize
        }];

        //don't add gradients if IE is > 10 or documentMode is less than 9
        if (!(ie > 10 || document.documentMode < 9)) {
            drawItems.push({
                type: "ellipse",
                id: 'test1',
                radiusX: 112,
                radiusY: 80,
                x: 224,
                y: 156,
                fill: 'url(#lightGradient1)'
            }, {
                type: "ellipse",
                radiusX: 112,
                radiusY: 80,
                x: 224,
                y: 498,
                fill: 'url(#lightGradient1)'
            }, {
                type: "ellipse",
                radiusX: 112,
                radiusY: 80,
                x: 224,
                y: 838,
                fill: 'url(#lightGradient1)'
            });
        }

    },
    width: 210,
    height: 250
});

创建Panel并添加组件:

var displayPanel = Ext.create('widget.panel', {
    width: 600,
    height: 800,
    title: 'Cost & Schedule Variance',
    renderTo: 'WorkstreamStoplights',
    pack: 'center',
    shrinkWrap: 3,
    layout: {
        type: 'table',
        column: 2
    },

});

stoplightStore.each(function (model, idx) {
    var stoplight = Ext.create('StoplightControl', {
        model: model
    });
    displayPanel.add(stoplight);
});

displayPanel.doLayout();

正如您可以从小提琴中看到的那样,标题显示正确,我甚至在创建displayPanel时添加了一个项目,但执行.add()似乎没有即使使用.doLayout()

也会产生任何影响

2 个答案:

答案 0 :(得分:0)

Haven已经涉足ExtJS很长一段时间了,但4.2 doc说明了this方法:

  

每当您更改此内容时,都需要调用此方法   需要重新计算组件布局的组件。

答案 1 :(得分:0)

啊,傻,我。我需要在组件中添加项目。我需要在initComponents

中进行分配
  

this.items = drawItems;

工作fiddle