Bry*_*ynJ 6 model-view-controller extjs store accordion extjs4
我正在开始在extjs中开发应用程序.我使用的是MVC方法,如extjs文档中所提供的.
我有一些动态数据需要向用户提供一组手风琴控件.我在商店里有数据,但我不知道如何动态创建手风琴项目(与网格面板不同,似乎没有商店数据方法).
这是我目前的手风琴视图代码 - 带有静态项目:
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!'
}]
});
Run Code Online (Sandbox Code Playgroud)
如何实现上述任何指导将不胜感激,谢谢.
[编辑]响应sra的请求,这是我的控制器:
Ext.define('BP.controller.Induction', {
extend: 'Ext.app.Controller',
views: [
'induction.Binder'
],
stores: [
'Sections',
'Categories',
'Tasks'
],
init: function() {
console.log('Initialized Induction!');
}
});
Run Code Online (Sandbox Code Playgroud)
我应该注意这个控制器加载一个父视图,然后加载LeftPage视图 - 我不确定这是否会产生任何范围问题.此外,正如您所看到的,加载了多个商店.
你可以这样做(未经测试的例子有一些调整)
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();
}
});
Run Code Online (Sandbox Code Playgroud)
您的商店至少需要两个房产; 一个用于标题,一个用于内容.在实例化之前需要加载商店.但这可以在您的控制器中轻松完成.
根据评论和新的OP信息进行编辑:
那么你的视图有点失控的控制器.所以我建议你只使用StoreManager来接收一个有效的实例(我编辑了代码,我只是不知道要使用的正确商店).只要您在控制器中列出他,StoreManager就会知道该商店(StoreManager能够提供更多功能,但这是您目前需要知道的全部内容).对于进一步的版本,您还可以使用mixin bindable来管理存储绑定更干净,并使您能够在商店收到新数据后更新您的手风琴(获取更新)
编辑可读性
我刚刚清理了一下并包含了一个开关参数attentive,它允许你将这个组件直接绑定到一个商店,对所有加载事件作出反应,或者作为一种静态加载商店.总而言之,这应该给你一个开始,而不是让它变得复杂.