添加/插入Ext.ToolBar的工具栏项目未显示在页面上

时间:2010-01-21 18:24:33

标签: javascript extjs

我有一个扩展面板的自定义组件。面板有一个带有基本配置的顶部工具栏。我希望能够在创建项目后动态添加项目。

这些项目应始终位于主菜单项集的末尾,并且在将注销按钮推到最右边的填充符之前,所以我编写了insertMenuItem函数来获取“分流器”的位置(tbfill) )项目并在此位置插入新的工具栏项目。如果它没有找到“分流”,因为它被覆盖了,它只是添加到工具栏的末尾。

这似乎很有效。如果我查看“live”contentPanel,我可以看到插入的菜单项。让它显示出来的问题。现在我怀疑这是一个范围问题,我只是不确定是什么,在哪里,何时,如何....:

我在函数中尝试了this.doLayout(),topToolbar.doLayout(),在调用我的函数后,我在contentPanel对象上得到了一个doLayout(),但它们似乎都没有帮助。

HELP! ;-D

以下是我的扩展Panel类。在此先感谢您的帮助

斯蒂芬


SOM.ux.contentPanel = Ext.extend(Ext.Panel, {
     autoScroll:true
    ,initComponent:function() {
        var config = {
             plugins:['dispatcher']
            ,contentEl : Ext.get('som-body')
            ,tbar:{
                     itemId:'contenttoolbar'
                    ,items:[
                {
                    xtype : 'button',
                    text: 'Dashboard',
                    handler: function(){
                        document.location.href = '/'
                    }
                },{itemId:'shunt',xtype: 'tbfill'},{
                    xtype : 'button',
                    text: 'Logout',
                    handler: function(){
                        document.location.href = '/admin.login.doLogout'
                    }
                },{
                        xtype : 'tbbutton',
                        text: 'Message',
                        scope: this,
                        handler: function(){
                            this.publish('SOM.ux.Dashboard',{action:'doHelloWorld',params:{name:'Stephen'}});
                        }
                    }
                ]
            }

        }; // end of config
        Ext.apply(this, Ext.apply(this.initialConfig, config));
        SOM.ux.contentPanel.superclass.initComponent.apply(this, arguments);
    }
    ,afterRender: function(){
        this.subscribe('SOM.ux.Toolbar');
        SOM.ux.contentPanel.superclass.afterRender.call(this);
    }
    ,onDispatchMessage: function(subject,message) {
        if (message.action) {
            this[message.action].call(this,message.params);
        }       
        console.log('contentpanel doDispatch',subject,message);
    }
    ,insertMenuItem: function(itemObj){
        var topToolbar = this.getTopToolbar();
        var aItems = topToolbar.items;
        var insertPos = aItems.indexOfKey('shunt');
        if (insertPos) {
            console.log('using insert');
            topToolbar.insert(insertPos,itemObj);
        } else {
            console.log('using add');
            topToolbar.add(itemObj);
        }
        this.getTopToolbar().doLayout();
    }

2 个答案:

答案 0 :(得分:3)

以下作品:

var tb = new Ext.Toolbar({
    items : [{text : 'wtf'}]
});

new Ext.Window({
    width : 300,
    height : 100,
    tbar : tb
}).show();

(function() {
    tb.add({text:'new btn'});
    tb.doLayout()
}).defer(1500);

要添加到jonathan的评论中,只需在渲染后调用doLayout。

答案 1 :(得分:1)

确保在工具栏呈现后调用insertMenuItem itemObj(参数)是Ext.Toolbar.Item配置吗?