Sencha Touch,嵌套面板在嵌套列表中

时间:2011-04-28 08:33:37

标签: javascript-framework sencha-touch extjs

我有一个具有嵌套列表的Sencha Touch应用程序。

nestedList自动创建自己的toolBar。

我想将工具栏下方的面板停靠在列表项上方。我只需要在列表的顶层。我希望在选择第一片叶片后它会消失。

这听起来像是可行的吗?正如您在我的代码中看到的那样,我只能将项目面板停靠在当前工具栏的顶部。

提前非常感谢。我非常感谢你们的任何建议。

  • 的Al。

以下是我到目前为止......

  // Menu Pages
    var menu = new Ext.NestedList({ 
        fullscreen: true,
        title: 'Menu',
        displayField: 'text',
        store: menu_store,
// ** This is the dockedItem I would like to insert between the toolbar and list-items

            dockedItems: [ {
                  xtype     : 'panel',
                    dock        : 'top',
                    html        : '<span>This is the logo panel</span>',
                    cls         : 'front-logo-panel',
                    flex        : 1
                }], 
            // Add Panel for Leaf nodes
            getDetailCard: function(item, parent) {
                var itemData = item.attributes.record.data,
                parentData = parent.attributes.record.data,
                detailCard = new Ext.Panel({
                    scroll: 'vertical',
                    cls: 'menu-item-panel',
                    styleHtmlContent : true,
                    tpl: menuTemplate, 
                    // add button to Leaf Node
                     listeners: {                
                                           activate: function() {
                                        Ext.getCmp('itemToolbar').setTitle('New Title Bar');
                                    }   
                                    }
                }); 
                detailCard.update(itemData);
                this.backButton.setText(parentData.text);
                return detailCard;     
            }, 
            // add template for all nodes
            getItemTextTpl: function() {
                var tplConstructor =  
                '<tpl if="newItem">' +
                    '<span class="list-new-item">New&nbsp;Item!</span>' +
                '</tpl>'+
                '{text}' +
                '<tpl>'+
                    '<div class="metadata">' +
                        '{description:ellipsis(40)}' +
                    '</div>' +
                '</tpl>';
                return tplConstructor;
            }
    });  

1 个答案:

答案 0 :(得分:0)

老问题,我知道,但要解决此问题,您可以从列表中删除工具栏(不破坏它)并将其添加到列表上方的面板中。所有嵌套列表功能在工具栏上保持不变。这是我的解决方案:

首先,我创建了一个从NestedList扩展并包含工具栏的视图:

Ext.define('MyApp.view.DynamicList', {
extend: 'Ext.dataview.NestedList',
alias: 'widget.dynamiclist',
config: {
    toolbar: {
        xtype: 'toolbar',
        docked: 'top',
        itemId: 'header-bar',
        layout: {
            pack: 'end',
            type: 'hbox'
        },
        items: [
            {
                xtype: 'spacer'
            },
            {
                xtype: 'button',
                itemId: 'show-nav-sheet-button',
                ui: 'plain',
                width: 45,
                iconCls: 'more'
            }
        ]
    }
}
});

接下来,我创建了一个主面板,其中包含一个包含子面板和此工具栏的vbox布局:

Ext.define('MyApp.view.MainContainer', {
extend: 'Ext.Container',

requires: [
    'MyApp.view.DynamicList'
],

config: {
    id: 'main-container',
    layout: {
        type: 'vbox'
    },
    items: [            

        {
            xtype: 'panel',
            flex: 1,
            itemId: 'info-container'                
        },
        {
            xtype: 'dynamiclist',
            flex: 1
        }
    ]        
}

});

然后,在控制器中,我监听嵌套列表的initialize事件。当它被触发时,我从嵌套列表中删除工具栏并将其添加到面板。

onNestedListInitialize: function() {
    // need to wait until everythin is initialized;
    var me = this;

    var renderFn = function renderPanels() {
        var main = me.getMainContainer();

        // wait until main is intialized;
        if(!main) {
            Ext.defer(renderFn, 50, this);
            return;
        }

        var list = main.down('#my-list');
        var infocont = main.down('#info-container');

        // wait until the container's components are initialized
        if(!list || !infocont) {
            Ext.defer(renderFn, 50, this);
            return;
        }

        // remove the toolbar from the list, and add it to the container. 
        var toolbar = list.down('#header-bar');         
        list.remove(toolbar, false);
        infocont.add(toolbar);

    }

    // call the function for the first time.
    renderFn();
}

注意,我必须添加一些检查以确保组件在使用之前已正确初始化,但它的核心是list.remove(toolbar,false),后跟infocont.add(工具栏)命令。 .remove()方法中的false标志表示该项目不会被销毁,因此可以重新添加到面板中。