如何在TabPanel中嵌入NestedList?

时间:2012-03-14 19:37:02

标签: sencha-touch-2

我正在尝试在第一个标签上创建一个包含tabpanel控制器的splitview视图。将“厨房水槽”演示放在一个tabpanel的一个标签中。

其他人不包含嵌套列表。

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

enter image description here

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

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

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
});

1 个答案:

答案 0 :(得分:4)

好。我已经为您创建了这个示例:http://www.senchafiddle.com/#ynn40

你也可以从这里下载整个资源:http://rwd.me/FG5s(非常大,因为它包含了SDK)

请务必查看所有文件,因为我已添加了大量文档。

一些注意事项:

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

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

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

  2. 正如您所看到的,它具有在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
    }
    

    这用于将存储从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(如果存在)商店。

  3. 在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
    }
    
  4. 最后,我们将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'));
    }
    
  5. 希望这有意义并帮助您。如果没有,请告诉我。