如何在extjs中动态添加项目到窗口

时间:2016-11-18 10:18:53

标签: extjs window

我想动态添加一个带卡片布局的面板,每次关闭窗口时,我想要Negative number ( "-4", "-5" ) Positive number ( 1, 2, 3, 6, 9 ) 窗口项。

第一次打开窗户时,它没问题。当我重新打开窗口时,我想创建一个新视图,但实际上它会引发destroy,如下所示,

  

这是我的窗口视图

error
  

这是我的窗口项,Ext.define('MyWebServer.view.qualityassign.CardLayoutWindow', { extend: 'Ext.window.Window', xtype: 'cardlayoutwindow', modal: true, closeAction: 'hide', closable: true, resizable: false, layout: 'fit', reference: 'cardlayoutwindow', controller: 'cardlayoutwindow', viewModel: { data: { initSelectRecordGridStoreDwrParams: [] } }, width: Ext.Element.getViewportWidth() - 50, height: Ext.Element.getViewportHeight() - 64, listeners: { beforeshow: 'onCardLayoutWindowBeforeShow', beforehide: 'onCardLayoutWindowBeforeHide', scope: 'controller' } }); 布局

card
  

这是我的窗口控制器

Ext.define('MyWebServer.view.qualityassign.CardLayoutMain', {
    extend: 'Ext.panel.Panel',
    xtype: 'cardlayoutmain',

    prevBtnText: '« prev',
    nextBtnText: 'next »',

    layout: {
        type: 'card',
        align: 'center',
        deferredRender: true
    },

    bodyPadding: 15,

    defaults: {
        border: false
    },

    viewModel: {
        data: {
            copyRecords: [],
            extractRecord: {},
            planRecord: {},
            allocateRecords: []
        }
    },

    controller: 'cardlayoutmain',
    reference: 'cardlayoutmain',

    initComponent: function() {
        var me = this;

        me.items = me.createItems();

        me.dockedItems = me.createDockedItems();
        me.callParent();


    },

    createItems: function() {
        var mainId = this.id;
        return [{
            itemId: mainId + '-' + 'card-0',
            xtype: 'select-record'
        }, {
            itemId: mainId + '-' + 'card-1',
            xtype: 'extract-strategy'
        }, {
            itemId: mainId + '-' + 'card-2',
            xtype: 'selectqualityplan'
        }, {
            itemId: mainId + '-' + 'card-3',
            xtype: 'allocate-strategy'
        }, {
            id: this.id + '-' + 'card-4',
            html: 'Success'
        }];
    },

    createDockedItems: function() {
        var me = this;
        return [{
            xtype: 'toolbar',
            dock: 'top',
            items: ['->',
                {
                    itemId: 'card-prev',
                    text: me.prevBtnText,
                    handler: 'showPrevious',
                    disabled: true
                },
                {
                    itemId: 'card-next',
                    text: me.nextBtnText,
                    handler: 'showNext'
                }
            ]
        }];
    }
});

2 个答案:

答案 0 :(得分:1)

如果你想关闭窗口,只需指定

即可销毁它
closeAction : 'destroy'

而不是

closeAction : 'hide'

如果这样做,ExtJS会完全摧毁并删除所有项目。另外,如果将destroy指定为关闭操作,则不需要额外的侦听器(onCardLayoutWindowBeforeHide)来删除所有项目。如果再次创建窗口,它将从头开始构建(请参阅Sencha Fiddle)。

答案 1 :(得分:0)

感谢oberbics和Evan Trimboli

我解决了这个问题,因为我分配了一个像这样的rownumberer:

  

new Ext.grid.RowNumberer({width:40}),

然而,当我用xtype config替换它时,它运行良好。

  

{xtype:' rownumberer'}

Ext.define('MyWebServer.view.qualityassign.AllocateStrategy',{
    extend  : 'Ext.panel.Panel',
    xtype   : 'allocate-strategy',

    layout  : 'fit',

    requires: [
      'Ext.grid.column.Action',
      'Ext.ProgressBarWidget',
      'Ext.slider.Widget'
    ],

    reference   : 'allocatestrategypanel',
    controller  : 'allocatestrategy',

    viewModel   : {
        data    : {

        }
    },

    listeners   : {
        beforerender    : 'onAllocateStrategyPanelBeforeRender',
        scope           : 'controller'
    },

    header  : {
        xtype   : 'container',
        html    : '<p>Step 4 of 4  Choose allocate strategy</p>'
    },

    initComponent   : function() {
        var me = this;

        me.items = this.createItems();

        me.callParent();
    },

    createItems     : function() {
        var me = this;
        return [{
            xtype       : 'grid',
            reference   : 'allocatestrategygrid',
            frame       : true,
            viewConfig  : {
                loadMask: true
            },

            store       : {
                type    : 'allocate'
            },

            dockedItems :   [{
                xtype   : 'toolbar',
                dock    : 'bottom',
                items   : [{
                xtype   : 'toolbar',
                itemId  : 'allocatestrategygrid-topbar',
                dock    : 'top',
                items   : [{
                    xtype           : 'combo',
                    reference       : 'selectgroupcombo',
                    fieldLabel      : 'qualityinspectorgrp',
                    labelWidth      : 30,
                    editable        : false,
                    triggerAction   : 'all',
                    valueField      : 'sGroupGuid',
                    displayField    : 'sGroupName',
                    forceSelection  : true,
                    store           : {
                        type        : 'selectgroup'
                    },
                    listeners       : {
                        select      : 'onSelectGroupComboSelect',
                        scope       : 'controller'
                    }
                }]
            }],

            columns     : {
                xtype   : 'gridcolumn',
                defaults: {
                    align       : 'center',
                    width       : 100,
                    menuDisabled: true
                },
                items   : [
                     **new Ext.grid.RowNumberer({width: 40}),**
                     {
                         text       : 'agentId',
                         dataIndex  : 'qualInspId'
                     },
                     {
                         text       : 'agentName',
                         dataIndex  : 'qualInspName'
                     },
                     {
                         text       : 'percent',
                         xtype      : 'widgetcolumn',
                         width      : 120,
                         widget     : {
                             bind   : '{record.percent}',
                             xtype  : 'progressbarwidget',
                             textTpl: [
                                 '{percent:number("0")}%'
                             ]
                         }
                     },
                     {
                         text       : '',
                         xtype      : 'widgetcolumn',
                         width      : 120,
                         widget     : {
                             xtype      : 'numberfield',
                             editable   : false,
                             bind       : '{record.percent}',
                             maxValue   : 0.99,
                             minValue   : 0,
                             step       : 0.01,
                             maxLength  : 4,
                             minLength  : 1,
                             autoFitErrors: false
                         }
                     },
                     {
                         text     : '',
                         xtype    : 'widgetcolumn',
                         width    : 120,
                         flex     : 1,
                         widget   : {
                             xtype      : 'sliderwidget',
                             minValue   : 0,
                             maxValue   : 1,
                             bind       : '{record.percent}',
                             publishOnComplete  : false,
                             decimalPrecision   : 2
                         }
                     }
                ]
            }
        }];

    }