首页 > 代码库 > Extjs 4.2使用心得 --- tree和grid
Extjs 4.2使用心得 --- tree和grid
把前段时间做的东西整理一下。主要是树形菜单和grid面板的结合。选中左边机构菜单的节点,右边grid面板显示该节点下的信息。
首先是建立treestore
Ext.create(‘Ext.data.TreeStore‘, { autoDestroy: true, proxy: { type: ‘ajax‘, url: ‘/admin/organizations/get_tree_node/‘, // noCache: false, //设置为false 则不会向后台传参 _dc reader: { type: ‘json‘, root: ‘root‘ //根节点参数名 } }, nodeParam: ‘nid‘, //节点参数名,当节点展开时向服务端传送nid: sorters: [ //排序方式 { property: ‘nid‘, direction: ‘ASC‘ } ], root: { id: ‘1‘, text: ‘集团‘, //根节点显示的名称 expanded: false //是否默认展开 }, storeId: ‘treeStore‘ //Ext.StoreManager });
这里有个需要注意的地方,当时试了好久:root下面id:‘1‘,因为treejson的默认数据传输的格式为{‘text‘:‘集团‘,‘leaf‘:‘false‘,‘id‘:‘1‘}这样的,所以这里的参数只能只能固定为id,text,leaf等等,如果需要在节点前加上checkbox,则需要在传输的数据中加入‘checked‘:checked。
后端数据生成代码
def get_tree_node(request): """ 机构管理模块机构树数据源视图 """ nid = request.GET.get(‘nid‘, ‘‘) #取得参数nid的值# data = [] leaf = True checked = False if not nid: node = Info.objects.get(nid=1) if node.has_child: leaf = False #判断该节点是否为叶子节点# data.append({‘root‘: ‘True‘, ‘id‘: node.nid, ‘name‘: node.name, ‘leaf‘: leaf # ,‘checked‘:checked }) else: parent_node = Info.objects.get(nid=int(nid)) nodes = Info.objects.filter(pcode=parent_node.code) for node in nodes: if node.has_child: leaf = False data.append({ ‘id‘: node.nid, ‘text‘: node.name, ‘leaf‘: leaf # ,‘checked‘:checked }) json_data = json.dumps(data) return HttpResponse(json_data, ‘application/json‘)
生成机构树
var tree = Ext.create(‘Ext.tree.Panel‘, { store: ‘treeStore‘, displayField: ‘text‘, //此处为传输数据的{‘text‘:‘集团‘,‘leaf‘:‘false‘,‘id‘:‘1‘} useArrows: true, //展开样式,默认为+ multiSelect: false, //多选魔兽 rootVisible: true, //是否显示根节点 autoScroll: true, //是否自动添加滚动条 listeners: { //将节点id作为额外参数传递到 scope: this, selectionchange: function (model, sels) { if (sels.length > 0) { var rs = sels[0], store = Ext.StoreManager.lookup(‘orgStore‘); store.proxy.extraParams.orgid = rs.data.id; store.load(); } } }, height: 540 });
这里比较重点的是怎么使tree和grid组件间的数据传输,方法挺多种,在网上查了相关建议后,选择这种添加额外参数的方式,减少在过滤时的重复加载。
grid部分的展示就很简单了
var grid = Ext.create(‘Ext.grid.Panel‘, { title: ‘机构信息展示‘, border: false, store: ‘orgStore‘, loadMask: true,// features: [filters], columns: createColumns(7), selModel: selModel, //勾选模式,这里用的checkbox// anchor: ‘100%‘, width: 968, //为了显示滚动条,长宽需要固定 height: 563, emptyText: ‘没有找到数据‘, autoScroll: true, autoFill: true,// forceFit: true, dockedItems: [Ext.create(‘Ext.toolbar.Paging‘, { dock: ‘bottom‘, store: ‘orgStore‘, //这里需要指定与表格相同的store displayInfo: true }) , {xtype: ‘toolbar‘, dock: ‘top‘, items: [ ‘-‘, updateButton, addButton, deleteButton, ‘-‘, ‘->‘, { xtype: ‘searchfield‘, //搜索框 width: 200, store: ‘orgStore‘ }, ‘-‘ ]} ] });
搜索框这里使用了Ext.ux.form.SearchField,但是直接使用可能会遇到
TypeError: me.store.proxy is undefined[在此错误处中断] if (!me.store.proxy.hasOwnProperty(‘filterParam‘)) {
这个问题,原因是:在VIEW中指定的store: ‘PhoneBrand‘,其实只是一个字符串,并没不是变量。而上面的例子中,store是一个创建了的变量。
所以需要这样改
打开\extjs\ux\form\SearchField.js,在大概22行处,增加以下代码,patch一下吧
if(typeof(me.store.isStore) == ‘undefined‘) { me.store = Ext.data.StoreManager.get(me.store); }
同时,在store的代码中,也要指定storeId,如storeId:‘PhoneBrand‘, 具体可以参考这篇博文:
http://www.cnblogs.com/howgoo/archive/2013/01/26/EXTJS_earchfield_me_store_proxy_is_undefined.html
Extjs 4.2使用心得 --- tree和grid