如何在 TabPanel 中嵌入 NestedList?

Posted

技术标签:

【中文标题】如何在 TabPanel 中嵌入 NestedList?【英文标题】:How to Embed a NestedList in a TabPanel? 【发布时间】:2012-03-14 19:37:02 【问题描述】:

我正在尝试创建一个 tabpanel 视图,该视图在第一个选项卡上包含一个 splitview 控制器。想想“厨房水槽”演示放在标签面板的一个选项卡中。

其他不包含嵌套列表。

http://dev.sencha.com/deploy/touch/examples/production/kitchensink/

我尝试将嵌套列表放入容器中,您可以在下面显示的一些注释代码中看到它。

目前,此工作代码仅显示嵌套列表占据了第一个选项卡上的整个部分:

Ext.application(
    name: 'Test',

    requires: [
        'Ext.dataview.NestedList',
        'Ext.navigation.Bar'
    ],

    launch: function() 
        Ext.create("Ext.TabPanel", 
            fullscreen: true,
            tabBarPosition: 'bottom',
            items: [
                id: 'tab4',
                title: 'Tab4',
                iconCls: 'star',
                xtype: 'container',
                items: [
                    xtype: 'nestedlist',
                    displayField: 'text',
                    docked: 'left',
                    store: store
                , 
                    html: 'Detail View'
                ]
            , 
                id: 'tab2',
                title: 'Tab2',
                iconCls: 'star',

                html: 'No nav bar?'
            , 
                id: 'tab3',
                title: 'Tab3',
                iconCls: 'star',

                html: 'Screen3'
            ]
        ).setActiveItem(0);
    
);

商店设置:

Ext.Loader.setConfig( enabled: true );

var data = 
  text: 'Groceries',
  items: [
    text: 'Drinks',
    items: [
      text: 'Water',
      items: [
        text: 'Sparkling',
        leaf: true
      ,
        text: 'Still',
        leaf: true
      ]
    ,
      text: 'Coffee',
      leaf: true
    ,
      text: 'Espresso',
      leaf: true
    ,
      text: 'Redbull',
      leaf: true
    ,
      text: 'Coke',
      leaf: true
    ,
      text: 'Diet Coke',
      leaf: true
    ]
  ,
    text: 'Fruit',
    items: [
      text: 'Bananas',
      leaf: true
    ,
      text: 'Lemon',
      leaf: true
    ]
  ,
    text: 'Snacks',
    items: [
      text: 'Nuts',
      leaf: true
    ,
      text: 'Pretzels',
      leaf: true
    , 
      text: 'Wasabi Peas',
      leaf: true
    ]
  
];

Ext.define('ListItem', 
    extend: 'Ext.data.Model',
    config: 
        fields: [
                name: 'text',
                type: 'string'
        ]
    
);

var store = Ext.create('Ext.data.TreeStore', 
    model: 'ListItem',
    defaultRootProperty: 'items',
    root: data
);

【问题讨论】:

你到底想要什么?选项卡中的“选择”视图,然后是另一个选项卡上的“详细信息”视图?还是第一个选项卡中的两个视图? 认为“厨房水槽”演示放置在 TabPanel 的一个选项卡中。单击我包含的链接。现在想象该屏幕是选项卡面板中的一个选项卡。它是 TabPanel 内的主/详细控制器。如果有帮助,我可以尝试绘制线框。 【参考方案1】:

好的。我为你创建了这个例子:http://www.senchafiddle.com/#ynn40

您也可以从这里下载整个源代码:http://rwd.me/FG5s(相当大,因为它包含 SDK)

请务必查看所有文件,因为我添加了很多文档。

一些注意事项:

    我创建了一个名为Sencha.view.SplitView 的新组件。这显然可以称为任何东西。它的 xtype 为 splitview,因此我们可以简单地要求它并将其包含到我们的 Main.js 文件中(这是一个 Ext.tab.Panel

    
        xtype: 'splitview',
        title: 'SplitView',
        store: 'Items'
    
    

    因为这是 tabPanel 中的一项,我们也需要给它title 配置。当然,我们可以在任何地方包含这个 Splitview 组件。

    如您所见,它有一个在 SplitView 中定义的store 配置:

    config: 
        /**
         * We create a custom config called store here so we can pass the store from this component
         * (SplitView) down into the nested list when it updates. Checkout @link #updateStore
         * @type Ext.data.Store
         */
        store: null
    
    

    这用于将 store 从 splitview 传递到嵌套列表(我们稍后会介绍)。当然,除非我们添加适当的方法来更新嵌套列表,否则该配置将无济于事:

    /**
     * This is called when the @link #store config has been updated.
     * We simply check if the nested list has been created, and if it has, set the store
     * on it with the new value.
     */
    updateStore: function(newStore) 
        if (this.nestedList) 
            this.nestedList.setStore(newStore);
        
    
    

    如您所见,我们只是使用 SplitView 存储的新值更新 nestedList(如果存在)存储。

    在SplitView 的initialize 方法中,我们创建了detailContainer(嵌套列表的详细信息卡所在的位置)和nestedList,然后将它们添加到SplitView。请务必查看我们提供的一些配置 nestedList,因为它们很重要。店铺配置:

    // Set the store of this nested list to the store config of this component (Splitview)
    store: this.getStore()
    

    detailCarddetailContainer 配置:

    // Tell the nested list to have a detail card and put it inside our new detailContinaer
    detailCard: true,
    detailContainer: this.detailContainer
    

    当然还有听众,所以我们知道什么时候会发生变化:

    // And finally add a listener so we know when to update the detail card
    listeners: 
        scope: this,
        leafitemtap: this.onLeafItemTap
    
    

    最后,我们将onLeadItemTap 方法添加到Splitview(我们在上面添加了监听器),它应该使用新信息更新详细信息卡:

    /**
     * This is called when a leaf item is tapped in the nested list, or when the detail card
     * should be updated. In here, we just get the record which was tapped and then set the HTML
     * of the detail card.
     */
    onLeafItemTap: function(nestedList, list, index, node, record, e) 
        var detailCard = nestedList.getDetailCard();
        detailCard.setHtml(record.get('text'));
    
    

希望这是有道理的并对您有所帮助。如果没有,请告诉我。

【讨论】:

谢谢。我删除了 sdk 并将其余的放在 github 上:github.com/melling/SenchaTouch2 (TabBarAndNestedList)

以上是关于如何在 TabPanel 中嵌入 NestedList?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 TabPanel extjs 的像素位置?

extjs 3.4 中 TabPanel 中的标题折叠

如何在 ExtJs 中单击 TabPanel 中的 Tab 菜单时初始化各个选项卡数据?

如何在ExtJS Tabpanel中显示JSON表单字段?

如何以编程方式隐藏 TabPanel 中的 Tab(ExtJS 3)

如何将tabpanel的键从视图传递到控制器asp mvc