最近开发项目用到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);
}
});
分享到:
相关推荐
这个项目的核心是将这三个技术融合,创建一个功能完备的单页面应用程序(SPA)。 **MVC(Model-View-Controller)框架** MVC是一种设计模式,常用于Web应用开发,用于分离业务逻辑、数据模型与用户界面。在.NET ...
5. Ext.tree.Panel:是Ext JS中的一个组件,用于展示层次结构的数据,如文件系统或组织结构。Tree Panel允许用户展开和折叠节点,进行拖放操作,非常适合于展现具有层级关系的信息。 6. Ext.tab.Panel:是另一款Ext...
然后,可以通过`Ext.onReady`函数在页面加载完成后执行特定的JavaScript代码,例如显示一个提示框,如下所示: ```javascript Ext.onReady(function(){ Ext.Msg.alert('helloWord','Hello Word!'); }); ``` EXT...
4. 动态加载和异步通信:EXT利用AJAX技术实现页面的动态加载和与服务器的异步通信,这在办公系统中至关重要,因为通常需要实时更新数据或者根据用户操作获取新的信息。`Ext.Ajax`或`Store`的远程代理可以实现这一...
- **树形面板(Tree Panel)**:用于展示具有层次结构的数据。 - **选项卡面板(Tab Panel)**:包含多个可切换的页面。 3. **特殊控件**: - **日历选择器(Calendar Picker)**:供用户选择日期。 - **颜色...
`ext-base.js`是Ext JS的基础文件,包含框架的基本结构和核心功能,如类系统、事件系统和DOM操作。在一些情况下,如果项目对加载速度有较高要求,可以先加载`ext-base.js`,然后再按需加载其他组件,以实现按需加载...
### Ext JS框架 经验之作2000页 #### 概述 本文档旨在提供一个全面且深入的指南,帮助读者理解并掌握Ext JS框架的各个方面。Ext JS是一款非常强大的JavaScript库,用于构建交互式的Web应用程序。它以其丰富的组件库...
EXT MVC 是 Sencha Ext JS 框架的一个关键特性,它是基于模型-视图-控制器(Model-View-Controller)设计模式的应用开发架构。这个模式将应用程序的不同部分分离,使得代码更易于管理和维护。在“Ext MVC 项目示例”...
Ext4 是一个基于 JavaScript 的富客户端应用框架,主要用于构建复杂的 Web 应用程序。它提供了丰富的组件库,包括表格、面板、菜单等,使得开发者能够创建功能强大的交互式用户界面。`Ext.Loader` 是 Ext4 中的一个...
5. **tree**: 这可能是另一种Ext JS组件——TreePanel,通常用于显示层次结构数据,但在这个上下文中,可能与Combobox的动态更新功能有关,例如,可能通过树形结构来控制Combobox的选项。 综上所述,这个示例可能是...
为了解决这些问题,各种JavaScript框架应运而生,其中Ext JS因其强大的功能和易用性成为了众多开发者的选择之一。 **学习资料来源:** 本篇内容基于一位经验丰富的开发者分享的学习资料——《Ext JS 6 By Example》...
本项目基于Ext框架,一个强大的JavaScript UI库,为构建用户界面提供了一系列丰富的组件和工具。ExtJS以其灵活性、可定制性和高性能,成为构建Web应用程序的理想选择。 一、Ext框架简介 ExtJS是一个开源的...
学习 EXTJS 的第一步通常是创建一个简单的页面,引入 EXTJS 的库文件,然后利用 `Ext.application` 方法初始化应用程序。这将加载配置和启动主程序。 4. **Element:Ext 的核心**: `Element` 是 EXTJS 中处理 ...
EXT测试小样例通常指的是基于EXT JS框架进行的软件测试示例。EXT JS是一个用于构建富客户端Web应用程序的JavaScript库,特别适用于创建数据驱动、交互性强的用户界面。EXT Grid是EXT JS中的一个核心组件,它提供了一...
9.8.2 在单页面应用中使用卡片布局实现“页面”切换 / 496 9.9 本章小结 / 498 第10章 重构后的grid / 500 10.1 grid的基类及其构成 / 500 10.1.1 概述 / 500 10.1.2 表格面板的运行流程:ext.panel.table / ...
4. **控件和布局**:在Ext JS中,布局管理是用来控制组件在页面上如何展现的,本章将重点介绍各种布局管理器和标准的用户界面控件,以及如何将它们组合使用来创建复杂的用户界面。 5. **处理数据**:本章涉及到数据...
在EXT JS这个强大的JavaScript框架中,"EXt 可编辑的grid"是一个常见的应用场景,它允许用户在数据网格中直接编辑单元格内的数据。EXT JS的CellEditing插件是实现这一功能的关键,它提供了优雅的方式来处理表格数据...
EXT 是一个基于 JavaScript 的前端开发框架,主要用于构建富互联网应用程序(Rich Internet Applications,RIA)。EXT 提供了丰富的组件库,包括表格、面板、菜单、工具栏等,使得开发者能够创建功能强大、用户界面...