`

ExtJS 4 组件化编程,动态加载,面向对象,Direct结合成功,目前为止我的最佳实践

 
阅读更多

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 }
分享到:
评论

相关推荐

    ExtJS4 组件化编程,动态加载,面向对象,Direct

    ExtJS4的发布引入了一些新的编程模式和最佳实践,包括组件化编程、动态加载、面向对象设计以及Direct数据交互模式。 在ExtJS4之前的版本中,对象的实例化通常依赖于new关键字或者Ext.create方法。这种做法要求在...

    extjs4.x tabpanel 动态加载panel和html例子

    在EXTJS 4.x框架中,`tabpanel`是用于创建多标签界面的组件,它可以方便地组织和切换多个视图。动态加载panel和HTML到tabpanel是提高应用性能和用户体验的有效方式,因为它允许按需加载内容,减少初始页面加载时间。...

    Extjs动态加载菜单

    动态加载菜单是ExtJS中的一个关键特性,它允许在用户交互过程中动态地创建、修改和加载菜单项,提供了更灵活的用户界面设计。在“Extjs动态加载菜单”这个主题中,我们将深入探讨这一功能的实现方式以及相关技术。 ...

    ExtJS构造动态异步加载

    总结,使用ExtJS结合AJAX和JSON数据格式,可以构建出动态异步加载的树形组件。这种方式既节省了网络资源,又保证了用户界面的流畅性。在实际开发中,可以根据项目需求进一步定制树的样式、交互以及数据处理逻辑。

    Extjs 动态加载树

    标题“Extjs 动态加载树”涉及到的是一个前端开发技术话题,主要集中在使用Extjs框架构建能够动态加载数据的树形结构。Extjs是一个基于JavaScript的组件化UI库,常用于开发富客户端应用。动态加载树(Dynamic ...

    ExtJS对几种面向对象体现.txt

    根据提供的文件信息,可以看出主题是关于ExtJS框架与面向对象编程的实现方式。然而,由于提供的部分内容似乎并不完整且存在一些非标准字符,这给直接提取有用信息带来了困难。因此,我们将基于标题、描述和标签中的...

    Extjs 4.2.x MVC 动态加载 controller demo

    demo描述: 1. 页面主框架是左是一个tree,...2. 左边的树是加载主页面的时候动态生成 3. 点击左边的树的节点动态加载controller生成一个table 注:需要自己导入Extjs 4.2.x 的文件,该demo是用Extjs 4.2.1 写的

    extjs中Ext.Panel和TreePanel 组件动态加载本地页面数据

    在实际项目中,结合`jq`库(可能是jQuery的简写),可以方便地处理DOM操作,与EXTJS的组件交互,进一步增强动态加载的效果,比如添加动态加载的动画、错误处理等。 总结来说,`Ext.Panel`和`TreePanel`在EXTJS中是...

    extjs 3.1 组件 使用

    在JSP中,我们可以使用Ajax技术与ExtJS交互,实现异步数据加载和动态更新界面。 在使用ExtJS 3.1组件时,首先要了解其组件体系结构。例如,`Panel`是最基本的容器,可以包含其他组件;`Form`组件用于创建表单,包括...

    EXTjs图开编程EXTJS

    通过深入学习并实践EXTJS的图形编程,开发者能够构建出具有专业级图形展示能力的Web应用,为用户提供直观、交互性强的数据分析工具。在实际项目中,结合EXTJS的图形组件,我们可以实现复杂的业务逻辑,提高工作效率...

    Extjs树分页组件扩展

    在ExtJS中,树形(Tree)组件是一种用于展示层级数据的强大工具,它允许用户以树状结构浏览和操作数据。...开发这样的组件需要深入理解ExtJS的架构和API,并具备良好的编程实践,以确保扩展的稳定性和可维护性。

    extjs4扁平化设计

    4. **组件样式调整**:扁平化设计强调平面和简洁,因此需要调整ExtJS组件的样式,比如按钮、面板和工具栏等。去除多余的3D效果,统一颜色调,并减少边框和间距,使得组件更加紧凑。 5. **响应式布局**:扁平化设计...

    ext面向对象编程教程

    EXTJS 是一个基于 JavaScript 的富客户端框架,它提供了强大的组件模型和面向对象的编程方式,使得开发者能够构建复杂的 Web 应用程序。面向对象编程(Object-Oriented Programming, OOP)是EXTJS的核心特性之一,...

    Extjs4树结构异步加载

    ExtJS4是一款强大的JavaScript框架,用于构建富...通过这样的方式,我们可以构建一个动态、高效的ExtJS4树结构,仅在需要时加载数据,提升用户体验。同时,这种方式也使得开发者能够更好地控制数据流,降低服务器压力。

    ExtJS 组件扩展

    ### ExtJS 组件扩展知识点详解 #### 一、ExtJS组件扩展概述 ExtJS是一款基于JavaScript的开源前端框架,主要用于构建...通过避免常见的错误,合理规划组件扩展的层次,并遵循最佳实践,可以有效促进项目的成功实施。

    Extjs4.2 MVC 左菜单动态加载功能

    在ExtJS 4.2中实现左菜单的动态加载功能是一项常见的需求,特别是对于大型应用,它能够根据用户的需求按需加载菜单项,从而减少初次加载时的数据量和提升用户体验。 **MVC模式** 1. **Model**:模型层,负责处理...

    ExtJs4本地化

    ExtJS4是一款强大的JavaScript前端框架,它提供了丰富的组件和功能,用于构建富互联网应用程序(RIA)。在开发过程中,为了满足全球用户的使用需求,本地化(Localization,简称L10n)是一个重要的环节。本地化允许...

    extjs实现动态树加载菜单

    动态树加载菜单是 ExtJS 中一种常见且实用的功能,它允许用户在需要时按需加载树节点,从而提高应用性能,减少初次加载时的数据量。 动态树加载,也称为懒加载或按需加载,是指在用户滚动、展开节点或执行其他操作...

Global site tag (gtag.js) - Google Analytics