`
rainytooo
  • 浏览: 38951 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ext单页面框架结构

阅读更多

最近开发项目用到ext,不想使用iframe,在参考了大量文章以后使用eval的方式,来模块化js代码,实现框架页


主页面的js代码 main.js

// 页面加载开始
// 定义一个锁屏的遮罩 因为树菜单是异步读取的
var myMask_info = "加载数据中,请稍后...";
var myMask = new Ext.LoadMask(Ext.getBody(), {msg:myMask_info});
// 模块的数组 用来缓存模块function的
var moduleArray = {};
Ext.onReady( function() {
	Ext.QuickTips.init();
	// 加载锁屏 loadmask 
	myMask.show();
	// 动态获取树节点 这里ajax使用的是dwr(直接输出json数据) 异步加载使用的是第三方的DWRTreeLoader
	var dwrloader = new Ext.ux.DWRTreeLoader({
        dwrCall:AsyncMainSev.getUserFuncTreeJSON
      });
	
	// 主页面上初始化一个Tab面板
	var contentPanel = new Ext.TabPanel({  
		region:'center',  
		enableTabScroll:true,  
		activeTab:0,  
		items:[{  
			id:'homePage',  
			title:'首页',  
			autoScroll:true,
			closable:true,  
			html:'<iframe id="frame_main" src="pages/main/child1.html" width="100%" height="400" frameborder="0" scrolling="auto"></iframe>'  
		}]  
	}); 
	
	var _tree = new Ext.tree.TreePanel({
        id:'forum-tree',
        region:'west',
        title:'功能菜单',
        split:true,
        width: 325,
        minSize: 175,
        maxSize: 400,
        collapsible: true,
        margins:'0 0 5 5',
        rootVisible:false,
        lines:false,
//   	selModel: new Ext.tree.MultiSelectionModel(),
        autoScroll:true,
        loader: dwrloader,
        root: new Ext.tree.AsyncTreeNode({text:'root',hasChildren:true,id: '0'})
        /*listeners: {
	        'checkchange': function(node, checked){
	            if(checked){
	                node.getUI().addClass('complete');
	            }else{
	                node.getUI().removeClass('complete');
	            }
	        }
    	}*/
    });
    //加载完成事件 隐藏掉锁屏loadmask
	_tree.addListener("load",function(){myMask.hide();});
	/**以下代码用来给叶子节点添加事件**/
	var tree = Ext.getCmp('forum-tree');
	/*
	var sm = tree.getSelectionModel();
	sm.on('selectionchange', function(sm, node){
		//console.log(node.attributes.attributes.url);
		// 测试iframe的方式 而注释掉
		var n = contentPanel.getComponent(node.id);  
        if (!n) { ////判断是否已经打开该面板  
            n = contentPanel.add({  
                'id':node.id,  
                'title':node.text,  
                closable:true,  
                autoLoad:{url:node.attributes.attributes.url, scripts:true} //通过autoLoad属性载入目标页,如果要用到脚本,必须加上scripts属性  
            });  
        }  
        contentPanel.setActiveTab(n); 

		var n = contentPanel.getComponent(node.id);
		if(!n){
			n = contentPanel.add({ 
				id:node.id,  
				title:node.text,  
				autoScroll:true,
				closable:true,  
				html:'<iframe id="frame_main" src="' + node.attributes.attributes.url + '" width="100%" height="400" frameborder="0" scrolling="auto"></iframe>'
			});
		}
		contentPanel.setActiveTab(n);
    });
	*/
	
	// 10-03-02 再次修改为tree.on方法 取消原来的在selectionmodel上做
	/*
	tree.on('click', function(node){
        // 如果是叶子节点
		if ( node.isLeaf() ){
			// 得到节点对象Ext.tree.TreeNode
			var n = contentPanel.getComponent(node.id);
			// 如果不存在 在TabPanel上添加一个tab 挂载iframe页面
			if(!n){
				n = contentPanel.add({ 
					id:node.id,  
					title:node.text,  
					autoScroll:true,
					closable:true,  
					html:'<iframe id="frame_main" src="' 
						+ node.attributes.attributes.url 
						+ '" width="100%" height="400" frameborder="0" scrolling="auto"></iframe>'
				});
			}
			// 激活
			contentPanel.setActiveTab(n);
		}
	});
	*/
	// 10-03-15 再次修改  实验性修改为之加载外部文件js 不使用框架页了
	tree.on('click', function(node){
		myMask.show();
		var nodeattr = node.attributes.attributes;
        // 如果是叶子节点
		if ( node.isLeaf() ){
			// 获取这个模块的id
			var moduleId = nodeattr.module_name;
			var n = contentPanel.getComponent(moduleId);
			// 如果不存在 在TabPanel上添加一个tab id为模块的id
			if(!n){
				// 如果数组里初始化过此module
				if( moduleArray[moduleId] != undefined ){
					var module = moduleArray[moduleId];
					var moduleInstance = new module();
					var outCmp =  contentPanel.add(moduleInstance);
					contentPanel.setActiveTab(outCmp);
					myMask.hide();
				}else{
					//  ajax请求 来eval一段module的代码 并执行 然后加到tabpanel上
					Ext.Ajax.request({
						method: 'GET',
						url: nodeattr.js_source,
						success: function(response){
							var module = eval(response.responseText);
							moduleArray[moduleId] = module;
							var moduleInstance = new module();
							var outCmp =  contentPanel.add(moduleInstance);
							contentPanel.setActiveTab(outCmp);
							myMask.hide();
						}
					});
				}
			}
			// 获取js代码的绝对路径
		}
	});
	
	// 开始渲染整个面板  并整合定义好的tree和TabPanel组建
	var viewport = new Ext.Viewport( {
		layout : 'border',
		items : [ {
				xtype: 'box',
				region: 'north',
				height: 30
			},
			_tree, 
			contentPanel
			]
	});
});

ajax请求的js代码的路径是写到了节点node的属性里,在初始化树节点的时候就已经动态的写好了

一个子模块的示例 用户管理

useradmin.js

// 用户管理模块
Ext.extend(Ext.Panel, {
	constructor: function(config) {
		// 表格模型
		var cm = new Ext.grid.ColumnModel([
		   {
	        id: 'username',
	        header: "姓名",
	        dataIndex: 'username',
	        width: 100
	        
	     },{
	    	id: 'email',
	        header: "电子邮件",
	        dataIndex: 'email',
	        width: 100
	     },{
	    	id: 'createdate',
	        header: "注册时间",
	        dataIndex: 'createdate',
	        width: 100
	     },{
	        id: 'updatedate',
	        header: "修改时间",
	        dataIndex: 'updatedate',
	        width: 100
	     }]);
		//console.log(basePath+'campaign/id/review');
		// 数据来源储存
		var user_store = new Ext.data.Store({
			url: basePath+'users/ajaxserv',
			
			reader: new Ext.data.JsonReader({
	            root: 'users',
	            totalProperty: 'totalCount',
	            id: 'id'
	        }, [
	            'username', 'email', 'createdate', 'updatedate'
	        ])
		});
	
		cm.defaultSortable = true;
		
		user_store.load();
		config = Ext.apply({
			id: 'm_useradmin',
			title: '用户管理',
			autoScroll: true,
			closable:true ,	
		    items:[
		        new Ext.grid.GridPanel({
		            store: user_store,
		            cm: cm,
		            stripeRows: true,
		            height: 350,
		            //width: 800,
		            autoWidth : true,   
		            loadMask: {msg:'正在加载数据,请稍后'},
		            title: '用户列表'  ,
		            tbar: [{ text: '添加', iconCls: 'new-item', tooltip: { title:'添加用户', text:'在此系统中注册一个新的用户'} }],
		            bbar: new Ext.PagingToolbar({
		                pageSize: 25,
		                store: user_store,
		                displayInfo: true,
		                displayMsg: '显示记录 {0} - {1} of {2}',
		                emptyMsg: "没有任何记录"
		            })
		        })
		    ]
	    }, config);
		module.superclass.constructor.call(this, config);
	}
});
 

 

分享到:
评论
2 楼 pk272205020 2010-04-19  
哈哈,写得不错
1 楼 onlydo 2010-03-18  
source 不错。

相关推荐

    MVC+EF+EXT框架源码

    这个项目的核心是将这三个技术融合,创建一个功能完备的单页面应用程序(SPA)。 **MVC(Model-View-Controller)框架** MVC是一种设计模式,常用于Web应用开发,用于分离业务逻辑、数据模型与用户界面。在.NET ...

    Ext4+JSON+Servlet+Tree构建Web应用框架

    5. Ext.tree.Panel:是Ext JS中的一个组件,用于展示层次结构的数据,如文件系统或组织结构。Tree Panel允许用户展开和折叠节点,进行拖放操作,非常适合于展现具有层级关系的信息。 6. Ext.tab.Panel:是另一款Ext...

    Ext框架简介.ppt

    然后,可以通过`Ext.onReady`函数在页面加载完成后执行特定的JavaScript代码,例如显示一个提示框,如下所示: ```javascript Ext.onReady(function(){ Ext.Msg.alert('helloWord','Hello Word!'); }); ``` EXT...

    EXT例子,可以直接跑

    4. 动态加载和异步通信:EXT利用AJAX技术实现页面的动态加载和与服务器的异步通信,这在办公系统中至关重要,因为通常需要实时更新数据或者根据用户操作获取新的信息。`Ext.Ajax`或`Store`的远程代理可以实现这一...

    新版EXT教程

    - **树形面板(Tree Panel)**:用于展示具有层次结构的数据。 - **选项卡面板(Tab Panel)**:包含多个可切换的页面。 3. **特殊控件**: - **日历选择器(Calendar Picker)**:供用户选择日期。 - **颜色...

    Ext-Gantt和相关js如ext-all.js ext-base

    `ext-base.js`是Ext JS的基础文件,包含框架的基本结构和核心功能,如类系统、事件系统和DOM操作。在一些情况下,如果项目对加载速度有较高要求,可以先加载`ext-base.js`,然后再按需加载其他组件,以实现按需加载...

    Ext JS框架 经验之作2000页

    ### Ext JS框架 经验之作2000页 #### 概述 本文档旨在提供一个全面且深入的指南,帮助读者理解并掌握Ext JS框架的各个方面。Ext JS是一款非常强大的JavaScript库,用于构建交互式的Web应用程序。它以其丰富的组件库...

    Ext MVC 项目示例

    EXT MVC 是 Sencha Ext JS 框架的一个关键特性,它是基于模型-视图-控制器(Model-View-Controller)设计模式的应用开发架构。这个模式将应用程序的不同部分分离,使得代码更易于管理和维护。在“Ext MVC 项目示例”...

    Ext4 动态加载js例子

    Ext4 是一个基于 JavaScript 的富客户端应用框架,主要用于构建复杂的 Web 应用程序。它提供了丰富的组件库,包括表格、面板、菜单等,使得开发者能够创建功能强大的交互式用户界面。`Ext.Loader` 是 Ext4 中的一个...

    Ext2.0本地模式动态修改combobox选择项

    5. **tree**: 这可能是另一种Ext JS组件——TreePanel,通常用于显示层次结构数据,但在这个上下文中,可能与Combobox的动态更新功能有关,例如,可能通过树形结构来控制Combobox的选项。 综上所述,这个示例可能是...

    ext 学习资料

    为了解决这些问题,各种JavaScript框架应运而生,其中Ext JS因其强大的功能和易用性成为了众多开发者的选择之一。 **学习资料来源:** 本篇内容基于一位经验丰富的开发者分享的学习资料——《Ext JS 6 By Example》...

    基于Ext的考试系统

    本项目基于Ext框架,一个强大的JavaScript UI库,为构建用户界面提供了一系列丰富的组件和工具。ExtJS以其灵活性、可定制性和高性能,成为构建Web应用程序的理想选择。 一、Ext框架简介 ExtJS是一个开源的...

    EXT官方网站的中文教程

    学习 EXTJS 的第一步通常是创建一个简单的页面,引入 EXTJS 的库文件,然后利用 `Ext.application` 方法初始化应用程序。这将加载配置和启动主程序。 4. **Element:Ext 的核心**: `Element` 是 EXTJS 中处理 ...

    EXT测试小样例--EXT测试小样例

    EXT测试小样例通常指的是基于EXT JS框架进行的软件测试示例。EXT JS是一个用于构建富客户端Web应用程序的JavaScript库,特别适用于创建数据驱动、交互性强的用户界面。EXT Grid是EXT JS中的一个核心组件,它提供了一...

    Ext Js权威指南(.zip.001

    9.8.2 在单页面应用中使用卡片布局实现“页面”切换 / 496 9.9 本章小结 / 498 第10章 重构后的grid / 500 10.1 grid的基类及其构成 / 500 10.1.1 概述 / 500 10.1.2 表格面板的运行流程:ext.panel.table / ...

    Practical Ext JS 4

    4. **控件和布局**:在Ext JS中,布局管理是用来控制组件在页面上如何展现的,本章将重点介绍各种布局管理器和标准的用户界面控件,以及如何将它们组合使用来创建复杂的用户界面。 5. **处理数据**:本章涉及到数据...

    EXt 可以编辑的grid

    在EXT JS这个强大的JavaScript框架中,"EXt 可编辑的grid"是一个常见的应用场景,它允许用户在数据网格中直接编辑单元格内的数据。EXT JS的CellEditing插件是实现这一功能的关键,它提供了优雅的方式来处理表格数据...

    EXT学习资料1

    EXT 是一个基于 JavaScript 的前端开发框架,主要用于构建富互联网应用程序(Rich Internet Applications,RIA)。EXT 提供了丰富的组件库,包括表格、面板、菜单、工具栏等,使得开发者能够创建功能强大、用户界面...

Global site tag (gtag.js) - Google Analytics