【问题标题】:Extjs create dynamic accordion using storeExtjs 使用商店创建动态手风琴
【发布时间】:2012-11-12 23:09:04
【问题描述】:

我开始用 extjs 开发一个应用程序。我正在使用 extjs documentation 中提供的 MVC 方法。

我有一些动态数据需要向用户展示一组手风琴控件。我在商店中有数据,但我不知道如何动态创建手风琴项(与网格面板不同,似乎没有商店数据方法)。

这是我当前的手风琴视图代码 - 带有静态项目:

Ext.define('BP.view.induction.LeftPage', {
extend: 'Ext.Panel',
alias : 'widget.leftpage',

title: "Left Page", 
layout: {
    type: 'accordion',
    align: 'stretch'
},
layoutConfig: {
    // layout-specific configs go here
    titleCollapse: true,
    animate: true,
    activeOnTop: true
},
items: [{
    xtype: 'panel', // fake hidden panel, so all appear collapsed
    hidden: true,
    collapsed: false
},{
    xtype: 'panel',
    title: 'Panel 1',
    html: 'Panel content!'
},{
    xtype: 'panel',
    title: 'Panel 2',
    html: 'Panel content!'
},{
    xtype: 'panel',
    title: 'Panel 3',
    html: 'Panel content!'
}]
});

任何关于如何实现上述目标的指导将不胜感激,谢谢。

[编辑] 应 sra 的要求,这是我的控制器:

Ext.define('BP.controller.Induction', {
extend: 'Ext.app.Controller',

views: [
    'induction.Binder'
],

stores: [
    'Sections',
    'Categories',
    'Tasks'
],

init: function() {
    console.log('Initialized Induction!');
}
});

我应该在这里注意到,这个控制器加载了一个父视图,而父视图又加载了 LeftPage 视图——我不确定这是否会产生任何范围问题。此外,如您所见,加载了多个商店。

【问题讨论】:

    标签: model-view-controller extjs extjs4 accordion store


    【解决方案1】:

    您可以这样做(经过一些调整的未经测试的示例)

    Ext.define('BP.view.induction.LeftPage', {
        extend: 'Ext.Panel',
        alias : 'widget.leftpage',
    
        title: "Left Page", 
        layout: null,
        layoutConfig: null,
        store: null,
        attentive: true,
        initComponent: function() {
            var me = this;
            // begin edit
            // only set the store if is is not already defined
            me.store = me.store ? me.store : Ext.StoreMgr.lookup('Sections');  // you may change this to any storename you want
            // end edit
            me.layout = { // don't set objects directly in class definitions
                type: 'accordion',
                align: 'stretch'
            };
            me.layoutConfig = { // dont set objects directly in class definitions
                titleCollapse: true,
                animate: true,
                activeOnTop: true
            };
    
            me.callParent(arguments);
            if (me.attentive) {
                me.store('load', me.onRebuildContent, me);
                if (me.store.count() == 0)
                    me.store.load();
            } else {
                me.buildContent(); 
            }
        },
        buildContent: function() {
            var me = this;
            function addItem(rec) {
                me.add({
                    xtype: 'panel',
                    title: rec.get('titleProperty'),
                    html: rec.get('bodyProprty')
                });
            };
    
            me.store.each(addItem);
        },
        onRebuildContent: function() {
            var me = this;
            me.removeAll();
            me.buildContent();
        }   
    });
    

    您的商店至少需要两个属性;一个用于标题,一个用于内容。并且在实例化之前需要加载商店。但这可以在您的控制器中轻松完成。

    根据评论和新的 OP 信息进行编辑:

    您的视图有点不受控制器的控制。所以我建议你简单地使用 StoreManager 来接收一个有效的实例(我已经编辑了代码,我只是不知道要使用正确的商店)。只要您在控制器中列出 StoreManager,StoreManager 就会知道该商店(StoreManager 功能更多,但目前您只需要知道这些)。对于进一步的发布,您还可以使用 mixin bindable,它可以更干净地管理存储绑定,并使您能够在存储接收到新数据(更新)后更新您的手风琴

    编辑以提高可读性

    我刚刚对其进行了一些清理,并包含了一个开关参数attentive,它允许您将此组件用作直接绑定到商店、对所有加载事件做出反应或作为商店中的一种静态组件应该已经加载了。总而言之,这应该让您有一个开始,而不会使它变得复杂。

    【讨论】:

    • 感谢 sra 的帮助。我添加了代码并更改了这一行:me.sections.each(addItem);,我正在使用控制器中的“stores”参数加载商店,但它告诉我它是未定义的。我确信这是很明显的事情,但由于我是 extjs 新手,我仍在努力学习基础知识。您能提供的任何帮助将不胜感激。
    • @BrynJ 好吧,我想从那里开始就直截了当;使用Ext.create('BP.view.induction.LeftPage', { store: yourStoreVariable }); 而不是Ext.widget() 创建'BP.view.induction.LeftPage' 的实例。如果这没有帮助,请删除您实例化此类的控制器功能,我会看看我能做什么。
    • 我确信这很明显,但对我来说不是 :) 我已将我的控制器代码添加到问题中,并在其下方添加了一些更多详细信息。
    • 您还需要创建一个构造函数,在其中将存储传递给您的对象。而且您需要确保在调用 buildContent 之前加载您的商店,最好听一下商店的加载事件。 initComponent 将具有以下内容: me.store.on('load', function() { me.buildContent() });
    • 绝对!但这也可以由控制器来完成。无论如何,我清理了我的示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多