- 浏览: 340274 次
- 性别:
- 来自: 广州
文章分类
最新评论
http://www.cnblogs.com/luyingxue/archive/2011/05/22/2053318.html
ExtJS4中支持组件化编程和Direct,官方实例中分别提供了两种技术的示例,但没有两种方式结合的例子,经多次测试,由于4.0中存在的bug(暂时这么认为,也许是我水平烂),两种方式结合会产生一系列问题,在静态加载、动态加载、Direct结合的过程中(尤其是采用Direct的时候,用url不会出错),经常性的报错。
官方论坛也没有相关资料,中文也没找到。
分析2天源代码+调试+测试各种结合方式(new/define/create/各参数调节),终于找到一个稳定运行的实现方式,也很好的体现了面向对象及组件化编程的思想。示例如下,相关解释卸载注释中,注意此示例必须结合ExtJS4运行。
代码如下:
1、html页(关键部分代码)
1 <!--加载ExtJS的CSS和js,也可以只加载核心包,然后按照提示加载需要的js(未测试)--> 2 <!--其他js全部使用动态加载,在head部分不需要引用js--> 3 <link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css" /> 4 <link rel="stylesheet" type="text/css" href="css/application.css" /> 5 <script src="ext/ext-all.js" type="text/javascript"></script> 6 <script src="ext/ext-lang-zh_CN.js" type="text/javascript"></script> 7 <!--本例中使用.Net,此处加载Direct的Api--> 8 <script src="Api.ashx" type="text/javascript"></script> 9 <script type="text/javascript"> 10 //以下设置必须在Ext.onReady之前 11 //动态配置打开 12 Ext.Loader.setConfig({enabled: true}); 13 //设置组件路径 14 Ext.Loader.setPath('App', 'js'); 15 //加载MainViewport组件,注意MainViewport里面需要的js不需要在此加载,在MainViewport的define中用requires参数定义就可以,其他组件类似 16 //每种组件只需要考虑自己的require即可 17 Ext.require([ 18 'App.MainViewport' 19 ]); 20 //加入Direct的Provider 21 Ext.direct.Manager.addProvider(Ext.app.USER_API); 22 Ext.onReady(function () { 23 Ext.QuickTips.init(); 24 Ext.state.Manager.setProvider(Ext.create('Ext.state.CookieProvider')); 25 //舍弃new函数,改用Ext.create 26 Ext.create(App.MainViewport); 27 setTimeout(function () { 28 Ext.get('loading').remove(); 29 Ext.get('loading-mask').fadeOut({ remove: true }); 30 Ext.getCmp('MainLicense').collapse(); 31 }, 250); 32 }); 33 </script>
2、MainViewport.js(定义App.MainViewport类,由于指定了路径,这个js文件必须放在js目录下,而且文件名称必须是MainViewport.js,否则无法加载)
1 //组件名称、js路径、js文件名必须匹配 2 Ext.define('App.MainViewport',{ 3 //加载MainViewport内的各组件 4 requires:['App.MainFunctionPanel','App.Banner','App.Licence'], 5 extend:'Ext.Viewport', 6 layout: 'border', 7 items: [ 8 //使用xtype定义items,利用id和Ext.getCmp获取相应的对象,或者通过itemId和getComponent()获取对象,注意scope的不同 9 {xtype: 'Banner',itemId: 'MainBanner',region: 'north',margins: '0 0 0 5'}, 10 {xtype: 'Licence',id: 'MainLicense',region: 'south',margins: '0 0 0 0',contentEl: 'south'}, 11 {xtype:'MainFunctionPanel',region: 'west'}, 12 //也可以使用Ext.create创建对象,但不要使用new 13 Ext.create('Ext.tab.Panel', { 14 region: 'center', 15 id:'mainTabPanel', 16 deferredRender: false, 17 activeTab: 0, 18 items: [{ 19 id:'mainFilePanel', 20 title: '文件浏览', 21 autoScroll: true, 22 listeners: { 23 activate: function () { Ext.getCmp('mainFunctionFile').expand() } 24 } 25 },{ 26 id:'mainSearchPanel', 27 title: '文件查找', 28 autoScroll: true, 29 listeners: { 30 activate: function () { Ext.getCmp('mainFunctionSearch').expand() } 31 } 32 }] 33 })] 34 });
3、App.MainFunctionPanel类,放置的位置参照以上
1 //MainFunctionPanel类,继承Ext.Panel 2 Ext.define('App.MainFunctionPanel',{ 3 extend:'Ext.Panel', 4 requires:'App.MainFunctionTree', 5 alias:'widget.MainFunctionPanel', 6 title: '功能选择', 7 split: true, 8 width: 200, 9 minWidth: 175, 10 maxWidth: 400, 11 collapsible: true, 12 animCollapse: true, 13 margins: '0 0 0 5', 14 layout: 'accordion', 15 items: [ 16 { 17 xtype:'FunctionTree', 18 title: '文件浏览', 19 id:'mainFunctionFile', 20 iconCls: 'nav', // see the HEAD section for style used 21 listeners: { 22 //beforerender: function () { alert('beforerender'); }, 23 //beforecollapse: function () { alert('beforecollapse'); }, 24 //beforeexpand: function () { alert('beforeexpand'); }, 25 expand: function () { Ext.getCmp('mainTabPanel').setActiveTab(Ext.getCmp('mainFilePanel')); } 26 } 27 }, { 28 title: '文件查找', 29 id:'mainFunctionSearch', 30 html: '<p>Some settings in here.</p>', 31 iconCls: 'settings', 32 listeners: { 33 //beforerender: function () { alert('beforerender'); }, 34 //beforecollapse: function () { alert('beforecollapse'); }, 35 //beforeexpand: function () { alert('beforeexpand'); }, 36 expand: function () { Ext.getCmp('mainTabPanel').setActiveTab(Ext.getCmp('mainSearchPanel')); } 37 } 38 }, { 39 title: '系统管理', 40 id:'mainFunctionAdmin', 41 html: '<p>Some info in here.</p>', 42 iconCls: 'info', 43 listeners: { 44 //beforerender: function () { alert('beforerender'); }, 45 //beforecollapse: function () { alert('beforecollapse'); }, 46 //beforeexpand: function () { alert('beforeexpand'); }, 47 expand: function () { Ext.MessageBox.alert('消息', '系统管理展开了!'); } 48 } 49 }] 50 });
4、App.MainFunctionTree
1 Ext.define('FunctionTreeStore', { 2 extend: 'Ext.data.TreeStore', 3 autoLoad: true, 4 proxy:{ 5 type: 'direct', 6 //设置Direct服务函数 7 directFn: MyApp.TestAction.getTree, 8 paramOrder: ['node'] 9 }, 10 root:{ 11 expanded : true 12 } 13 }); 14 Ext.define('App.MainFunctionTree',{ 15 extend:'Ext.tree.Panel', 16 alias:'widget.FunctionTree', 17 store: Ext.create('FunctionTreeStore'), 18 height: 350, 19 width: 600, 20 rootVisible: false 21 22 });
服务器Direct照以往的写就ok,利用DirectHandler.Configure(DirectProvider provider, IEnumerable<object> items)加载相应的服务Class
5、Api.ashx
1 <%@ WebHandler Language="C#" Class="Api" %> 2 3 using System; 4 using System.Collections.Generic; 5 using System.Linq; 6 using System.Web; 7 using Ext.Direct; 8 9 public class Api : DirectHandler 10 { 11 12 public override string ProviderName 13 { 14 get 15 { 16 return "Ext.app.USER_API"; 17 } 18 } 19 20 public override string Namespace 21 { 22 get 23 { 24 return "MyApp"; 25 } 26 } 27 28 protected override void ConfigureProvider(DirectProvider provider) 29 { 30 this.Configure(provider, new object[] { new CheckLogin(),new TestAction() }); 31 } 32 33 }
6、随手写的生成树状图的cs,怎一个烂字了得……
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using Ext.Direct; 6 using Newtonsoft.Json; 7 using Newtonsoft.Json.Linq; 8 using System.Web.SessionState; 9 using System.Web.Security; 10 11 /// <summary> 12 ///CheckLogin 的摘要说明 13 /// </summary> 14 [DirectAction] 15 public class TestAction 16 { 17 18 [DirectMethod] 19 public JArray getTree(string id) 20 { 21 JArray data = new JArray(); 22 23 data.Add(new JObject( 24 new JProperty("id", id+id), 25 new JProperty("text", "tes"), 26 new JProperty("leaf", false) 27 )); 28 29 30 return data; 31 } 32 }
发表评论
-
EasyUI和EasyUI桌面App
2013-04-15 11:56 1196http://fxz-2008.iteye.com/blog/ ... -
Jquery进度条
2013-04-12 09:08 870http://www.cnblogs.com/lhb25/ h ... -
11个适合触摸事件开发的JavaScript库
2013-04-10 09:23 812http://www.codecto.com/2012/08/ ... -
Jquery插件
2013-03-22 18:33 785http://www.cnblogs.com/ywqu/arc ... -
宝贝鱼
2013-03-18 23:54 687http://code.google.com/p/cshbbr ... -
HTML&JS MVC
2013-03-15 16:27 621http://www.bootcss.com/ http:// ... -
浏览器内核及Js引擎介绍
2013-03-15 16:18 741http://wenku.baidu.com/view/623 ... -
EXTJS Demo
2013-03-12 17:19 791http://web230531.host89.chinajs ... -
网站架构和两个3d技术
2013-01-17 16:52 0http://blog.csdn.net/lovingprin ... -
DWR数据反推实例
2013-01-16 16:42 1419http://blog.sina.com.cn/s/blog_ ... -
javascript调用服务端方法
2012-12-17 22:03 939http://www.php100.com/html/webk ... -
DWR推送技术
2012-12-13 16:13 10638DWR2.x的推技术也叫DWR Reverse Ajax(逆向 ... -
wireshark 协议过滤
2012-10-09 11:32 1633http://blog.csdn.net/cumirror/a ... -
一个很不错的Javascript绘图库
2012-09-27 17:18 0http://www.jgraph.com/ http://w ... -
dwr推送数据
2012-09-21 16:59 0Dwr数据推技术:http://blog.csdn.net/k ... -
Extjs4 Css美工相关
2012-09-03 10:39 2988转: http://www.sencha.com/lear ... -
Extjs下拉树组件
2012-09-03 09:40 976转: http://www.2cto.com/kf/20120 ... -
Javascript基础一(apply, call, arguments, prototype)
2012-08-22 22:42 1074//javascript: apply, call, argu ... -
Extjs4的事件实例
2012-08-09 09:11 808http://www.cnblogs.com/luluping ... -
EXTJS中的Store是如何工作的
2012-08-08 21:04 964http://idoa3l3x.blogbus.com/log ...
相关推荐
ExtJS4的发布引入了一些新的编程模式和最佳实践,包括组件化编程、动态加载、面向对象设计以及Direct数据交互模式。 在ExtJS4之前的版本中,对象的实例化通常依赖于new关键字或者Ext.create方法。这种做法要求在...
在EXTJS 4.x框架中,`tabpanel`是用于创建多标签界面的组件,它可以方便地组织和切换多个视图。动态加载panel和HTML到tabpanel是提高应用性能和用户体验的有效方式,因为它允许按需加载内容,减少初始页面加载时间。...
动态加载菜单是ExtJS中的一个关键特性,它允许在用户交互过程中动态地创建、修改和加载菜单项,提供了更灵活的用户界面设计。在“Extjs动态加载菜单”这个主题中,我们将深入探讨这一功能的实现方式以及相关技术。 ...
总结,使用ExtJS结合AJAX和JSON数据格式,可以构建出动态异步加载的树形组件。这种方式既节省了网络资源,又保证了用户界面的流畅性。在实际开发中,可以根据项目需求进一步定制树的样式、交互以及数据处理逻辑。
标题“Extjs 动态加载树”涉及到的是一个前端开发技术话题,主要集中在使用Extjs框架构建能够动态加载数据的树形结构。Extjs是一个基于JavaScript的组件化UI库,常用于开发富客户端应用。动态加载树(Dynamic ...
根据提供的文件信息,可以看出主题是关于ExtJS框架与面向对象编程的实现方式。然而,由于提供的部分内容似乎并不完整且存在一些非标准字符,这给直接提取有用信息带来了困难。因此,我们将基于标题、描述和标签中的...
demo描述: 1. 页面主框架是左是一个tree,...2. 左边的树是加载主页面的时候动态生成 3. 点击左边的树的节点动态加载controller生成一个table 注:需要自己导入Extjs 4.2.x 的文件,该demo是用Extjs 4.2.1 写的
在实际项目中,结合`jq`库(可能是jQuery的简写),可以方便地处理DOM操作,与EXTJS的组件交互,进一步增强动态加载的效果,比如添加动态加载的动画、错误处理等。 总结来说,`Ext.Panel`和`TreePanel`在EXTJS中是...
在JSP中,我们可以使用Ajax技术与ExtJS交互,实现异步数据加载和动态更新界面。 在使用ExtJS 3.1组件时,首先要了解其组件体系结构。例如,`Panel`是最基本的容器,可以包含其他组件;`Form`组件用于创建表单,包括...
通过深入学习并实践EXTJS的图形编程,开发者能够构建出具有专业级图形展示能力的Web应用,为用户提供直观、交互性强的数据分析工具。在实际项目中,结合EXTJS的图形组件,我们可以实现复杂的业务逻辑,提高工作效率...
在ExtJS中,树形(Tree)组件是一种用于展示层级数据的强大工具,它允许用户以树状结构浏览和操作数据。...开发这样的组件需要深入理解ExtJS的架构和API,并具备良好的编程实践,以确保扩展的稳定性和可维护性。
4. **组件样式调整**:扁平化设计强调平面和简洁,因此需要调整ExtJS组件的样式,比如按钮、面板和工具栏等。去除多余的3D效果,统一颜色调,并减少边框和间距,使得组件更加紧凑。 5. **响应式布局**:扁平化设计...
EXTJS 是一个基于 JavaScript 的富客户端框架,它提供了强大的组件模型和面向对象的编程方式,使得开发者能够构建复杂的 Web 应用程序。面向对象编程(Object-Oriented Programming, OOP)是EXTJS的核心特性之一,...
ExtJS4是一款强大的JavaScript框架,用于构建富...通过这样的方式,我们可以构建一个动态、高效的ExtJS4树结构,仅在需要时加载数据,提升用户体验。同时,这种方式也使得开发者能够更好地控制数据流,降低服务器压力。
### ExtJS 组件扩展知识点详解 #### 一、ExtJS组件扩展概述 ExtJS是一款基于JavaScript的开源前端框架,主要用于构建...通过避免常见的错误,合理规划组件扩展的层次,并遵循最佳实践,可以有效促进项目的成功实施。
在ExtJS 4.2中实现左菜单的动态加载功能是一项常见的需求,特别是对于大型应用,它能够根据用户的需求按需加载菜单项,从而减少初次加载时的数据量和提升用户体验。 **MVC模式** 1. **Model**:模型层,负责处理...
ExtJS4是一款强大的JavaScript前端框架,它提供了丰富的组件和功能,用于构建富互联网应用程序(RIA)。在开发过程中,为了满足全球用户的使用需求,本地化(Localization,简称L10n)是一个重要的环节。本地化允许...
动态树加载菜单是 ExtJS 中一种常见且实用的功能,它允许用户在需要时按需加载树节点,从而提高应用性能,减少初次加载时的数据量。 动态树加载,也称为懒加载或按需加载,是指在用户滚动、展开节点或执行其他操作...